Lambdaカクテル

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

Invite link for Scalaわいわいランド

scala

ScalaのDIライブラリAirframe DIの使い方、そしてそれがおすすめである理由

Airframe DIについて調べて遊んでみたところ良さそうだったので紹介します。DIについて知っている人は先頭2節をスキップしてよいです。 サンプルもあります。 github.com ソフトウェアでよくある問題: 分割、結合、交換 DIとは Airframe DIとは Airframe DI…

Scala Native 0.5.0がリリースされた (バイナリサイズが6割に)

先日(4月11日)、Scala Native 0.5.0がリリースされた。やったー! Scala Native 0.5.0 has been released! The long await multithreading, initial 32-bit architectures support and many more are now available.See https://t.co/ynLcSIJ5jK for more de…

ScalaにGoroutineがやってくる!非同期処理ライブラリOxで遊んだ

Channelスタイルの並行処理の記述を(もちろん型安全に)可能にするライブラリOxについて調べて試してみた。結論から言うと書き味がめちゃくちゃ良くて面白い。 ソースコードも置いておく。 github.com Ox Oxとは、sttpなどの開発でお馴染のSoftwareMillによっ…

Scala.jsのフロントエンドUIライブラリLaminarの書き味がどんなもんなのかのメモ

驚くなかれ、ScalaはJavascript(ESModuleかCommonJS)にコンパイルできる。それがScala.jsである。 www.scala-js.org 普通に10年開発されていて、普通にぜんぜんScalaが動く。ぜんぜんバグがない。昔はHello,Worldすると20MBのJSが吐き出されるというギャグが…

2024年春のCatsの呼び出し方はcats.syntax.all

tl;dr 2024年春時点では、Catsのimportでとりあえず全部importしたいとき(つまり大抵のユースケース)では以下のようにcats.syntax.allをまず連れてくるのが正解みたい。 import cats.syntax.all._ // または import cats.syntax.all.{*, given} たまにこれで…

ちっちゃなScalaコンテナを作つコツ(6 MiBだぞ)

おなじみの画像 JavaやScalaといったJVM言語のDockerイメージは、JVMを同梱しなければならない都合で肥大化しがちである。特に何もしなくても、例えば一般的なamazoncorretto:21のイメージサイズは217.7 MBもある。 hub.docker.com これにさらにビルド済みの…

Scala 3の先進的なロギングライブラリScribeの使い方、構造、カスタマイズについて

この記事では、Scala 3用のロギングライブラリであるScribeについて、以下のことを説明する(順不同)。 インストール方法と基礎的な使い方 従来のロギングライブラリとの思想的な違いと優位性 Scribeの構造 そしてこれを利用した発展的な使い方 あらすじ な…

2024年版: Scala+sbtで新Maven Centralにパブリッシュする

新しくなったMaven CentralにScalaプロジェクトをパブリッシュできたのでその手順をまとめた。 背景 パブリッシュとは おおまかな流れ 事前に準備するもの Maven Centralのページからnamespaceを取っておく テスト用リポジトリを作る sbt-sonatypeの最新版を…

Play Frameworkのテンプレートで@記号を入力したいときは2つ重ねればいい

タイトルが全てです。Play FrameworkのテンプレートエンジンTwirlは@を特殊扱いしています。Play 3.0で確認しましたが、どのバージョンでも同じはず。 @foo こう書くと変数fooへの参照になるわけです。 Bootstrapを使いたいときに以下のようなコードをテンプ…

Play Frameworkでテンプレートを切り出して別のテンプレートで利用するには@ファイル名を書くだけでいい

タイトルがほぼ全てです。Play Frameworkで別のテンプレートを呼び出して埋め込みたいことがあると思います。よく見ると書いてある Scala Template Use Cases - 2.6.xがぜんぜんドキュメントには書いてない。というわけで日本語の情報を残しておきます。 Pla…

Scalaで一番簡単に構造化ロギングを行うには / 最新のLogbackではデフォルトでJSONを吐ける

構造化ログという概念がある。ログをこれまでのプレーンテキストではなく、なんか良い感じのシリアライズフォーマットを使って出力することで、各種の再利用性を高めるのが目的だ。一般には、ログの各メッセージをJSONに収め、JSON Lines形式にすることが多…

Lensを始めとするOpticsがプログラミングをどう変えるか / 複雑なデータのモデリングをサボるには

仕事でLensを使う機会があった。Lensは複雑で入り組んだデータ構造の読み書きに非常に効果的な手法であるにもかかわらず、関数型プログラマ以外にはあまり知られていないように思える。 そこでこの記事では、Lensとは何なのか、なにが良いのか、具体的にどの…

Scalaで複数のリストをzipするならlazyZipがおすすめ(きれいに収まる)

Scalaでコードを書いていて、複数のリストをzipすることがあった。 val xs: List[Int] = ??? val ys: List[Int] = ??? val zs: List[String] = ??? xs.zip(ys).zip(zs) // => List[((Int, Int), String)] しかしzipは2つのリストからList[(A, B)]を作るので…

Scala CLIのDockerイメージを使うと本当に簡単にシングルバイナリを生成できて便利

Scala CLIのおもしろい使い方を見付けたのでメモ。これまでと比べてはるかにScalaのちょっとしたスクリプトのシングルバイナリを生成できるようになるので、本当にGolangみたいに簡単にちょっとしたツールを作れるようになった。 scala-cli package Scala Na…

値の検証もコンパイラにやらせよう: Scala 3でRefinement TypesやるにはIronっていうライブラリが良さそう

Scala 3でRefinement Types(篩型)を実現するライブラリIronに入門したので紹介します。最初はRefinedに入門しようとしてたら、Scala 3ではあまり動かなかったのでそのままIronに入門しました。 tl;dr Refinement Typesっていうのを使うと、普段動的にチェッ…

Scala製のドキュメンテーションジェネレータLaikaに入門した

個人的に興味があって触る機会があったので、公式サイトで勉強しながらまとめた。 typelevel.org Laikaとは Laikaを試す Laikaがデフォルトで対応しているフォーマット ExtensionBundle Laikaと副作用 Laikaをsbtプラグインから利用する 応用 Laikaとは Laik…

Scala 3はScala 2の標準ライブラリを使っていたりする

先日Scalaわいわいランド(ScalaのコミュニティDiscordサーバ)で、Scalaを最近勉強しだしたという方から Scala3を使っていて気づいたんですけど、Scala2で記述されたライブラリを呼んでいる部分があることに気づきました という話を聞いた。言われてみれば、S…

Scala3で引数の型によって他の引数を有効化したり無効化したりする

そんなシチュエーションあるんか?と思うけど、ある。 今Chrome Devtools ProtocolをScalaで実装してて、もう動くところまで行ってるんだけど、スクリーンショットを撮影するAPIがこんな感じで定義されている。 chromedevtools.github.io このうちquality引…

JSONの差分を取ってJSON Patchを得るにはdiffsonがおすすめ

こういうツイートを見た。 Scala (or Java) で、jsonのdiffをpatchファイルみたいな感じでわかりやすいテキストで出力してくれるライブラリないかなあ。そしてjacksonに依存してないといいな— Arthur (@Arthur1__) 2024年1月13日 現代のプログラミングではJS…

Scala 3のシンタックスではforループでdoを使うことがある(カッコ付けたければ不要)

こういうツイートを見かけた。 Scala3 って for-yield じゃなくて for-do なの???— りと (@rito_528) 2024年1月8日 言われてみれば、たまにScala 3のコードサンプルでそういうの見たことあるな~と思った。ので調べたメモ。 tl;dr 値を返したいときはyiel…

SN bindgen: CヘッダファイルからScalaの型定義を生成する + ネイティブにtree-sitterを呼び出してみた

ScalaをネイティブバイナリにコンパイルするプロジェクトであるScala Nativeというのがある。 scala-native.org 2023年現在では多くのScalaライブラリがScala Nativeに対応しているため、特に難しい対応をしなくてもネイティブバイナリを得られるようになっ…

Cloudflare WorkersにScala.jsをデプロイした

意外とやったらできたので記事にします。 実際に動いている様子はこちら。 cloudflare-worker-scala-exercise.pages.dev ソースコードはこちらです。 github.com 感想 やること Cloudflare Workersってなによ 目指す構造 Scala.jsを書く project/plugins.sbt…

関数型プログラミング: map結果を引数とのペアにしたいときはStateが便利だったりする(StateTもあるよ)

この記事では、Scala 3と関数型ライブラリであるCatsを時折使いつつ、Stateモナドを利用することでmap結果にうるおいを与えられるという話題を紹介します。 よくある処理: mapしてからペアにする まあまあよくある: メソッドはたまに値返さないことがある ま…

初心者向け: Scala CLIでScalaをはじめよう

この記事は Scala Advent Calendar 2023の19日目の記事です。19日って「あ〜今月が終わる」ってなるちょうど良い塩梅の日付ですね。 qiita.com この記事では、Scalaの総合ツールであるScala CLIを利用する様子を紹介し、Scala CLIでScalaのちょっとしたアプ…

Scalaで一定のコレクションを無限に繰り返すようなストリームを作る

このような、一定の要素を無限に繰り返したリストが欲しいことがある。無限に続くリストは通常のリストでは扱えないため、ストリームを使わなければならない。Scala 2.12まではストリームのためにStreamを使い、2.13以降はLazyListを使うことになっている*1*…

シンプルで使いやすいマイクロHTTPフレームワーク『Cask』を紹介するよ

今日はScalaで動作するマイクロHTTPフレームワークであるCaskを紹介したいと思います。Scalaを見る目が変わると思います。Scalaはけっこう複雑寄りのエンタープライズグレードの超強いライブラリが多いような気がするのですが、今回ご紹介するのはとてもeasy…

AWS Lambda FunctionをScala.jsで書いて爆速Scalaを満喫しよう

この記事は、Scala Advent Calendar 2023の5日目の記事です。 qiita.com 大遅刻してしまいましたが、Scalaは遅延評価できるのでモーマンタイですね。 この記事では、Scalaをクラウドネイティブな環境で使う例の紹介として、ScalaをJavaScriptコードにトラン…

『データ指向プログラミング』読んだ / OOP以前とDOPとの対比と差分などについて

先々月あたりに邦訳が出た『データ指向プログラミング』を読んだ。めちゃくちゃざっくり言うとオブジェクト指向における「データと振舞いの一体化」というドグマを手放させるもので、めちゃくちゃざっくり見るとC言語的な構造化プログラミングの世界に回帰す…

PyPIのScala版、Scaladexにコントリビュートした

Scalaのライブラリを検索・一望・依存性定義をコピペできたりする便利なサイトであるScaladexにコントリビュートした。という話を自慢するだけのエントリです。 Scaladexとは ScaladexとはRubyにおけるrubygems.org、PythonにおけるPyPIの、Scala版である。…

Google CloudのCloud FunctionsでScalaを実行する

仕事でCloud Functionsを触る機会があったのでメモ。この記事はScala Advent Calendar 2023の2日目の記事です。 qiita.com 昨日の記事はこちら。 zenn.dev AWSがLambdaを提供しているのと同じく、Google CloudはCloud Functionsというサービスを提供している…

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