Lambdaカクテル

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

Invite link for 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とは何なのか、なにが良いのか、具体的にどの…

typoで罰金20分、workflowがコケるのを防ぎたい

Google WorkflowのYAMLファイル中でファイル名の箇所をtypoしてコケさせてしまった。時間がかかるワークフローなので20分無駄にしてしまい、実質罰金20分になってしまった。再実行でまた20分取られるので実質40分かかってる。 20分無駄にするのは辛すぎるの…

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…

htmxをCloudflare Workers + Honoで動かして入門した

htmxについてちょっと遊んでおきたかったので遊んだ。Cloudflare Workersの上でHonoを動かして、TSXでHTMLを返しつつ、その中にhtmxをのっけた、みたいな構成。𝑹𝒆𝒂𝒍 𝑾𝒐𝒓𝒍𝒅 𝑩𝒖𝒔𝒊𝒏𝒆𝒔𝒔...でも使えるかな? https://wild-meadow-79c7.windymelt.workers.dev/ な…

値の検証もコンパイラにやらせよう: 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…

YAPC::2024 Hiroshimaにはてなパーカーで参加しました #yapcjapan

ついに広島で開催されたプログラミングの祭典YAPC 2024 Hiroshimaに参加し、さきほど帰宅したのでレポートです。2/19〜2/21までの各イベントに参加しました。いくつかのトピックに分けて、現場の熱量をなるだけ伝えようと思います。 ついにやってきた大規模…

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

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

scrollIntoView()では不可能な位置へと要素をスクロールさせたいときはscrollBy()を使うテクがある

ブラウザ上の要素を視認可能な位置へとスクロールする設計について調べて実装する機会があったのでメモ。 tl;dr const offsetPercentage = 25; const [parentRect, targetRect] = [ parent.getBoundingClientRect(), target.getBoundingClientRect(), ]; con…

FreeBSD 14.0でPT3を動かす

PT3は地上波を録画するためのPCIeボードだが、基本的にLinuxで動作させることを前提に作られており、一般にはLinuxのドライバしか流通していない。ただ、有志がなんとかパッチを当ててFreeBSDでも動作させられるようにしている。POSIX万歳という感じである。…

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

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

怪奇現象: npm/pnpm/yarnプロジェクトをセットアップするとError: EISDIR: illegal operation on a directory, readと言われる。ラッキーアイテムはpackage.json

この記事は怪奇現象に遭遇して治ったというメモです。最近こういう怪奇現象系の話が流行ってますね。なんマイルを超えるとメールが届かないとか、中国人の同僚がお茶を入れると必ずサーバが落ちる、とか。まぁ今回はそんな怪異の足元にも及ばないプチ怪異、…

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に対応しているため、特に難しい対応をしなくてもネイティブバイナリを得られるようになっ…

Node.jsのmkdtempはprefix指定が独特で注意が必要だけど、他の言語は大体普通だった

ハマったので後学のためにメモを残しています。うえ〜ん 一時的にファイルシステムにファイルやディレクトリを作りたい、ということはよくある。ただし適当な名前で作成すると名前が被って事故の元になってしまう。このため、各プログラミング言語には一時フ…

SandSをLinuxでやってる人はxremapを導入してxmodmapとxcapeを捨ててください

自分は日本語入力効率化のためにずっと昔からSandSを利用している。SandSとはSpace and Shiftの略で、以下のようなキー入力のカスタマイズのこと。 スペースキーの役割をシフトキーにする ただし、スペースキーを単発で押して離したときはスペースキーとして…

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

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

動画・音楽ファイルの秒数を算出するにはffprobeを使うと便利

動画ファイルや音楽ファイルの長さを知りたいことがある。例えばファイルをエンコードし直して一定のファイルサイズに収めたいときなどは、ターゲットとなるビットレートを算出するために秒数を得る必要がある。 メディアファイルの秒数を得るには、ffmpegに…

関数型プログラミング: 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*…

リモートワーク大時代に来るアーキテクチャ、それは疎結合

なんかタイトルでデカく出てしまったけど、リモートだと疎結合なアーキテクチャのがうまくいくね、という経験をしたという話。特にオチはないです。ソフトウェア設計が好きな皆様のおやつとして読んでください。 COVID-19でリモートワークが拡大した 最近や…

シンプルで使いやすいマイクロ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コードにトラン…

Node.jsのストリーミングAPIにPromise版が生えていた、こっち使うと便利そう

昨日こういう記事を書いた。 blog.3qe.us ↑ではがんばってパイプラインが送るイベントを監視してPromiseでラップしていたけれど、実は公式にPromise版のAPIが提供されていた。 nodejs.org これを使うといい感じに入出力が終わったタイミングで完了するような…

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