Lambdaカクテル

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

Invite link for Scalaわいわいランド

scala

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

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

Scala Nativeでjava.nio.channels.AsynchronousServerSocketChannelがないと言われたら見るページ

Scala Nativeでhttp4sなどを使おうとするとビルドタイミングでこのようなメッセージが出たりする: Found a call to not defined static method Member(Top(java.nio.channels.AsynchronousServerSocketChannel),D4openL42java.nio.channels.AsynchronousChan…

Scala.jsでSyntaxError: Cannot use import statement outside a module出たら見るページ

Scala.jsでSyntaxError: Cannot use import statement outside a moduleが出ることがある。 環境 val scala3Version = "3.5.2" addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") tl;dr .withOutputPatterns(OutputPatterns.fromJSFile("%s.mjs")し…

Scalaではクラスのコンストラクタ引数とフィールドを同時に定義できる

こういうツイートを見た。 Scalaのフィールド、class名のすぐ後ろのかっこ内に書くのとbodyに書くの何がちがうん— Neo (@GlassesNeo) 2024年11月24日 Scalaのフィールド、class名のすぐ後ろのかっこ内に書くのとbodyに書くの何がちがうん つまり、この二者は…

ScalaでスナップショットテストをするならSnapshot4sが良さそう

最近仕事でスナップショットテストを実施した。一定の仕様でデータを文字列で吐き出す機能があり、その出力が入力に対して安定しているかどうかを保証しておきたいのだ。その時はvitestに搭載されている機能を利用した。 vitest.dev ざっくり言うと、スナッ…

Scalaの勝手マスコット Scala-kun を作りました

作った Scalaの非公式なキャラを作った。 GitHubにSVGがあります。CC BY-SA 4.0でライセンスしているので、それに基いて勝手に使ってください。例えば、スライドに挿入したり(スライド末尾や適当な場所にクレジットしてください)、ライセンスを継承すること…

ScalaでZIPファイルを簡単に扱うならos-libが便利そう

会社では定期的にScalaの新たなトピックを確認したり共有したりする会をやっている。そこでScalaのRedditを見ていると、os-libのバージョンアップが知らされていた。 見ると最近のバージョンではos-libはZIPを扱えるようになっていた。APIも便利そうなので紹…

Scala 3でクラスフィールドの初期化順の困りを回避できるSafe Initialization機能が便利なので紹介したい

突然だがこのScala 3のコードはコンパイルするだろうか。先に正解を言っておくと「コンパイルする」(Scala 3.5.0)。 class Foo: val x = y val y = 42 では、このFooに向けて以下の呼び出しを行うとどうなるだろう? Foo().x 驚くなかれ、この式は0に評価さ…

Pulumi(Besom)でリソース名が自動的に変化するのを防ぐ

PulumiとはIaCツールである。 www.pulumi.com 競合としてTerraformとかCDK Terraformがある。PulumiはSDKを持つ好きなプログラミング言語で好きなプロバイダのリソースを記述できる面白いアーキテクチャになっていて、例えばKubernetesやCloudflare、AWSなど…

sbt-native-packagerでCorrettoを利用するにはdaemonUserUidをいじるといい

案外まとまった手順がネットになかったので放流しておきます。 どういうときに読むか sbt-native-packagerでDockerイメージを作成しようとしたら /bin/sh: adduser: command not found と表示されたとき sbt-native-packagerとは ScalaをDockerやdebパッケー…

Scalaでもコードとテストを同じディレクトリに配置できる(テストのコロケーション)

社のSlackでこういう発言を見た。 Go みたいにプログラムとテストを同じ dir に入れたい。 そういえば、テストとコードを同じ場所に配置する言語をよく見かける。こうした、テストとコードを同じ位置に置くという思想を(テストの)コロケーションと呼ぶようだ…

Play frameworkでJSONに余計なフィールドが含まれているときにエラーにするには

Reads[A]にはcomposeWithメソッドがあるため、これを利用して余分なフィールドを検出できる。composeWithは、いったん別のReadsを事前に経由させるメソッド。 Scala 3.3.0、play-json 3.0.4で確認した。 前提 まず、あるcase classと、余分なフィールドを含…

Scalaのfs2でテクニカルなStreamを作りたいときはPullを使うといい

Scalaにはfs2という非同期ストリーミング処理を生産的に行えるライブラリがある。ストリーミング処理なので、沢山のデータがどんどん流れてきたり、ビッグデータ的な情報を扱う企業でよく利用されている。 fs2.io speakerdeck.com 最初から非同期処理に対応…

Scala 3のsummonって何?

Scala 3にはsummonという関数がある。普段はあまり使うことがないが、知っておくとusingまわりのデバッグにも使えるとても便利なやつだ。この記事ではsummonの便利な利用法を紹介する。 docs.scala-lang.org 型の一致を確認する summonの典型的なユースケー…

Cats EffectのResourceで安全にリソースをむすんでひらいてしよう

Scalaの非同期処理フレームワークであるCats Effectには、非同期処理のためのバラエティ豊かな部品が沢山揃っていて、これらを組み合わせることで簡単に柔軟な非同期処理を書けるようになっている。 中でもよく登場する部品がResourceだ。Resourceを利用する…

Cats Effectの*>と>>の違いは何?Scaladocはあるの?調べてみました!

tl;dr どちらも「左を実行してから右を実行」であることに変わりない *>は再帰セーフではない 値渡し(IO[B])していることに起因する >>は再帰セーフ 名前渡し(=> IO[B])していることに起因する 特に理由がなければ>>を使おう Scaladoc しっかりScaladocに説…

Feral: Cats EffectとScala.jsを使って高性能なAWS Lambda Functionを迅速に作ろう

現代のクラウドネイティブな開発においてはいわゆるFaaS(Function as a Service)が欠かせない存在となりつつある。AWSではAWS Lambdaとして、Google CloudではCloud Functionsとして提供されるこのサービスは、小さなコード片をマシンのデプロイを行うことな…

Scala.jsで環境変数を呼び出したいときはsys.envではなくjs.Dynamicを利用する

Scala.jsをNode環境で動作させるときに環境変数を取得したかったけどうまく動かずにハマったのでメモ。 tl;dr val env = js.Dynamic.global.process.env.asInstanceOf[js.Dictionary[String]].toMap Scala.jsと環境変数 通常Scalaで環境変数にアクセスするに…

ScalaでWebアプリを爆速開発するための技術スタック 2024

去年はこれです。ちらほらスターがもらえていたりするので、今年も更新するかという気になった。 blog.3qe.us 以下の項目について技術スタックを考えていく。太字は今年になって追加したもの。 言語 エディタ ビルドツール スクリプティング ロギング テスト…

ScalaでWASMランタイムを実装してHello Worldを動かした感想

元同僚の id:tanishiking24 くんがScalaMatsuri 2024でWASMの発表をしたのだが、それもあってWASMへの興味が湧いていた自分もちょっとWASMで遊んでみようと思った。 そこで、ゴリラ氏が書いたWASMの記事を読んでScalaでWASMバイナリをパースして簡単なWASIが…

じゃあ何すか、COBOL以外では4.8 - 4.7 - 0.1できないってことっすか / ScalaとSpireで安心安全な計算ライフを実現しよう

先日こういうツイートが流れてきた。 Q:なぜ金融系では未だにCOBOLが使われるんですか?A:お手元にExcelがありましたら任意のセルに「=4.8-4.7-0.1」って入れてみてください。— 遊撃部長F/S&RWAs (@fstora) 2024年6月6日 Q:なぜ金融系では未だにCOBOLが使わ…

Scala 3ではGeneral Type ProjectionのかわりにMatch Typesを使いましょう / Type Lambdasも使える

Scala 2ではこういう表現がたまにあった: trait Entity { type Key } type KeyOfEntity[E

Tagged Type(Branded Type)を使って飛行機の不時着や人工衛星紛失を防ごう / Scala 3ではTagged Typeを簡単に作れる

Tagged Type というテクニックがある(TypeScript界隈などではBranded Typeと呼ばれているようだ)。実行時の型としては同じだが、型システム上はこれを区別して別物として扱い、混同できなくする仕組みを作るためのものだ。 AIくん!サムネイラスト作って!…

Scala 3でEnumの逆引きをするには事前にマッピングを用意してやるといい

最近WASMに興味がでてきて、ゴールデンウィークにWASMランタイムをScala 3で実装している。もう結構な命令を実行できるようになって、バイナリをパースして足し算を実行するくらいならできるようになった。 WASMは機械語なので、オペコードと引数が命令とし…

GitHub ActionsからCodeBuildを呼び出せるようになったのでx86_64とaarch64とでクロスビルドしてみた

先日、GitHub Actionsからマネージドランナー扱いでAWS CodeBuildを呼び出せるようになった。 aws.amazon.com CodeBuildからはLambda環境を呼び出すこともできるので、簡単な処理ならLambdaを使い、ビルドなどの大掛かりでファイルシステムを触るような処理…

(初心者向け)Scalaでsbtプロジェクトを作るときの勘所

この記事では、Scala初心者がプロジェクトを作るときに分かりにくい(であろう)ポイントを埋めようというものです。 こんな記事を読んだ。 trap.jp 普段Rustを書いている人が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が吐き出されるというギャグが…

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