scala

top levelのclass毎にfileを分割するscalafix

というのを作りました。

circeのsemiautoでEncoderとDecoderそれぞれ定義とCodecのみ定義でのcompile時間比較

最初に結論を書いておくと、Scala 2.13でもScala 3でも、Codec定義の方が少し速かったです。 以下、ベンチマーク用のコードや結果を雑に貼り付けていく

fthomas/refinedのScala 2 macroの更なる速度最適化

まずは以下の以前の記事を読んでおいてください xuwei-k.hatenablog.com さて、

scalafix ruleの作り方の例

https://discord.com/channels/1124331179580084406/1124334001507794994/1255004192993443910 ちょうどいい(?)ネタがあったので、これを例に作ってみます。 既にどこかに存在するのかどうか?は知りません。 (大抵、よほど複雑でなければ数分で書けるので、…

独自scalafixのruleを同じsbt project内部に置く際の設定方法

個人的に、すごい細かい使い捨て含めるとおそらくもう1000個くらいはrule書いたことあるので、おそらく現状では日本一scalafix rule書いていると思うのですが、 慣れるとそのくらい気軽に書けてすぐ役に立って便利なので、既存の他人が書いたruleを使うだけ…

特定の型の値を捨てていたら警告やエラーにするscalafixやwartremoverでのlinter

Scala標準に -Wvalue-discard などがありますが、自分が知る限り、これはすごく細かく制御できるわけではなく、全てを警告します。 $ scala -Wvalue-discard Welcome to Scala 2.13.14 (OpenJDK 64-Bit Server VM, Java 11.0.23). Type in expressions for e…

わざわざsbt-native-packager経由でdocker imageを作る唯一の大きな利点

みなさんはsbtで作ったものを、(単にライブラリとしてではなく全部まとめて)本番環境にデプロイしたりする場合、どういう形式にしてますか? 最近・・・でもないですが、このあたりの選択肢は色々あるというか、sbtやScalaに限らない話なので、 広く捉えれば…

json4sのScala 3対応やjson4sの内部アーキテクチャや歴史の簡単な解説

json4sという古代からあるScalaのjsonライブラリのメンテナンスをなぜか数年ずっとやっています。それの話をします。

テスト実行に時間がかかった順(遅かった順)で表示するsbt pluginを作った

以下のsbt plugin作った話をします。 github.com 数日前のScalaMatsuri 2024の自分の発表の中で以下のような記述がありましたが https://speakerdeck.com/xuwei_k/scalapuroziekutono-birudosu-du-gai-shan?slide=67

scalafmtとscalafixとwartremoverの使い分けフローチャート

細かいこと考慮すると、ものすごく色々あるのですが、大体の判断基準は、まずこうだと思われます。 scalafmt scalafix wartremover

ScalaMatsuri 2024でビルド速度の話をした

昔から色々関連することやっていたけれど、最近も特に色々やっていたので、今までの集大成な感じですね。 https://xuwei-k.github.io/slides/matsuri-2024/

GitHub ActionsのSummaryで直接すぐ見れる形式でsbtのtaskのchartを出す方法

OSSにしてpublishしようかと思っていたけど、細かい部分をいい感じにするのが面倒なので一旦雑に貼り付けておく (publishは後でやるかもしれない、未定) https://github.com/xuwei-k/scalaz/commit/06488c412b2fac78fe33739ae4f7abdfb5c49164 https://github…

1つのsbt projectでjavaagentの定義と利用をするsample。あるいはsbtのTests.Setupの代替案

JVMにはjavaagentという特別な仕組みがあるのを知ってますか? 自分が雑に思いついた具体例を書いておくと、例えばdatadogのtrace用のSDKがjavaagentで実装されてますね。 使用例は色々あるかもしれませんが、javaagentの例や、それの仕組みを詳細に解説する…

Scala 3のCapture Checkingでローンを確実に返済!

わざと怪しいタイトルにしてみましたが、こんにちは。 雑にググった限り、これを書いてる2024年5月現在、日本語でのScala 3のCapture Checkingの解説記事を見たことがない気がするので、 自分も1%くらいしか理解してない気がしますが、書いてみることにしま…

sbtで独自のprotobufのoptionを定義し独自のprotoc pluginでそれを処理するsample

これ qiita.com をsbtで1つのrepositoryで実行するsampleを作った、というだけの話。

sbtのtestGroupingを使った並列化や高速化手法の解説

以下の記事の続き的な意味があるので、まずはそちらを読んでください xuwei-k.hatenablog.com そちらの記事で、以下のようなコメントをもらっていましたが

ライブラリを使わずにScalaプログラム内部でclasspathなどを丸ごと引き継いで別のJVMを立ち上げるサンプル

そもそもがかなりレアケースなのですが、一応、稀にありえるシチュエーションとしては 特別な(微妙な)コードをテストしたい scala.sys.exit 自体を至る所で呼び出していて、本来それ自体を改善したいが、一旦それをそのままテストしたい mainスレッドが終わ…

scala.collection.concurrent.TrieMapが最低限消費するメモリ量はいくつか

scalametaのbug調査のついでのメモ。 github.com https://github.com/xuwei-k/scalameta-memory-issue-3650/commit/765dccba2154d1bf90d9c8281ec3e2b7aaa5fa04 30万行のScalaコードをscalametaでparseすると、そこには11億個のTrieMapが〜〜〜https://t.co/T…

IntelliJ IDEA上でTerminalからsbt立ち上げてerrorやwarn出た時にclickで飛べるようにする

IDEAのterminal(sbt pluginではない)、からsbtを起動してcompileなどすると、errorやwarning出た場合にそのpathがclick可能で、そうすると該当のsource codeに飛べて便利だったのだけど、いつの間にか不可能になってるんだけど、これどこかに設定あるのか、v…

Scala 3でAtomicIntegerFieldUpdater使うsample

Scala 2は無理だが3では @static が実装されてるので、Scala 3なら動く。それはそう

fthomas/refinedのScala 2 macroの独自typeの場合compile速度爆発問題

以下のライブラリの話をします。 github.com このライブラリの基本的な紹介はしません。ググるとか、流行のAIに聞く、などして調べてください。

Scala 2.12と3でSIP-23 Literal-based singleton typesの互換を頑張るいくつかの方法

もう9年以上前に以下のようなものを書きましたが、それに関連する話。 xuwei-k.hatenablog.com

依存ライブラリ使って一定以上大きめのsbt pluginを作る時のいい感じの方法

sbtや、sbt pluginというのは所詮ただのScalaプログラムなので、普通に依存ライブラリが使えて、普通にScalaというか任意のJVM言語で書けば、そのまま呼び出せます。 しかし、普通に書いて普通に呼び出すのは、いくつかデメリットがあり得るので、代替として…

CIで警告のdiffを出すsbt pluginでscalafix対応をした

以前作った以下のsbt pluginの0.2.0リリースしました。 github.com xuwei-k.hatenablog.com https://github.com/xuwei-k/sbt-warning-diff/commit/00f4ec112e3d641c1ba189ec2fe86aa6e4ac23cc

Scalaにおける細かいclassの定義方法とインスタンス毎のサイズ

問題です。 以下のA2, B2, B3は、細かい定義方法は違うけれど、実際にはほとんど同じ定義ですが、インスタンス毎のサイズ(アロケーションされるメモリの量)、としては、どれが一番効率がいいでしょうか?どれも同じでしょうか? この問題に完璧に答えられる…

Scala 3.4から新たに警告やエラーになる予定の記法を雑にまとめ

qiita.com これは Scala Advent Calendar 2023 の16日目です。 (あとから見たらこの日付が抜けていたので、あとから登録して埋めました) これ書いている2023年12月現在、(RCなどの安定版以外も含めると) 3.4.0-RC1が最新で、3.4.0のfinalは出ていませんが、3…

TeaVMのsbt pluginを作った 〜 酢豚とお茶の出合い 〜 ScalaからWebAssemblyへの変換

Twitterでは多少Tweetしてたのですが、やっとある程度形になったので、リリースしました。 以下、簡単な説明や、関連する余談など書いておきます https://github.com/sbt-teavm/sbt-teavm

Scala 3かつplayframework 3かつpekkoで動かすサンプル

数ヶ月前に、playframeworkのScala 3対応版リリース記念にplay 2.9のマイルストーンでNetty backendで同じものを書いたのですが、 昨日書いたように予定通りplayframework 3.0のpekko対応の準備としてマイルストーン( 3.0.0-M1 )がリリースされたので、同じ…

2023年10月時点のplayframeworkの今後の予定

すごく重要な予定が色々と決まりつつあるので、独断で勝手に?雑に?選んで紹介しておきます。 単なる翻訳というよりは、自分の感想や主観みたいなものが入ってます。 詳細な原文を知りたい人は、以下のあたりを読んでください https://github.com/playframe…

Eitherをmapするとの愚直にmatchするのはどちらか速い?調べてみました!

どの程度計測方法が正しいのか謎ですが、1〜2%程度matchの方が速い結果が出ました!!!