Lambdaカクテル

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

Invite link for Scalaわいわいランド

技術

ulimitに死す / ScalaのHTTPクライアントsttpではバックエンドを都度作らずに1つだけ作って使いまわしましょう

ここではsttp4前提で書くがsttp3でもたぶん同じ。 sttpについて説明しておくと、Scalaで利用できるHTTPクライアント実装で、操作体系がシンプルで簡単であり、なおかつ複数のバックエンド(JDK標準のクライアントを使うものとか、もっと並行性制御を強化され…

同僚とFigJamでお絵描きしながら仕事している

同僚と込み入った仕様を詰める作業をしないといけなくて、いくつかの疎結合なコンポーネントをネットワーク越しにデータが飛び交ったり、コンポーネントの中の状態が遷移していったりして、お盆と正月が同時に到来したような感じ。こういうとき、これまでは…

温湿度計を買ったところオブザーバビリティが向上した

先日また風邪を引いたので、温湿度計を買うことにした。部屋の過ごしやすい環境が分かれば安定して体調を管理できるだろうという魂胆。 タニタ Tanita 温湿度計 一目で室内環境がわかる 温度 湿度 アナログ 壁掛け 卓上 グレー マグネット TT-587-GYタニタ(T…

『はじめてのScala3』書評

この書評は、掲題書についての一個人の考えを述べ、改善に資せんとするものである。つまりここから先に書かれていることの冒頭には遍く「私見では」と見えない文字で書かれているということだ。 この本は初学者向けの教科書または副読書として不適切であり、…

ibus-skkでキーリピートが暴走する問題の解決策

Standard NotesをLinuxから使うと、Key Repeat機能が暴走して、手を放してもずっとカーソルが移動し続けたり、さらに悪いことには、バックスペースが外れなくなってどんどん文字列を削除していくことがあった。確かにこれはある意味セキュアだが、そういうこ…

Zshでスラッシュ単位で移動・削除できるようにするには$WORDCHARSを設定する

tl;dr 以下の通り.zshrcに追記する # '/' を単語の境界として認める typeset -g WORDCHARS=${WORDCHARS:s@/@} 登場人物 typeset シェル変数を書き換える -g グローバルに適用する $WORDCHARS 「ここに入った文字は単語境界とはみなさない」というリスト :s@/…

Devin 感想 (驚かない)

最近Devinを使っていて、試しに色々やらせている。印象や、こういう局面で強そう、といったことをメモしておく。 印象 それほどAIが賢いわけではない。Claude Sonnet 3.7を使ってるのと同じような感じ。たまに筋違いなPRを作ったり、古い作法でコードを書い…

Redacted: Scalaのcase classの特定のフィールドを隠すコンパイラプラグイン

Redditを見ていたところ面白いコンパイラプラグインを発見したので紹介する。 Redacted Redactedは、case classの特定のフィールドをtoString()から除外し、***で塗り潰して見えなくできるコンパイラプラグインだ。 polentino.github.io github.com Redacted…

Scalaの言語サーバMetalsがMCPに対応したのでRoo Codeで使ってみた / 型やシンボル情報をMCPが渡してくれる時代の到来

Scalaには言語サーバとしてMetalsというのがあり、LSPを喋ったりビルドサーバと協調してコンパイルを回したりしてくれる。 scalameta.org VSCodeでも使われる定番の言語サーバであり、Scala開発者の半分くらいはこれを使っているはず。ロゴがかわいい。 そん…

AI Coding Agent を使うことで、怒り狂い、視座が上昇する話

AI Coding Agentが活況だ。巷ではClineだRoo Codeだと盛り上がり、MCPを実装したことを自慢し、驕れる平家のごとくだが(平家と違ってもう少し長生きするだろうが)、かくいう私もそうである。 とはいえ、テトリスやブロック崩しが一瞬で作れたところで我々が…

Scala 3でMCPサーバとフレームワークをフルスクラッチした

だいたいタイトルの通り。最近MCPサーバ書くのが流行っており、実は自分はけっこう前にサーバ自体は書いてしまっていたのだが、記事にする元気がなかったので放置していた。しかし冷静に考えるとけっこう学びがあったので記事として残しておく。 記事書いた…

生成AIがWeb上のコンテンツを読めるようになる鍵は暗号通貨によるマイクロペイメント(かもしれない)

こういう記事を読んだ。 fujii-yuji.net 僭越ながら意訳すると、 robots.txtでLLMからのアクセスをrejectするコンテンツプロバイダが増えている(はてなブログも現状はrejectしている) なぜrejectするのかというと、負荷がかかる上に収益を奪われる形になるか…

Scalaで変数に入った値そのものにパターンマッチさせるときは変数をバックティックで囲うとよい

Scalaのパターンマッチは変数を使って分割代入ができる。 val xs = 1 :: 2 :: 3 :: Nil xs match { case head :: tail => s"head is $head" // => "head is 1" case _ => "not found" } これはxsに対してまずhead :: tail という式にマッチが試みられ、head…

Scalaで特定の警告をエラーにするには -Wconf:msg=FOOBAR:error と書けばよいので non-exhaustive match だけエラーにできる

Scalaコンパイラは、特定の警告メッセージに対してad-hocに警告からエラーに昇格させ、コンパイルを失敗させることができる。 以下のscalac optionを設定することで non-exhaustive match だけエラーにできる: -Wconf:msg=match may not be exhaustive:error…

NotebookLMをコキ使っている

仕事でいろいろな資料を読みつつ方針を決めないといけない、というシチュエーションが多々あるのだが、仕事でNotebookLMが使えるようになったので公開資料はそこに突っ込んで秘書代わりにしている。NotebookLMはURLを直接受け取れるので便利。勝手にfetchし…

見せるエラー、見せないエラー

マメにlogger.errorを書いていたところ、「そのエラーはユーザ起因で起こる(HTTPでいうと400系統)からログするのではなくてユーザに表示するのが筋」というレビューをもらった。 最終的にエラーをどうしたいのか、という観点で整理すると、エラーに対する対…

ScalaでSeq[A]にインデックスアクセスしてOption[A]を得るにはliftメソッドを呼ぶ

val xs = List(1, 2, 3, 4, 5, 6, 7, 8, 9) xs.lift(4) // => Some(5) xs.lift(42) // => None liftというのはある関数をOptionを返すように加工するようなときに使われる慣例的な名前で、今回は暗にapplyのことを指している。 www.scala-lang.org 元々lift…

Scalaの篩型ライブラリ Iron v3.0.0 がリリースされた / 構文がより簡潔になり、扱いやすく、強力に(ただし Scala 3.6.3 が必要)

Scala 3 には篩型(refinement types)を実現するためのライブラリであるIronが存在する。 blog.3qe.us このライブラリを使うと、非負整数とか、8桁の文字列とか、UUIDといった、元々の型に加えて制約を加えたものをそのまま型情報に載せて扱うことができる…

アーキテクチャとは環境に適合して進化した生物の形である

ソフトウェア開発のフンワリした話が好きなので、ここ最近思っていることを書きます。 会社で、「アーキテクチャとは」みたいなのをわいわい会話したり持ち寄る会があって、色々な側面からアーキテクチャについて考えるのだが、そこでボンヤリ思っていたこと…

「自分はどうすればいいか」という問いにハマらない

解の空間が広すぎるため。 考え事とか、単に少し不安を感じているとか、何らかの問題意識がある、というような時、「自分どうしよう」という問いに流されてしまうことがある。ボンヤリとAI大時代でやっていけるか不安、とか、自分の技術スタックが通用するか…

useCallback便利 / 👶赤ちゃん👶の自覚を持つ

Scalaおじいちゃんではある一方、自分はReact赤ちゃんなので、ことReactについてはしばしば初歩的なつまづきをやってしまう。もう本当にうんざりするほどしょうもないミスをする。本格的にReactやりだしてから1年ちょいくらいだけど、全然ヘボい*1。ヘボいな…

Scala Native 0.5.7 が出た -- バイナリの動的依存が大幅に削減

Scala Native 0.5.7がリリースされた。 github.com 主要なアップデートはリリースノートに書かれているが、面白いと思ったので紹介する。 Scala Nativeとは(おさらい) バイナリ互換性 C++標準ライブラリへの依存が削減 clasのvtableのレイアウトが最適化さ…

Scala CLIでスクリプトを書くときはビルドサーバが立たないようにすると良い(かも)

Scala CLIはScalaの便利コマンドラインツールで、スクリプト実行やREPL、パッケージングなどをやってくれる。今回はスクリプティングの話。 blog.3qe.us Scala CLIはビルドサーバを起動する Scalaはコンパイル型の言語であり、JVMでコンパイラが動作するとい…

部分から全体で考えたほうがうまくいきやすい

オチのない日記。 Next.jsで(といってもNext固有の要素はない。)タブがいくつも出るような画面の処理を実装していて、最終的に欲しいものは色々がソートされた配列にコンポーネントが入っている(そしてそれをレンダする)、という具合の仕事をしていた。なん…

データリモデリングを検討する局面でどう考えるか

今やっているプロジェクトで、とあるデータの持ち方が今のままで良いか考えて検討する、というタスクがあって、例えば将来の要件追加とかを想定して重厚にリモデリングしておくのか、それとも現状のモデルで耐えられる+将来的な変更は多少のパッチでなんとか…

Dry-runを実現する定番テク知りたい

ソフトウェア開発の現場では、スクリプトを発射してシステムになんらかの変更を加える、ということがよくある。DBに変更を加えたり、なんかを削除したりといった具合。専用の管理画面をわざわざ実装するまでもない、というときに使われがち。 Dry-run スクリ…

Scalaで空文字列をNoneにしたいときはfilterすると良い

こんな文字列があるとする: val s1 = "foo" val s2 = "" これを、以下のような感じにしたいことはまあまあある: val s1a = Some("foo") val s2a = None つまり、以下のようなルールだ: 文字列sが空の場合、None。 それ以外の場合は、Some(s)。 素朴にmatchを…

ペアプロで何に気をつけているかの知見紹介

ここ最近は開発が佳境で、同僚とかなりの頻度でペアプロ(ペアプログラミング)(ここではペアオペも含む)している。主にTypeScriptを使ったNext.jsのコードを書いているが、もちろん設計もするし、もうちょっと大きいアーキテクチャみたいな相談もする。DB…

何かがそれほど得意でなくても、世の中の平均よりは得意だと思っておいたほうがよい

仕事とかプライベートとかで、ものすごく頭が回るときと、エンストしたようにまるで回転しないときとがあり、その差はどこから来るのだろうと考えていた時期があった。 結論から言うと、自分の場合、「それを得意だと思っているかどうか」によって頭の回転具…

Scalaにもpackage-lock.jsonが欲しい!sbt-dependency-lockの紹介

先日、言語の塩漬けビリティの話がネットで盛り上がっていた。 言語とそれをとりまくエコシステムの塩漬けビリティみたいな概念が、†生産性†みたいな概念とは独立した軸に存在しているような気がしており、JavaとかCは異常にこのへんが手堅く、だから選ばれ…

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