Channelスタイルの並行処理の記述を(もちろん型安全に)可能にするライブラリOxについて調べて試してみた。結論から言うと書き味がめちゃくちゃ良くて面白い。 ソースコードも置いておく。 github.com Ox Oxとは、sttpなどの開発でお馴染のSoftwareMillによって開発されているScala用の非同期ライブラリである。まだ非常に若く、活発に開発されている。 github.com Oxの特徴は、というか目的といっても差し支えないのだが、それはChannel指向の非同期処理、つまりGoroutineをScalaの上で実現している点だ。Goユーザならすぐに理解できるだろう。 百聞は一見に如かず。こんな感じのコードを書くことができる(v0.0.25時点)。 import ox.* import ox.channels.* import scala.concurrent.durat
おなじみの画像 JavaやScalaといったJVM言語のDockerイメージは、JVMを同梱しなければならない都合で肥大化しがちである。特に何もしなくても、例えば一般的なamazoncorretto:21のイメージサイズは217.7 MBもある。 hub.docker.com これにさらにビルド済みのJARファイルが載ってくるので、結構大きくなってしまうのだ。 そこで、Scalaのコンテナイメージのサイズをなんとか小さくできないかと、考えた。すると、JVMを使ったまま70 MiBくらいに縮めることができた。 github.com コンテナイメージのサイズを小さくするために、何をしたかを書いていく。ちなみに題材としたアプリケーションはちょっとしたHello, Worldをするだけのもので、ライブラリはCatsに依存させた。 JVM使う編 マルチステージビルドを行う Alpineなどの軽量ラン
Scala 3におけるデータ指向プログラミング(以下DOP)について深掘りする。久々にScalaの話題を取り上げるが、これはScala Advent Calendar 2023の14日目の内容でもある。 早速だけど、DOPの基本原則は意外とシンプルだ。 コード(動作)をデータから切り離す データを汎用的なデータ構造で表現する データをイミュータブル(不変)として扱う データスキーマをデータ表現から切り離す イミュータブルなデータは採用することは多いと思うが、これをそのまま実践している人はどのくらいいるだろうか。Scalaではクラス中心の関数型プログラミングが主流だと思うし、私もそうしている。 DOPの詳細は下記の本(以下DOP本)を参照してほしい。 データ指向プログラミング 作者:Yehonathan Sharvit翔泳社Amazon ちなみに留意すべき点がある。DOP本とJavaのPro
また、Rust ではResult で失敗する関数や Option で None になる処理に ? をつけることで処理を short-circuit して抜け出せる. これは TypeScript や Kotlin の optional chaining を Result 型にも拡張したものとしてみることができる. Rust: Result の short-circuit pub fn f() -> Result<i32,String> { let str = may_fail_with_string()?; let i = str.parse::<i32>().map_err(|_| "error message".to_string())?; Ok(i) } fn may_fail_with_string() -> Result<String,String> { todo!() }
数ヶ月前に、playframeworkのScala 3対応版リリース記念にplay 2.9のマイルストーンでNetty backendで同じものを書いたのですが、 昨日書いたように予定通りplayframework 3.0のpekko対応の準備としてマイルストーン( 3.0.0-M1 )がリリースされたので、同じようなものを貼っておきます。 これで akkaの依存はゼロ (playframework関係なく現状必ずついてくる)Scala 2のscala-library以外はScala 2.13のjarの依存もゼロ という状態のはずです。 playframeworkは3からmavenのgroupIdが com.typesafe.play から org.playframework に変わっているので注意しましょう。 以前のplay 2.9のNetty版 https://gist.github.
Scala CLIにはJava Microbenchmark Harness (JMH)を使ったベンチマークを取るための機能がある。JMHでは、いくつかのアノテーションをつけてプログラムを起動することで、自動的にパラメータを調整したベンチマークを実行してくれる。ベンチマークはメソッド単位の小規模(Microbenchmarkの名前はここに由来する)で行なわれ、スループットなどを計算してくれる。 github.com この記事では、JMHを利用したベンチマーク作成の初歩と、これをScala CLIで実行する方法について説明する。 Scala CLI 今回利用したScala CLIのバージョンは以下の通り。 % scala-cli version Scala CLI version: 1.0.4 Scala version (default): 3.3.0 Scala CLIがインストールされ
Scala 3では、以下のように | というunion type?or type?という新しい仕様が追加されました。 (仕様というか、少なくとも以下の公式ドキュメントではunionと呼んでるが、Scala 3のquoteのAPI内部ではOrTypeでややこしい) https://docs.scala-lang.org/scala3/book/types-union.html Welcome to Scala 3.3.0-RC3 (11.0.18, Java OpenJDK 64-Bit Server VM). Type in expressions for evaluation. Or try :help. scala> List(2, "a") val res0: List[Int | String] = List(2, a) しかし、これをScala 2でおこなったら、当然以下のように
この記事は Scala Advent Calender 2022 20日目の記事です。 はじめに 言語サーバーを Scala で書きたいと思い立ったのですが、lsp4j 等のライブラリを使うと言語サーバーを動作させるために JVM が必要になってしまうため、JVM ではなく nodejs に依存する言語サーバーを Langoustine というライブラリを利用して書いた話です。 Langoustine で言語サーバーを作るにあたって Effect runtime として Cats Effect の IO を使用しています。 ご存知ない方でも雰囲気で読めるとは思いますが、ちょうど1週間前に Scala Advent Calender 2022 13日目の記事として Cats Effect 使ってみたという記事が上がっていますので読んでみると良いかも知れません。 クライアント側実装を含む完全な
この記事は Scala Advent Calendar 2022 の7日目が空いていたので、あとから投稿した記事です。アディショナルタイムみたいなものです。タイトルは釣りです(一応33倍速いという根拠はあとのほうに…) ときに2015年、Google のエンジニアらが Maven Central のミラーを公開しました(以下かんたんのため Google ミラーと呼びます)。Google ミラーの目的は、Maven Central 上にある Java や Scala のライブラリなどを、Google のインフラのパワーで高速にダウンロードできるようにすることで、開発者体験を向上するためでした。その後の数年で多少書き方に変化あったようですが、簡素なトップページで Maven でのグローバルな設定方法が掲載されています。 さて、Scala で主流のビルドシステム sbt のグローバルな設定方法に
突然ですが、皆さんsbtのchrome trace吐き出す機能使ってますか?大抵の人は使ってないというか、存在すら知らないと思います。 https://github.com/sbt/sbt/pull/4576 以前以下のあたりでも多少話を出しました https://xuwei-k.hatenablog.com/entry/2022/03/30/142529 さて、それを使ってsbtのbuildのsub project毎のcompile速度を眺めて、頭の中でDAGを描いてみたときに、稀に、 「testのためのユーティリティを参照させるために test->test を追加しているが、そのせいで遅い」 というパターンがあると思います。 ここに共感してもらわないと話が始まらないのですが、そこを詳しく説明すると長くなるので、多少、大雑把な説明で済ませますが、 https://github.com/x
追記(2023-04-04): Scala CLIを使いましょう Ammoniteをベースにより洗練されたScala CLIが開発され、Scalaのデファクトスタンダードとして定着しつつあります。公式にscalaと入力した際の標準アプリケーションとなることも予見されているため、こちらを学ぶとよいでしょう。 scala-cli.virtuslab.org tanishiking24.hatenablog.com zenn.dev Ammonite文法最速マスター この記事は、Scalaのスクリプティング環境でありREPLでもあるAmmoniteの基礎的な利用方法をマスターし、ちょっと凝ったシェルスクリプトをAmmoniteスクリプトに書き換えられる程度のAmmonite力を手に入れるためのものです。 追記(2023-04-04): Scala CLIを使いましょう Ammonite文法最速マ
さる8月1日、計算機科学の根幹を揺るがすドドスコ問題が出題され、エンジニアたちは震撼した(意味: 面白問題が出たので、なるべくヘンテコな解法を使って己の技巧を誇示するためにエンジニアたちは競ってコードを書きはじめた)。 【問題】配列{"ドド","スコ"}からランダムに要素を標準出力し続け、『その並びが「ドドスコスコスコ」を3回繰り返したもの』に一致したときに「ラブ注入♡」と標準出力して終了するプログラムを作成せよ(配点:5点)— ((🐑++)) (@Sheeeeepla) 2022年8月1日 そこで、関数型テクニックをなんとかねじこんだ解法を作ったのでここに示す。 import higherkindness.droste.Coalgebra import higherkindness.droste.data.list.{ListF, ConsF, NilF} import higherk
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く