Lambdaカクテル

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

Invite link for Scalaわいわいランド

scala

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というサービスを提供している…

OpenAIのAudio Transcription APIで遊んだ

最近OpenAIがオーディオ系のAPIをいくつか出していた。といってもけっこう前の話だ。 そんな中、最近OpenAIが色々なサービスを展開している。自分も触って習熟しておいたほうが、面白いアイデアを思い付いたときにすぐにプロダクトを作れて役に立つはずだ。…

Airframe RPCでRxRouterにコンストラクタ引数を渡すにはbindを使う

先日Airframe RPCで遊んだ。 blog.3qe.us が、Routerをインスタンス化するときにコンストラクタ引数を渡せないという問題があった。 import wvlet.airframe.http.netty.Netty import wvlet.airframe.http._ object Server extends App { // Create a Router …

Scalaユーザから見たNext.jsの楽しさ

最近所用でNext.jsを集中的に触る機会があった。一番好きな言語はScalaで、仕事でもプライベートでもよく書いているのだけれど、Next.jsの体験がとても良く、楽しかったのでたくさん試行錯誤したくなった。この体験を良い感じにScalaに還元できたら面白いな…

ScalaのRPCライブラリAirframe RPCを使うとNext.js風に簡単にサーバ=クライアント通信できる

Scalaの便利かつモジュラーなライブラリ群であるAirframeシリーズに収録されているAirframe RPCで遊んでみたところ、とても面白かったので紹介。 wvlet.org wvlet.org あらすじ Airframeとは Airframe RPC Scala(JVM)とScala.jsとでサーバクライアント通信を…

自前でOG:Image生成メカニズムを構成する方法

こういう画像を作る仕組みを作った。 画像を生成したい人は世間にそこそこいるかもしれないし、自分は比較的?簡単な方法でそれを達成した。せっかくなのでやり方をみんなに教えようと思ってこの記事を書いている。 全てのソースコードは以下にOGImagekunと…

ScalaTestでのテスト処理の前後に特定の処理を実行する方法

ScalaのテストフレームワークであるScalaTestでは、他のテストフレームワーク同様に、各テストの前後に特定の処理を挟むためのbefore / afterの仕組みが用意されている。 環境 Scala 3.3.0(2系でも変化はないはず) ScalaTest 3.2.17 各テストの前後に処理を…

関数型言語で登場する高カインド型(Higher-Kinded Types; HKT) と(* -> *) -> *みたいなやつの早わかりメモ

高カインド型(Higher-Kinded Types; HKT)とその表記について勉強したのでメモ。高階関数を知っているレベルからHKTをどう表記するかまでメモする。プログラミング言語として主にScalaを用いているが、Scalaでしか分からない概念は極力排している。知ってる部…

Kyoto.js 20で『ブログ内引用グラフを自作して引用一覧を作った話』を発表しました #kyotojs

Kyoto.js 20で掲題の通りの発表をLTとしてやらせてもらいました。資料は以下です。 www.3qe.us kyotojs.connpass.com 動機 僕はここ最近Scala.jsというAltJSテクノロジーを追いかけているのですが、ちょうどKyoto.jsがあるという情報を聞き付け、ここ最近の…

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