Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
fs2-io を試してたらバグを見つけて直した話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Chen
December 13, 2024
Programming
950
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
fs2-io を試してたらバグを見つけて直した話
Chen
December 13, 2024
More Decks by Chen
See All by Chen
不幸な GC
chencmd
0
1.1k
約 5 年のゲーム開発 ~リリースまでがこんなに大変でした~
chencmd
1
720
Scala におけるコンパイラエラーとの付き合い方
chencmd
2
1.7k
Language Server Protocol の歴史について (a.k.a. 考古学者になる方法)
chencmd
1
200
Other Decks in Programming
See All in Programming
Kotlinの15年とServer-Side Kotlin
n_takehata
1
180
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
180
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
520
ActionController meets Protocol Buffers
sorah
1
760
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
350
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
380
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
3
2.1k
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
120
[2026-10-09]一枚の布で作らなくてもいい。 信頼性は「パッチワーク」で紡がれる~既存の運用と新しい可能性をつなぎ合わせてきたCREの話~
tosite
0
120
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
400
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.5k
Event is what happens
moro
2
2.4k
Featured
See All Featured
Amusing Abliteration
ianozsvald
1
370
My Coaching Mixtape
mlcsv
0
370
Evolving SEO for Evolving Search Engines
ryanjones
0
340
Paper Plane (Part 1)
katiecoart
PRO
2
12k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Practical Orchestrator
shlominoach
192
12k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
Utilizing Notion as your number one productivity tool
mfonobong
4
630
Raft: Consensus for Rubyists
vanstee
143
7.8k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
620
Optimising Largest Contentful Paint
csswizardry
37
4k
Transcript
fs2-io を試してたらバグを見つけて直した話 by Chen (@Chen__TS) Scala わいわい勉強会 #4 / 2024-12-13
君だれ? 通称 : ちぇん Twitter : @Chen__TS GitHub : @ChenCMD
趣味 : プログラミング お仕事: バックエンドエンジニア ハイトラフィックを捌くサービス を主に Scala で運用保守する人
fs2-io って? fs2 というライブラリの一部 fs2-io ファイルやネットワークの操作を簡単に行える拡張 fs2 って? ストリーム処理のライブラリ データを少しずつ処理する仕組みを提供
大量のデータや非同期処理を効率よく安全に扱える 3/18
とある日の出来事・・・ 「fs2-io、業務で使えないかなぁ」 と思い、趣味の開発プロジェクトで使う スクリプトにお試し利用していた スクリプトはざっくり言うと みたいな処理 i. 特定のファイルを読み込んで ii. データを特定の規則に沿って加工して
iii. 別のファイルに書き込む 4/18
fs2-io でスクリプトを作る fs2-io には Files というファイル IO を扱うモジュールがある 特定のファイルを読み込んで の関数でファイルの中身を行単位で読み込める
def readUtf8Lines(path: Path): Stream[F, String] 別のファイルに書き込む の関数でファイルに行単位で書き込める def writeUtf8Lines(path: Path): Pipe[F, String, Nothing] 5/18
fs2-io でスクリプトを作る fs2-io には Files というファイル IO を扱うモジュールがある 特定のファイルを読み込んで の関数でファイルの中身を行単位で読み込める
def readUtf8Lines(path: Path): Stream[F, String] 別のファイルに書き込む の関数でファイルに行単位で書き込める def writeUtf8Lines(path: Path): Pipe[F, String, Nothing] 諸事情で writeUtf8Lines の実装では足りない部分があった 6/18
じゃあコードを読んで自前で実装してみよう 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
「これ、やっちゃダメな処理してね・・・?」 8/18
念の為検証してみる 「でもユーザー数も多いライブラリだし、まさかなぁ」 念の為、ざっくり 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
「バグった!!!!!!!」 10/18
バグを見つけた!! 念の為既知のバグかどうか を調べた が、特に見当たらない なので Issue を建てた 恥ずかしながら英語に めっぽう弱いので機械 翻訳を使った
最近の機械翻訳はまぁ まぁ伝わるので助かり ますね
「これ・・・私でも直せるんじゃね?」 12/18
れっつ修正 - テストを書く まずはテストを書いた テストを書くことで、バグの修正前と後で問題が起きなくなっていること を保証できる 将来的にバグが再発しないことも保証できる 大体の場合他のテストケースを参考にすると書きやすい 今回の場合は 10
分程度で書けた 13/18
れっつ修正 - バグ修正 テストを commit / push して CI に落ちることを確認したあと、バグ修正
を行った 実際の修正内容は説明するとそれだけで 5 分以上かかるので省略 今回の場合 30 分程度で修正出来た 14/18
れっつ修正 - バグ修正 修正内容 15/18
PR を作成する 修正が終わったので PR fs2 リポジトリには PR テ ンプレートが無かった ざっくりとバグ報告
Issue の番号と原因 を書いておいた というわけで出来た
まとめ みんなが使ってるようなライブラリにも案外バグがある 直感は大体当たる 違和感を感じたら検証してみるのがおすすめ Issue は大体の場合テンプレートに沿って書くだけで OK 最近の機械翻訳は程々に伝わるので英語が苦手でも大丈夫 行けそうだなと思ったら PR
も出してみるのがおすすめ 17/18
fs2-io を試してたらバグを見つけて直した話 by Chen (@Chen__TS) Twemoji : CreativeCommons-BY-4.0 Scala わいわい勉強会
#4 / 2024-12-13 18/18