Upgrade to Pro — share decks privately, control downloads, hide ads and more …

fs2-io を試してたらバグを見つけて直した話

Chen
December 13, 2024

fs2-io を試してたらバグを見つけて直した話

Chen

December 13, 2024
Tweet

More Decks by Chen

Other Decks in Programming

Transcript

  1. 君だれ? 通称 : ちぇん Twitter : @Chen__TS GitHub : @ChenCMD

    趣味 : プログラミング お仕事: バックエンドエンジニア ハイトラフィックを捌くサービス を主に Scala で運用保守する人
  2. fs2-io でスクリプトを作る fs2-io には Files というファイル IO を扱うモジュールがある 特定のファイルを読み込んで の関数でファイルの中身を行単位で読み込める

    def readUtf8Lines(path: Path): Stream[F, String] 別のファイルに書き込む の関数でファイルに行単位で書き込める def writeUtf8Lines(path: Path): Pipe[F, String, Nothing] 5/18
  3. fs2-io でスクリプトを作る fs2-io には Files というファイル IO を扱うモジュールがある 特定のファイルを読み込んで の関数でファイルの中身を行単位で読み込める

    def readUtf8Lines(path: Path): Stream[F, String] 別のファイルに書き込む の関数でファイルに行単位で書き込める def writeUtf8Lines(path: Path): Pipe[F, String, Nothing] 諸事情で writeUtf8Lines の実装では足りない部分があった 6/18
  4. じゃあコードを読んで自前で実装してみよう writeUtf8Lines のコードは のような感じ def writeUtf8Lines(path: Path, flags: Flags): Pipe[F,

    String, Nothing] = in => in.pull.uncons .flatMap { case Some(_) => in.intersperse(lineSeparator).append(Stream[F, String](lineSeparator)).underlying case None => Pull.done } .stream .through(writeUtf8(path, flags)) 7/18
  5. 念の為検証してみる 「でもユーザー数も多いライブラリだし、まさかなぁ」 念の為、ざっくり Minimum な検証用コードを書いて検証してみる @main def main: Unit =

    { val program = Stream .eval(IO { println("side-effect 1"); "out1" }) .append(Stream.eval(IO { println("side-effect 2"); "out2" })) .through(Files.forIO.writeUtf8Lines(Path("text.txt"))) .compile .drain program.unsafeRunSync() } 9/18
  6. れっつ修正 - バグ修正 テストを commit / push して CI に落ちることを確認したあと、バグ修正

    を行った 実際の修正内容は説明するとそれだけで 5 分以上かかるので省略 今回の場合 30 分程度で修正出来た 14/18