scala
プログラミング言語Scalaで最もよく使われているビルドツールといえばsbtだ。起動しっぱなしのインタラクティブ仕様なsbtがやや鈍重なきらいがある一方、もう1つのビルドツールであるMillが開発されており、こちらではnpmのようなシェル単位の操作体系を指向…
sbtはかつてsimple build toolと呼ばれていた(今は酢豚の略とされている)。しかしビルドツールというのは本質的に難しい。複数の依存性を解決し、コンパイラ達が吐き出す成果物を統合し、1つあるいは2つ以上の最終成果物にしなければならないのだから、複雑…
以前、sbt-native-packagerでScalaのDockerイメージを作る方法を紹介した。今回はsbt-packを利用した、より軽量な手法を紹介する。 前回の記事はこちら: blog.3qe.us sbt-pack: 1つのディレクトリにまとめる君 sbt-packを聞いたことがなくても、sbt-assembly…
Scala 3でParameter Untuplingという機能が追加された。この機能は従来Scala 2で問題となっていたタプルまわりの取り回しを大きく改善する。 Parameter Untupling 従来、F[(A, B)]のような型(例えばSeq[(String, Int)])に対してmapを行うときは、caseを使っ…
先日(といっても結構前のことだが)、Scala 3のLTSサポートバージョンである3.3.0がリリースされた。Scala 3の開発が円熟してきているようで嬉しい。これからも元気でいてね。今回はScala 3をAWS LambdaのContainer imageを使って動作させる手法についてお…
Akka PersistenceはAkkaでイベントソーシングを行い、アクターの状態を永続化するためのライブラリである。 doc.akka.io イベントなどの永続化にJSONライブラリであるCirceを使ったのでその手順をメモしておく。ここではAkka Persistenceの導入そのものの話…
Akka 2.8でActorがクラッシュした場合にどのように振る舞うかについて調べる機会があったのでメモ。 ライブラリ依存性は以下の通り: libraryDependencies += "com.typesafe.akka" %% "akka-actor-typed" % "2.8.3 Actorの監視 通常のプログラムは例外をキャ…
仕事でこういうシチュエーションに遭遇した。 foo.bar.buzz.Piyoというクラスがある(パッケージがfoo.bar.buzz) 同名のhoge.fuga.Piyoというクラスがよそのパッケージにもある(パッケージがhoge.fuga) こういう場合、BuzzPiyo / FugaPiyoみたいに弁別できる…
Akka HTTPは素朴なライブラリなので、特にそういうプラグインを使っていない場合は自分でレスポンスのContent-Typeを設定する必要がある。この記事では、Akka HTTPでContent-Typeを設定する方法と、Acceptヘッダを設定する方法を説明する。 この記事ではAkka…
プロパティベースドテストを行うライブラリであるScalaCheckには、任意の値を生成できるGenという仕組みがある。任意の日付時刻を生成するためのGenを定義したメモを残しておく。 Gen Genとは値を生成するためのジェネレータである。例えばGen.longは任意のL…
ScalaのJSONライブラリであるCirceは、JSONをパースしてさらにcase classへと変換してくれる機能があるけれど、余分なフィールドがJSONに生えていたらどうなるのか気になったので試してみた。 build.sbt 依存性は以下の通り。 scalaVersion := "3.2.2" libra…
Scala.jsはScalaからJavaScriptのトランスパイラであり、執筆時点でバージョン1.13.2を記録しており、活発に開発が行われている。加えて、これを補助するコンパイラプラグインであるScalablyTypedによるTypeScriptの型定義からScalaの型定義への転写によって…
困っているので、思考の整理を兼ねてメモしておく。各項目がまちがっていたらおしえてください。 動機 Scala.js ScalablyTyped ScalablyTypedにおけるvoid ScalablyTypedにおけるasync TypeScriptにおけるasync void TypeScriptにおけるvoid methodのasynchr…
フォロワーがHaskellの問題で困っていて、助けてくれ〜!! と言われたのだが、 当方Haskellが母語ではないのでハスケルヨクワカリマセン状態になってしまった。というわけでScalaでお答えすることにした。 #Haskell でもっとスマートなプログラムを考えて下さ…
先日AWS LambdaでScala 3を走らせる方法を解説した。 blog.3qe.us 解説したというか、何事もなく動いたという感じだ。 今回は安定してJSONを入出力するテクがわかってきたので解説する。 完成品はこんな感じになる: import java.io.InputStream import java.…
ふと気になっていたので、素早く検証することにした。 ちなみに逆コンパイルなどではjavapコマンドを使うのが良いと教えてもらった。 javap コマンド?— がくぞ (@gakuzzzz) 2023年6月19日 検証方法 バージョン ソースコード コンパイル シグネチャの差分を…
いろいろと分析したいので、マネーフォワードでエクスポートできるCSVファイルをSparkを使ってParquetに変換したメモ。 マネーフォワード 特に今更説明する必要もないが、マネーフォワードはオンラインで動作する家計簿サービス。カードと連携したり、勝手に…
Spark 3.4.0で確認した。例えば、.foobar.csvのようなファイルを読み取らせようとしても、読み込んでくれないし、しかし一見成功したかのような振舞いになるので注意しなければならない。 //> using scala "2.13" //> using lib "org.apache.spark::spark-co…
苦しんでいる人をちらほら見たので解決策を示しておく。 tl;dr このように、http4sでサーバを書くとき、バックエンド実装がEmber(デフォルト)の場合はwithDefaultTimeout()を使って短いタイムアウトを指定するようにしてください。 import scala.concurrent.…
ScalaをネイティブコンパイルしてJVM無しで実行ファイルとして動かせるようにする仕組みであるScala Nativeが、いつのまにかシングルバイナリを出力できるようになっていた。これにより、Goと同じように1つのバイナリさえコピーすればScalaを動かせる環境が…
HaskellやScalaで関数型プログラミングをしていると、コなんとかというやつに出くわすことがある。でもコなんとかからのアプローチは決まってそっけない。深夜にやってる映画を見せまいとする親のようだ。まだ君には早いよ、そのうちね、といった具合に。こ…
最近Scala 2.12.18が出た。最新のJDKとかに対応したり、マイグレーション向けの機能が拡充されている。 github.com そんでScala 2.12.16をScala 2.12.18まで上げたら、手元ではコンパイルが通るけどCI(GitHub Actions)では通らなくなってしまった。ログを見…
あまり知られていない関数型言語のおもしろ概念として、Opticsというものがある。 Opticsとは、オブジェクト指向言語で言うところのSetter/Getterを一種の関数として捉え、いくつかの便利な特性を付与したものの総称だ。この便利な特性によって、Setter/Gett…
Scala 3には大きな構文上の変更、例えばimplicitまわりが整理されてgivenなどに変化したりしている一方で、細やかな機微にわたる変更も含まれている。今回説明するimport構文上のワイルドカード記号の変更もその一部。 Scala 2では、あるパッケージに属する…
追記 具体的な型が分かるわけではないので、この方法だとうまくいかないことがわかった。詳しく調べている。 本編 わけあって(わけは後で話す)、以下のようなJSONに対応する型エイリアスを定義しなければならなくなった。 { "deviceEvent": { "buttonClicked…
先日、Scala CLI v1.0.0がついにリリースされた。これまではv0系列だったので、満を持しての正式版リリースだ。おめでとう! github.com いちおう説明しておくとScala CLIは総合的なScalaのコマンドラインツールで、以下のようなことができる: Uber JAR(単体…
ScalaでHTTPエンドポイントを定義するためのライブラリであるTapirは最近よく使われており、Star数もとても多い(今見たら1.2kだった)。具体的なHTTPライブラリから独立した定義ができるため、メンテナビリティが高いのが特徴である。OpenAPIの定義を生成する…
そういえばScalaをAWS Lambdaで実行するのどうするんだっけ、と思った。実はScalaをLambdaで動かしたことは無い気がするので調べておいた。今回はJava 17を前提に動作させる。 tl;dr AWS LambdaのJavaランタイム sbt-assembly sbt-assemblyへの依存性の宣言 …
最近のAI技術の発展には目を見張るものがあるが、そんな中でも言語・ライブラリ・フレームワーク間の互換性は今ひとつ進んでいないのが現状で、TensorFlowとPyTorchとscikit-learnとでは別々の形式をモデルとして利用しているし、もちろんPythonで動かすしか…
プログラミングにおけるEnumeration、略してEnumは列挙型とも呼ばれ、いくつかあるうちの特定の値しか取らない型を表現するために使われる型である。Enumはだいたいの言語で様々な形で実装されている。 さて、Scala 2までではEnumを使う際はやや特殊なクラス…