たにしきんぐダム

プログラミングやったりゲームしてます

Essential Effects を読んで Cats Effect を勉強した

Scala Advent Calendar 2021 1日目の記事です。

scala-cli のこと書こうと思ったのですが、ちょっと時間なかったので読書記です!

essentialeffects.dev

typelevel.org

TL;DR

  • Essential Effects という本を読んで
  • Cats Effect という、ScalaIO とか parallel and concurrent なプログラムを勉強したよ
  • とてもわかり易かったのでおすすめです、あと猫がかわいい

The Effect Pattern

Essential Effect 1章の話のメモ

この本ではまず初めに IO モナドを使って副作用をラップしてやることのメリットの解説から始まります。本の中では、そのようなプログラムの方法を Effect Pattern と呼んでおり(多分この本でしか言ってない?)、その principal は

The type of the program should tell us what kind of effects the program will perform, in addition to the type of the value it will produce.

  • 例えば println は、標準出力に引数に与えた値を出力するという副作用を起こす関数だが、そのシグネチャAny => Unit みたいな感じ
    • これだけ見ると何か副作用が起こるかどうかは分からない
  • Any => IO[Unit] ならば、Anyを受け取って、何か動作を行って、その結果として Unit 型の値を返す。ということがシグネチャから分かる。
    • といってもIOだと何かが起こる(何が起こるかは分からん)ので情報量はあまりないように思う。
    • eff とか使うといろんな作用がシグネチャに現れて楽しい気がしますね

If the behavior we want relies upon some externally-visible side effect, we separate describing the effects we want to happen from actually making them happen. We can freely substitute the description of effects until the point we run them

  • 副作用が実際に起こるのを遅延させられる。これにより IO#unsafeRun を実行するまでは副作用が起きないということが分かる
  • 何が嬉しい?
    • compose した effect の実行時エラーハンドリングなんかを、effects の実行部分でまとめられるところとかなのだろうか?

また、本の中ではこれを満たしていたら Effect だ!というチェックリストが書かれており(これは一般的な認識なんだろうか?この本の著者がこう言ってるだけ?)

    1. Does the type of the program tell us
      1. what kind of effects the program will perform; and
      1. what type of value it will produce?
    1. When externally-visible side effects are required, is the effect description separate from the execution?

Scala の Future は - 1 は満たす (a. Future は非同期実行ですよ、b. Future[T] なら T を produce するよ) - しかし、2は満たさない。Future の body は externally-visible side effects だが、その中身は Future が construct されたら即座に実行されるので

ということで Future ではなく cats-effectIO が登場するのであった...

演習問題がたくさん

上に書いたことを読むと理論よりの本のように思えるかも知れないが、演習問題が豊富で例えば以下のようなことが手を動かしながら学ぶことができる

  • IO モナドを自作してみたり
  • Resources を使って外部リソースの auto closing や combine などを試してみたり
  • Deferred を使って同時に実行する複数のエフェクト間の協調について学んだり
  • 著者が Concurrent State Machines と読んでいるパターンを使って(状態が外部から見えない)countdown latchを作ってみたり
  • cats-effect の parMapN という複数のIOをconcurrentに実行するメソッドを step by step で実装することにより、 cats-effect の fiber の fork, join, cancel の挙動を理解するなど
  • 総復習として job queue を作ってみたり
/** - ia と ib の computation を "concurrent" に実行する 
  *  - each result を wait
  *  - ia か ib が fail した場合は他方を cancel
  *  - 2つの結果を f で combine
  */ 
def myParMapN[A, B, C](ia: IO[A], ib: IO[B])(f: (A, B) => C): IO[C] = ???

まとめ

非常に良い本なので cats-effect に限らず IO を使った並列並行処理について学んでみたい人は是非読んでみてください。

著者のEssentialEffectsに関する発表が以下のYoutubeから見れるので興味ある人は見てみてね。

youtu.be

GSoC 2021 に参加して Scala3 の開発環境を改善させてもらった

2021/06 から参加していた Google Summer of Code 無事修了しました。

GSoC では Add synthetics and symbol information for semanticdb in Scala 3 という題目で Scala3 の IDE や Linter のための基盤となる機能の開発をしていました。

今回の成果により Scala3 でも Metals (Scala の Language Server 実装) で go-to-implementation, show-inferred-types, show-implicit-arguments (& context-params) などなどの機能が使えるようになる予定です。

https://summerofcode.withgoogle.com/projects/#5527632738779136

採択されるまで

もともと趣味で土日の空いた時間に Metals の Scala3 サポートをちまちま進めていたのですが、せっかく学生なのだしGSoCを利用して数ヶ月の間フルタイムで Scala3 サポートの改善に取り組めないかと思い、GSoC で Scala の開発に取り組みたいと思い始めました。

Scala organization は 2018年までは GSoC に参加 していたのですが、残念ながらScala3の開発などで余力がなくここ数年の間はGSoCに参加していませんでした。

このままだと多分今年もScalaがGSoCに参加することはないなと思い、Metals の Scala3 サポートに取り組みたいんだけど GSoC 参加してくれたりしませんか?っていうことを Scala Center に対して問い合わせてみた。

contributors.scala-lang.org

すぐに前向きな返事が返ってきて、なんと3週間後にはGSoCに申し込みしたよとの連絡が!

本当にありがとうございます

すぐさま proposal を書き (今見ると結構ひどい...)

docs.google.com

応募したところ、これまでのScalaコミュニティへのOSSコントリビューションが評価されたのか無事採用されました。良かった。

期間中

全体のレポートはここにまとまています。

github.com

期間中は毎週金曜日にに30-40分ほどメンターと進捗確認と来週やること、提出したPRやissueについて Google meets で議論をする機会を頂いていました。メンターは主に二人で一人はポーランド(Krakow)、もうひとりはスイス(Lausanne)でふたりともUTC+02:00に住んでいて日本とは7時間の時差があったのですが、僕がわりと夜型だったこともあり特に問題なくスムーズにコミュニケーションをとることができました。(レビュアーの主な活動時間が日本時間での22:00-26:00とかだったので、その時間帯にレビューに返事するとほぼリアルタイムで議論で非同期コミュニケーションができて良い)

おわりに

GSoC の倍率は非常に高く、日本のアカデミックカレンダーでは授業期間とGSoC期間が丸かぶりしており参加のハードルが高いですが、著名なソフトウェアに対してある程度大規模の貢献をフルタイムで行える機会や、国内にいながら世界中のソフトウェアエンジニアと肩を並べて仕事をできる機会はなかなかなく、参加する価値は非常に大きいと思います。興味のある方は是非来年にでも申し込んでみてください。

GSoC 一般のことについては正直あまりアドバイスできないと思いますが、もし来年 Scala が GSoC に参加していて、Scala (の特に Tooling まわり) に対して貢献したいという方がいらっしゃれば是非Twitterか何かで声をかけてください。何かお手伝いできるかもしれません。

GSoCは終わってしまいましたが、scalameta や dotty や metals への貢献はこれからも続けて行く予定です。

ダメ元でGSoC参加したいな〜という話を投げた結果本当に参加できることになり本当に嬉しかったです、GSoC on Scala を実現してくれた皆さん本当にありがとうございました。 (日本語で書いても伝わらないけど...)

乞食

今後のOSS活動の活力になります。

www.amazon.jp

月報 2021/06

f:id:tanishiking24:20210628145130j:plain
東工大大岡山キャンパス

  • たまーに気分転換に大学図書館にチャリで行ったりしている。授業とか研究室のゼミとかは相変わらずオンライン、早くキャンパスライフってやつエンジョイしたい。
  • TaPL 15章読みました、次は23章だよ
  • 小森めとさんにはまってる
  • APEX いったんお休み
    • ここしばらく毎月100時間以上遊んでてちょっとまずいなと思ったので一旦距離を置くことにした、もうちょっと適度な距離感で遊びたい
  • Test to code traceability
    • 最近は Unit test を API code example として使えないかということに興味を持っていて、そのために必要となるテスト->実装の自動対応付けの論文を読み漁っていた
    • scrapbox.io
    • GSoC 終わったら手を動かし始められる状態になっていたい
    • 先行研究がだいたい Java のデータセットに対してやられているので、僕も Java のプログラム解析学ばないといけないんじゃないかと思っている。
  • CHI勉強会2021 | 2021年6月26日(土)、今年もオンライン開催!! で2本だけ論文紹介した(全部で1分)
  • たまに運動してる
    • ちょいちょいランニングしたりしてる、体動かしたほうが元気になる
  • GSoC

月報 2021/05

scrapbox.io

  • GSoC への proposal が accept されました Scala Center | Google Summer of Code、6月2週から約2ヶ月半はお金をいただきながらOSSやらせていただきます
  • TaPL だいぶ面白くなってきた、11章の後 subtyping とか recursive type からいきなり面白くなってきた感じがある
  • 大学の授業に時間かけすぎてる感じがある。
    • 英語の社会学っぽい授業が面白くて、systemic racism や education inequality and inequity とかにとても詳しくなった
    • 一方これに時間かけすぎてて研究とかの時間が疎かになってる
  • 月前半は研究のためのサーベイいろいろやってたけど月後半は微妙な感じ...
    • なんか疲れてて全然記憶がない日が多い
    • unit test をcode example として活用するために test case prioritization とか example-centric programming とか調べてた
    • Test case がどれだけ characterizing test としての性質を持っているかの良いメトリクスを定めることが重要な気がする
  • 授業料免除の2次書類提出
    • けっこう大変なんだけど、多分免除通らないだろうなぁ...(実際は大学入学によって収入が下がるので年間収入はかなり少ないが、直近3ヶ月は生活費のために多めに働いていたので見た目の年収が高い、これで免除通ってなかったら仕事しないほうが良かったみたいな話になって最悪なのでせめて半額免除は通ってほしい)
  • APEX やっとるな
    • ちょっと落ち着いてきた、少なくとも最近はソロランク回すみたいな気力がない

もう2ヶ月経ってしまったが何もできてないぞ...6月からはGSoCと研究に集中したい(ずっと言ってる)

2021/4

2021/4 から日記を箇条書きで書くようにしてみた、これ以上不可が大きいと続かないけど、これくらいならなんとか続いている

scrapbox.io

  • 大学院に入学したよ
  • 研究室のセミナーでTaPLの輪講してるよ、11章までやった
    • 証明などのが解がふわっとしてるところが議論によって固められるので体験が良い
    • 一方この手の証明とかやるの慣れてないので最初はかなり苦戦してた
  • 大学行く用事があるときに図書館行ったりしてる、東工大の図書館広いし、採光面積も広くて良い
  • GSoC の proposal 書いたよ
  • 授業を受けてるよ、結局このクォーターは (東工大はクォーター制)
  • こいつ毎日APEXやってるな
    • プラチナにはなりました
  • 各種事務手続きやった(偉い)
    • 授業料免除申請
    • 学生支援機構(第二種)申し込み
    • 学生支援機構在学猶予
    • いろいろ
  • 引き続きはてなでアルバイトしているよ
  • Webっぽいお勉強
    • OAuth / OIDC の仕組みの復習
    • Terraform

f:id:tanishiking24:20210430191750j:plain
夜の東工大附属図書館(雨)

今月は勉強はたっぷりできたものの、論文読みまくったり、OSSやったりする余裕がなかったのは良くなかった。頑張りましょう