Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

scala

sbtで衝突している依存性を検出するにはevictedを利用する

掲題の通り。evictedはプロジェクトの依存性を全て確認し、依存性が衝突していたりbinary incompatibleの可能性があるものを検出できる。 手元にあった古いプロジェクトで試してみた様子: % sbt > evicted [warn] Found version conflict(s) in library depe…

HNSWのビジュアライザを作成した

この記事ははてなエンジニアアドベントカレンダー2025の15日目の記事だ。遅くなってすみません。 qiita.com HNSWというデータ構造がある。 en.wikipedia.org このデータ構造は、あるクエリした点からの(近似的な)近傍のデータを求めるのに最適化されている…

Scalaのアーティファクトの公開を楽にするツールscala-pgp-bootstrapを作成した

Maven Centralへのアーティファクト登録の際に必要になるPGP鍵の生成と公開、そしてGitHub Actionsシークレットへの登録を同時にやってくれるツールとして、scala-pgp-bootstrapを書いた。 github.com 使い方は簡単で、Coursierを持っているならcs launch de…

mdocのCLI版コマンドをScala 3で動作させるにはcs launchを使うと便利

mdocというツールがある。 scalameta.org MarkdownにScalaのコードを書くと、自動的にこれをコンパイルして値が埋まった状態にしてくれるというもので、ドキュメンテーションに非常に便利だ。 例えば以下のようなコードスニペットがあるとする: ```scala mdo…

Goroutineよりも高級で、Async/Awaitほど世界を分断しない、Oxという選択肢

他の言語の非同期プリミティブと比べてもOxかなり良いな〜という記事です。 先日Ox v1.0.0がリリースされた。Oxはプログラミング言語Scalaの非同期処理ライブラリで、Java 21から搭載されたVirtual Threadの機能を活用して、非同期処理のための道具を使いや…

Scalambroll: Lambroll + Scala.js + Scala CLIでらくらくFaaSしよう

LambrollというOSSがある。 github.com AWS Lambdaのデプロイを簡単にしてくれるツールで、非常に使い勝手が良いので仕事で愛用している。 そんなLambrollと、同様に簡単にScalaを書けるようにしてくれるScala CLIとを組み合わせてみたらどうなるだろう、と…

ScalaのupickleでオプショナルなフィールドをパースするにはNone defautを設定しておくと良い

tl;dr deserialize serialize デフォルト値がある フィールドがない場合はデフォルト値にフォールバックする 値がデフォルトと同じならフィールドごと削除する デフォルト値がない フィールドがない場合は例外を投げる 値をセットする //> using dep com.lih…

ScalaのCirceでEnumをUntaggedなJSONにするためのエンコーダを定義する

生きているとEnumをJSONにしたり、JSONをEnumに戻したりしたくなることがある。エンジニアの仕事の半分はJSONという煮干しを作ったりそれを戻したりすることなので、もはや呼吸をするようにエンコードしたりデコードしたりする。ええ?YAMLがお好き?すみま…

Scala Nativeで実行ファイルのパスを得るには scalanative.runtime.filename

import scalanative.runtime.filename filename // => "./target/scala-3.3.6/foobar" いわゆる$0が得られる。 (環境 Scala Native 0.5.7)

Deno みたいに Scala を書く: Scala CLI 1.8.1 の using file ディレクティブの新機能

Scala CLI 1.8.1がしばらく前にリリースされていた。このリリースの主な変更は、using fileディレクティブで URL を展開する機能が利用できるようになったことだ。 github.com この記事ではこの機能について紹介する。 Scala CLI とは Scala CLI とはVirtusL…

Cyclic Barrierで安全なじゃんけんを実装する feat. Scala + Cats Effect

じゃんけんという遊びがある。 じゃんけんは、離散的に定義された三つの手(グー・チョキ・パー)の非推移的な優劣関係――グーはチョキに勝ち、チョキはパーに勝ち、パーはグーに勝つ――を用いて勝敗を決定する二人以上参加可能な競技的ゲームです。遊戯手順は…

Cats Effect 3でセマフォを使うときの便利なイディオム

Redditを見ていると便利そうな記事を発見した。 lukastymo.com この記事では、MutexやSemaphore、そしてCyclic Barrierの使い方について解説している。 セマフォとは同時に一定数のみがリソースにアクセスできるようにする、つまり「いくつまでなら同時に使…

ulimitに死す / ScalaのHTTPクライアントsttpではバックエンドを都度作らずに1つだけ作って使いまわしましょう

ここではsttp4前提で書くがsttp3でもたぶん同じ。 sttpについて説明しておくと、Scalaで利用できるHTTPクライアント実装で、操作体系がシンプルで簡単であり、なおかつ複数のバックエンド(JDK標準のクライアントを使うものとか、もっと並行性制御を強化され…

『はじめてのScala3』書評

この書評は、掲題書についての一個人の考えを述べ、改善に資せんとするものである。つまりここから先に書かれていることの冒頭には遍く「私見では」と見えない文字で書かれているということだ。 この本は初学者向けの教科書または副読書として不適切であり、…

Redacted: Scalaのcase classの特定のフィールドを隠すコンパイラプラグイン

Redditを見ていたところ面白いコンパイラプラグインを発見したので紹介する。 Redacted Redactedは、case classの特定のフィールドをtoString()から除外し、***で塗り潰して見えなくできるコンパイラプラグインだ。 polentino.github.io github.com Redacted…

Scalaの言語サーバMetalsがMCPに対応したのでRoo Codeで使ってみた / 型やシンボル情報をMCPが渡してくれる時代の到来

Scalaには言語サーバとしてMetalsというのがあり、LSPを喋ったりビルドサーバと協調してコンパイルを回したりしてくれる。 scalameta.org VSCodeでも使われる定番の言語サーバであり、Scala開発者の半分くらいはこれを使っているはず。ロゴがかわいい。 そん…

Scalaで変数に入った値そのものにパターンマッチさせるときは変数をバックティックで囲うとよい

Scalaのパターンマッチは変数を使って分割代入ができる。 val xs = 1 :: 2 :: 3 :: Nil xs match { case head :: tail => s"head is $head" // => "head is 1" case _ => "not found" } これはxsに対してまずhead :: tail という式にマッチが試みられ、head…

Scalaで特定の警告をエラーにするには -Wconf:msg=FOOBAR:error と書けばよいので non-exhaustive match だけエラーにできる

Scalaコンパイラは、特定の警告メッセージに対してad-hocに警告からエラーに昇格させ、コンパイルを失敗させることができる。 以下のscalac optionを設定することで non-exhaustive match だけエラーにできる: -Wconf:msg=match may not be exhaustive:error…

ScalaでSeq[A]にインデックスアクセスしてOption[A]を得るにはliftメソッドを呼ぶ

val xs = List(1, 2, 3, 4, 5, 6, 7, 8, 9) xs.lift(4) // => Some(5) xs.lift(42) // => None liftというのはある関数をOptionを返すように加工するようなときに使われる慣例的な名前で、今回は暗にapplyのことを指している。 www.scala-lang.org 元々lift…

Catsのtraverse_は要するに高カインドのforeach

Cats Effect をいじっていたら、foreach_というメソッドを見付けた。これはCats Effect独自のメソッドではなくて、Catsに用意されている。 これはほぼtraverseと同じだ: import cats.effect.IO import cats.syntax.all.* def message(who: String): IO[Strin…

Scalaの篩型ライブラリ Iron v3.0.0 がリリースされた / 構文がより簡潔になり、扱いやすく、強力に(ただし Scala 3.6.3 が必要)

Scala 3 には篩型(refinement types)を実現するためのライブラリであるIronが存在する。 blog.3qe.us このライブラリを使うと、非負整数とか、8桁の文字列とか、UUIDといった、元々の型に加えて制約を加えたものをそのまま型情報に載せて扱うことができる…

Scala Native 0.5.7 が出た -- バイナリの動的依存が大幅に削減

Scala Native 0.5.7がリリースされた。 github.com 主要なアップデートはリリースノートに書かれているが、面白いと思ったので紹介する。 Scala Nativeとは(おさらい) バイナリ互換性 C++標準ライブラリへの依存が削減 clasのvtableのレイアウトが最適化さ…

Scala CLIでスクリプトを書くときはビルドサーバが立たないようにすると良い(かも)

Scala CLIはScalaの便利コマンドラインツールで、スクリプト実行やREPL、パッケージングなどをやってくれる。今回はスクリプティングの話。 blog.3qe.us Scala CLIはビルドサーバを起動する Scalaはコンパイル型の言語であり、JVMでコンパイラが動作するとい…

Scalaで空文字列をNoneにしたいときはfilterすると良い

こんな文字列があるとする: val s1 = "foo" val s2 = "" これを、以下のような感じにしたいことはまあまあある: val s1a = Some("foo") val s2a = None つまり、以下のようなルールだ: 文字列sが空の場合、None。 それ以外の場合は、Some(s)。 素朴にmatchを…

Scalaにもpackage-lock.jsonが欲しい!sbt-dependency-lockの紹介

先日、言語の塩漬けビリティの話がネットで盛り上がっていた。 言語とそれをとりまくエコシステムの塩漬けビリティみたいな概念が、†生産性†みたいな概念とは独立した軸に存在しているような気がしており、JavaとかCは異常にこのへんが手堅く、だから選ばれ…

Scala 3.6が出たので見所を紹介するよ

Scala 3.6.2が出た!やったー! github.com Scala 3.6.2は、Scala 3.6系の最初の正式なリリースで、数多くの機能が追加された。この記事ではそのうち主要な機能を紹介する。また、正確さよりも分かりやすさを優先してザックリ書いているところがあるので、そ…

esbuildでScala.jsをビルドして呼べるようにするプラグインを作った話

作った。 www.npmjs.com github.com esbuildとはJSのバンドラであり、めちゃくちゃ高速に動作するのがウリである。 esbuild.github.io そして今回自分が作製したこのプラグインを使うと、esbuildがScalaのコードのimportを見付けると勝手にビルド・バンドル…

プロジェクトS: Scala 3で #ISUCON 14に出て優勝せよ (点数: 0点)

これは、前人未踏の地に飛び込んでいった漢たちの物語・・・ ツッコミ所がいっぱいあると思います。どんどんツッコんで賑やかしてください。ISUCONの経験がそんなにあるわけではないので、アホみたいなことをしているかも。俺をBIGにしてください! また、書…

Laikaでlaika.io.internal.errors.ParserErrors: Multiple errors during parsing: Duplicate path: / (no matching file paths)が出たら見るページ

cleanするとだいたい治る。 docsプロジェクトにドキュメントを書いているときは docs / clean してから再生成するとよい。 なんでこんな壊れ方するのかは謎 これはScala Advent Calendar 2024の7日目の記事です。 qiita.com

sbt-jibでScalaのDockerイメージを簡単に作ろう

ScalaでDockerイメージを作る話は定期的に書いている。しかし今回が一番簡単です。 blog.3qe.us blog.3qe.us blog.3qe.us まじで何回書いてんだという話だが、Dockerコンテナはあまりにも日常の一部になってしまっているので、ScalaでもDockerコンテナが簡単…

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?