Lambdaカクテル

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

scala

BがMonoidのとき、A => BもMonoidになる

ふと気になったけど今まで記事書いてなかったのでいちおう確かめることにした。 ある1引数関数f: A => Bがあったとする。 type A type B val f: A => B = ??? Bがモノイドであるとする。 implicit class BMonoid extends Monoid[B] { ... } このとき、1引数…

OpenAI(ChatGPT)をScala3から呼び出せた

Tapirなどの実験がてら、OpenAIにアクセスする実験をしていた。とりあえず実験に成功したので解説する。 github.com 実行すると、とりあえず挨拶してもらうようにしている。 $ OPENAI_APIKEY="..." OPENAI_ORG="..." sbt run こんにちは!ChatGPT APIへよう…

ScalaではIntをDoubleに代入できるがサブタイプではない(関数引数の変性が反変になる話と絡めて)

非常に面白い題材をTwitterで発見したのでメモ。 このようなツイートを見た。 scalaって関数にも部分型関係があって、コンパイル通ると思ってたけどダメみたい。なんでですかね?val f : Double => Boolean = (d:Double) => trueval g : Int => Boolean = fh…

Scalaの正規表現でオプションを使うには文字列先頭で(?フラグ)と書く

言いたいことはタイトルで全部言ってしまったので以下は蛇足です。 蛇足 ECMAScriptなどの言語では、正規表現リテラルが存在しており、リテラルと一緒に正規表現オプションを設定できる。 // xオプションを設定する const re = /(\d\d\d) - (\d\d\d\d)/x; *1…

DateTimeのwithZoneについてのメモ / 構造の忘却という普遍的な話題

Scalaでは時刻操作のためにJavaライブラリであるjoda-time(と、そのScala用便利ラッパーであるnscala-time)を使うことが多い。JVM言語の良い所だ。今回はタイムゾーンTZ操作にまつわるメモ。 withZoneでタイムゾーン表記を変更する DateTimeに対して定義され…

ScalaTestではshould ===を使うと良い

ScalaのテストフレームワークであるところのScalaTestのドキュメントを読んでいたら便利なメソッドを発見したのでメモ。実はもうみんな知ってるかもしれない。 等価性比較 ScalaTestでは、Matcherという便利なメソッドを使って等価性や存在判定などのテスト…

Scalaで(f(), g(f()), h(g(f())))みたいなのを返したいときのパターンと、scanLeftと、Writerモナドと私

仕事でコードを書いていて、タイトルのようなケースに遭遇した。 val a, b, c, ... = ??? // 定数 val x = f(a) // なんかを計算したり生成する val y = g(x, b) val z = h(y, c) ... val 最終的に欲しい値 = (x, y, z) こういうの。 これがもし仮に以下のよ…

Scala: CatsのArrowを覚えたのでfizzbuzzにする

とりあえず何かを覚えたらfizzbuzzにするクセやめたい import cats.syntax.all._ import cats.implicits._ extension (d: Int) def ~>(s: String)(n: Int) = (n % d == 0).guard[Option] as s val fizzbuzz = (((2 ~> "fizz" &&& 3 ~> "buzz") >>> (_.toList…

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

ScalaでなんかWebアプリをガッと作りたくなったときにどういう技術を使うべきなのか?という話です。自分はこういうふうに考えてるけどな〜というのを知見としてまとめておこうと思ってこの記事を書いています。いやいやこっちのが速いでしょみたいな話題歓…

ScalaTestでMapの存在判定をする

一瞬ハマったのでメモ。 val m: Map[DateTime, Int] = ... このような、DateTimeからIntへのMapがあるとする。 ScalaTestで、ある範囲の日付がすべてこのMapにキーとして含まれていることを知りたい。 誤答: definedAtを使う val from = DateTime.parse("202…

VOICEVOX Coreのラッパー書いたら公式ページからリンクしてもらえた

先日、VOICEVOX CoreのScala用ラッパーを書いた。 blog.3qe.us これを使うと、Scalaからずんだもんを簡単に喋らせることができる。 で、ネットをさまよっているとVOICEVOXコミュニティのDiscordに参加することができた。 そこで会話してるうちに、ラッパーを…

ScalaでJARファイルにネイティブライブラリをバインディングする

ScalaでJARファイルにネイティブライブラリをバインディグして使いたいことがある時、いくつかの点を考える必要がある。 どういう仕組みを使うのか? どうやって呼び出すのか? どうやって同梱するのか? どうやってビルドするのか? どうやって展開するのか…

Scala ループして生成する Rubyのtimesと同じようなやつ 令和最新版 Iterator.continuallyを使え

指定した個数の何かが欲しいことがScalaではよくあります。 インデックスほしいとき toを使うと良いでしょう。 (0 to 10) map (n => s"count $n") // => Seq("count 0", "count 1", ..., "count 10") 個数だけ指定してインデックスいらないとき Seq.fillを使…

ScalaMatsuri 2023にずんだもんを引っさげて登壇します #ScalaMatsuri #VOICEVOX

Scalaの国際カンファレンスであるScalaMatsuri 2023のCfPに応募したところ採択され、登壇の機会をいただきましたからお知らせします。 とき 2023-04-15〜2023-04-16 (変わる可能性があります) 20分間喋ります 今すぐGoogle Calendarに登録してください とこ…

Scalaのpipeでパイプライン演算子を作って遊ぶ

Scalaには2.13からpipeという面白いメソッドが追加されている。a pipe fと書くとf(a)になるという、それだけの仕組みだ。Elixirなどの他の言語では|>といった記号で導入されている。 blog.knoldus.com 記号の氾濫を避けるためにScalaは公式には単体の演算子…

ScalaからVOICEVOX呼んでずんだもんに喋らせる2023

ScalaからVOICEVOX喋らせようとしている人は多分絶対自分しかいないけど、ScalaからVOICEVOXを喋らせるためのラッパーであるvoicevoxcore4sを作った。 github.com この記事は、はてなエンジニアAdvent Calendar 2022の48日目の記事です。昨日の記事は id:gur…

Scala-CLIを使うとScalaをいきなりバイナリに変換できてすごいので紹介したい

Scala-CLIをいじっていたらかなり良さそうな機能を見付けたので紹介する。 Scala-CLI あらかじめ説明しておくと、Scala-CLIとはScalaをLLライクに扱うための便利ツールチェイン。REPLでコードを試したり、スクリプトを実行できたりする。 scala-cli.virtusla…

Apache Spark: CSV読み込み時に同名のカラム(case insensitive)があった場合は勝手に数字が付与される

Apache SparkでCSVファイルを読み込むときに気をつけておきたい挙動に遭遇したのでメモしておく。 Apache Spark Apache Sparkとは、Apache財団によってメンテナンスされている分散型の計算・分析エンジンで、Scalaを第一級言語としてサポートしている。要す…

ScalaとApache Sparkで線形回帰学習をやってみる + 簡単なSpark使い方メモ

1年間病院にかからなかったということで褒美の図書カードを健康保険組合にもらったので、こういう本を購入した。 scikit-learn、Keras、TensorFlowによる実践機械学習 第2版作者:Aurélien Géronオライリー・ジャパンAmazon 鈍器っぽい。この本ではまずはscik…

Tensorflo兎 Scalaで遊んだ記録その4(XORを学習させる)

あけましておめでとうございます。2023年は兎年ですね。 そして、兎といえばTensorFlo兎(テンソルフロウ)。今回もTensorflow Scalaをやっていきます。 XORをニューラルネットワークで実装する platanios.org 公式ページのサンプルを見ながら、 techblog.glpg…

Tensorflow Scalaで遊んだ記録その3(スライス記法)

機械学習で大儲けしたいからTensorflow Scalaを勉強している。その1とその2はこちら。 blog.3qe.us blog.3qe.us 今回は、テンソルの一部を表現する優れた記法であるスライス記法についてのお話。 オリジナルの(?)PythonのTensorflowにはスライス記法という…

Tensorflow Scalaで遊んだ記録その2(テンソルを作る)

機械学習で大儲けしたいので、Tensorflow Scalaで遊んでいる。 前回はこちら。 blog.3qe.us Tensor Creation 公式ドキュメントの Tensor Creation をやってみる。 platanios.org import org.platanios.tensorflow.api.tensors.Tensor import org.platanios.t…

Tensorflow Scalaで遊んだ記録その1(インストール〜初回動作)

機械学習をやるためのライブラリであるTensorflowにScalaバインディングが作られているのを知った。 platanios.org 機械学習で大儲けしたいので、ちょっと触ってみることにした。 インストール platanios.org 公式マニュアルのバージョン情報更新が滞ってい…

ScalaのDeclineで引数無しのサブコマンドを定義する方法

ScalaのコマンドラインパーサDeclineで、サブコマンドを定義したいのだが、サブコマンドには引数が無い、というケースを定義したかった。 普通サブコマンドにはさらに引数が付くのだが、例えば init みたいなサブコマンドを定義したいときは引数はいらない。…

4つのプラグインを活用して、Scalaソフトウェアを楽々リリースしよう

hljs.highlightAll(); Table of Contents 前提: JVM言語を配るのは大変 sbt-release でリリースプロセスの手間暇を省こう プラグインをインストールする build.sbt と version.sbt の設定 MavenにはPublishしないようにする リリースフローを起動する リリー…

Scalaの入門的な記事のまとめ(コレクションメソッドや関数型プログラミングが中心)

アルバイトとして働いてくれている同僚がScalaに入門していて、基礎的なScalaの文法などは習得してくれているけれど、コレクションメソッドや関数型プログラミングのイディオムまわりでもっと伸ばせそうな雰囲気があるので、何か良い資料を知らないですかと…

Scala記事を書き続けている話

Table of Contents はじめに 最近Scalaまわりのアウトプットを積極的にやっている Scalaの裾野を広げたい 高度な記事はあるけれど 入門的な記事を増やす お高く留まらない言語にしていく お高く留まった言語から滅んでいく 裾野がプログラミング言語を支えて…

Java(Scala)アプリどう配ってますか

自作の解説動画作成ツールがある程度形になってきたので、配布について考えている。 www.nicovideo.jp zmmはScalaで書かれたアプリケーションなので、JVMで動作する。JVM言語の配布形式には色々あるのだけれど、zmmではとりあえずJARを配ることにした。 Scal…

Shapelessでマルチテナンシーという問題領域を表現できるか?という考察

マルチテナンシーというコードの形態がある。同じコードベースで、実際の実行インスタンスなどは分けた形で複数のサービスを提供することである。例えば同じコードベースでAというECサイトとBというECサイトを提供する、という感じである。 このマルチテナン…

Scala3のUnion Types / Intersection Typesを試してみた

Scala3チャレンジをする記事の二本目。 前回はこちら。 blog.3qe.us ソースコードは以下に置いてある。 github.com github.com Union Types Eitherとの違い Discriminated Union Typesもどき Intersection Types まとめ MathJax v3以降ではbussproofs.styが…

Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?