scala

Scala 3でcase classのcompanionがFunctionNを継承しなくなっていて互換がないことへの対策

数日前の記事と、対になる(?)もの xuwei-k.hatenablog.com

Scala 2と3でcase classのコンパニオンのunapply(Tupleへの変換)が互換がないことの解決案

まずは以下をご覧ください github.com

2021年5月時点のScala 3.0.0と2.13.5のコンパイル速度比較

結論: Scala 3.0.0はScala 2.13.5の半分以下(4割)の時間でコンパイル終わる!!! (scalazでのベンチマーク) 半年前のDotty 0.27の時点でやった方法とだいたい同じ方法で計測し直した結果です。

Google Cloud Functionsをunfiltered scalaで書く

Google Cloud Functionsに関しては詳しくないので、各自ググってください。 cloud.google.com 最近は、原理上、任意のJVM言語で書けるらしいです。 www.publickey1.jp 言いたいことを凝縮すると、以下の1 tweetなわけですが

packageとdirectoryに整合性がなかったら強制的にファイル移動するscalafixのrule作った

以前、チェックする君だけ作ったのですが、それを雑に改造して、強制移動する君に改良しました。 細かい部分が雑なので、読みにくいし、バグってる可能性もありますが、ご自由にお使いください。 既知の問題として、packageが2行にわかれて書かれていると、…

Scala 3のMatch Typesを使って型レベルsort

今までのScala 2だとAux Patternやimplicit色々使って書くようなやつが、3だとこうやって書けるよ、という話。 https://gist.github.com/xuwei-k/924c69482c972d7bac496922ed725f79 でもこれだと、型は生成出来ても、valueOfなどで実際の値が生成できないん…

Scala 3でマクロで特定のsealed trait, classを継承したobjectを全て取得する

というのを書いたので貼っておきます。 Listで返す版と、Tupleで返す版。 https://gist.github.com/xuwei-k/7c3f662a78fdd39ce00db43900470848 https://gist.github.com/xuwei-k/c798d8faa3f4f163be0aad150b327d07:

scala-stewardを独自に作ったGitHub App(bot)で動かす方法

結局、デフォルトのGITHUB_TOKENで別のGitHub Actions起動できない問題があるから使いづらい(実質、他のCI併用する場合じゃないと有用じゃない?)けど、これhttps://t.co/uo7COyP2xo本体に取り込まれてリリースされてた— Kenji Yoshida (@xuwei_k) 2020年11…

2020年11月現在のScala 3(Dotty)とScala 2のコンパイル速度比較

最初に結論 Scala 2.13.3 と 3.0.0-M2-bin-20201031-1ab76c1-NIGHTLY をscalaz最新版でベンチマークしたところ、 Scala 2.13.3は平均約57秒、Scala 3の最新版は平均約31秒で 約45%短縮!!! めでたいなぁ。 他の条件で計測した場合にどうなるのかわからない…

sbt 1.4のremote cacheを試してbug報告やpull reqした記録

だいぶ色々やっているので、とりあえず雑にまとめておく

sbt 1.4からのpipeline機能を試したら3割compile時間短縮された

3割というのは、もちろんprojectの構成だったり、計測方法やその他色々によるわけですが、とにかく自分が計測した場合には3割短縮されました。114秒が80秒になりました。

GitHub Actionsとscala-stewardを組み合わせてtokenやbot accountの用意すらせずにpull reqを送ってもらう方法

scala-stewardという、全自動でScala projectのlibrary update pull requestを送ってくれるやつが数年前からある https://github.com/scala-steward-org/scala-steward しばらくは、OSSなpublicなものは、普通、公式のリポジトリ一覧が書いてあるファイルに…

JDK14のRecordsに対するshapeless.Generic自動生成マクロを書いた

TODO: あとでLabelledGenericとかその他色々も作りたい LabelledGenericは実装した 実装が雑なので細かい部分バグがあるかもしれない ライブラリにしてpublishする・・・? リリースした

DottyのMatch Typeを使ってコンパイル時にFibonacciを計算する

見た目通りで、あまり難しくないので、特に説明することがない。 macroさえ使わずに書けますね。 shapelessにあったような色々な機能が標準で装備されています。 みなさん、Match Type使ってもっと複雑な色々な計算書いてみましょう。 ちなみに、この単純な…

Scala 2.13.4からのTASTy読み取り機能

というものが追加されるらしいです。

Scala 2.13で-Xsource:3を指定すると変更される挙動一覧

Scalaコンパイラには、ある程度最近のversionから -Xsource:バージョン という、少し将来のversionの挙動に近づけるオプションがあります。 Scala 2.13.3時点で -Xsource:3 を指定できるわけですが、その場合の挙動の変更一覧を、scala/scalaをgit grepして…

Throwableでtry catchしてしまっているのをNonFatalに書き換えるscalafixのrule

この程度の単純なものならば、正規表現の置換だけで可能な気がしますが、書いたので置いておきます。 NonFatalのimport加えるあたりは、そういう低レベルなやつでやると、適切な位置に追加するのは多少面倒かもしれないですね。 細かいところが多少雑なので…

sbt 1.3.0以降 % Test でライブラリ追加してもcompileの依存が変わる場合がある件

以下再現コード

ScalazをDotty対応した知見

少し前に、こっそりと、かなりひさしぶりな(互換壊す)メジャーリリース?となる、7.3.0 finalをリリースしたけど全然リリースノート書いたり宣伝もしていないScalazですが、 もう最近自分しか開発していない感があり、猫のほうが明らかに流行っています。 が…

JDK11でGraalを有効にするとScalaのコンパイルが13%くらい速くなった

Graalについて全然詳しくないので、Graal自体の説明はしません、というかできませんが、JDK10以降で -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler というオプションを付与すると有効にできるらしいですね。 というわけで、以下のような条件で計…

Scalaのcompiler pluginをCrossVersion.fullにするかCrossVersion.binaryにするか

昨日のwartremoverのやつの続き、というか、Scalaのcompiler pluginに関する別の話。 いきなり雑に説明に入りますが

wartremover-contribをどうやって依存させるかという問題

以前こういうのを書きましたが xuwei-k.hatenablog.com

CircleCIにおけるsbtプロジェクトの依存ライブラリの最適なキャッシュ方法の考察

CircleCIにおけるキャッシュの仕組みというか仕様は、他のCIサービスと比べると、少し変わった特徴がある気がします。 といっても、自分は他にはTravisCIくらいしか詳しくないので、実はCircleCIのように色々工夫している方がむしろ最近は主流な可能性もあり…

sbtにおけるテストの並列実行の設定詳細解説

いきなり本題というか、一番言いたいことを書くと、まず テストの fork の設定によってぜんぜん違う。 という点があまり知られていない気がします。 *1 というか、自分も今回調べるまで、微妙に古い知識のままで完璧に知らなかったので、今一度理解した現時…

wartremoverを使ってscalapbのapplyのデフォルト引数を禁止する

というのを作りました。 scalapbというのは、scala向けのprotocol buffersやgRPCのためのライブラリですが、protobufのmessageに対応するcase classのコンパニオンオブジェクトのapplyには、すべて(protobuf上のデフォルト値と同様の)デフォルト引数が設定さ…

scalapropsをdotty対応してみた知見

まだ継続してメンテナンスするかどうかわからないけど、以下のようなニュースが飛び込んで来たので、そろそろ試すか、と試した結果をメモ。 結果としては数十分から数時間書き換えた程度で、それなりに動きました。 最初scalazをやろうかとおもったけど、kin…

sbtで依存しているprojectのみにcleanなどの特定のタスクを実行する

以下のような質問を某所で受けたので 書きました gist.github.com 既にあるとか、もっといい感じに書ける、みたいなのがあればお知らせください。 ちなみに、デフォルトでは単体のprojectしかcleanしないのは、完全にsbt的には意図した挙動のはずです。 デフ…

sbtですべてのsub projectの特定のtaskを直列に実行するtaskを自動でつくる

要点をまとめると TaskではなくCommandでやってしまうなら少し簡単だが、(stateなどの他のkeyに依存して)taskからtaskを生成するには多少コツがいる(Def.taskDynを使う) なおかつ、sub projectの列挙を全自動でやりつつtaskを生成するのが多少コツがいる( Pr…

mockitoとscalatestについて

以下の投稿について、編集リクエストするレベルではないし、コメントするにも論点が多すぎてすごく長くなるため、別記事として自分のblogに書くことにしました qiita.com

scalafixのSymbol literal自動書き換えruleを作った

github.com