Lambdaカクテル

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

技術

ScalaプロジェクトをMaven Centralにpublishするメモ

この記事はScalaプロジェクトをMaven Central Repositoryにリリースして全世界から使えるようにする手順をまとめたものである。作業は大別してSonatype側とビルドツール側とに分かれる。今回はビルドツールとしてMillを利用したが、作業の過半は同じである。…

CatsのfoldM(foldLeftM)を勉強した

foldMについてちょっと勉強したのでメモ。 文脈 おさらい: foldLeft foldM foldMの振る舞い 発展例: ルールエンジン foldMの出番 まとめ 文脈 このへんの会話が流れてきたけど、そういえばfoldM使ったことなかったな、と思った。 やはり traverse … traverse…

松竹梅はsortしても松竹梅になる

物事の順位付けをするとき、松竹梅という雅な表現がよく使われる。自分もよく使う。 blog.3qe.us コンピュータにとってもそうなのだろうか?そう考えた私は実際にソートしてみることにした。 % echo $LANG ja_JP.UTF-8 % sort --version sort (GNU coreutils…

Scala Stewardを自分のOSSに導入する方法(5分で可能)

Scala Stewardという、自動的にScalaの依存性をアップデートしてくれるソフトウェアがある。ざっくり言うと、Scalaに特化したRenovateやDependabotみたいなやつ。 github.com 謎のゆるいネコがマスコット 以下のようなPull-Reqを作ってくれる。どうやらbuild…

CoursierでScala CLIをアップデートできないときはcsをインストールし直すと良い

プログラミング言語Scalaには、Scala製のツールやアプリケーションをインストールする基盤としてCoursierというソフトウェアが用意されている。グローバルに使うソフトウェアをインストールするのに主に使われ、振舞いとしてはnpm install -gに近い。 get-co…

Millのテストディレクトリはsbtと構成が違うので注意

ScalaのビルドツールであるMillでテストを書こうとしたらsbtとディレクトリ構成が違っていて詰まっていたのでその違いを記しておく。 % mill --version Mill Build Tool version 0.11.2 Java version: 18.0.2, vendor: Amazon.com Inc., runtime: /home/wind…

zshでRPROMPT設定してるならtransient_rprompt設定しましょう

職場のScrapboxで、 はてなのエンジニアのPS1が集まってくるページというページが盛り上がっていた。要するにシェルプロンプトどうしているかという話題。 そんな中zsh使っている同僚がRPROMPTに情報を集約してると言っていた。RPROMPTというのは画面の右側…

ScalaのビルドツールMillが生成するUberjarはZIPファイルの面白仕様を使ってシェルから直接実行できるようになっている

プログラミング言語Scalaで最もよく使われているビルドツールといえばsbtだ。起動しっぱなしのインタラクティブ仕様なsbtがやや鈍重なきらいがある一方、もう1つのビルドツールであるMillが開発されており、こちらではnpmのようなシェル単位の操作体系を指向…

sbtの依存性定義でたまに見るtestやprovidedとは何か--コンフィギュレーションについて学ぼう

sbtはかつてsimple build toolと呼ばれていた(今は酢豚の略とされている)。しかしビルドツールというのは本質的に難しい。複数の依存性を解決し、コンパイラ達が吐き出す成果物を統合し、1つあるいは2つ以上の最終成果物にしなければならないのだから、複雑…

sbt-packでScalaのDockerイメージを作る

以前、sbt-native-packagerでScalaのDockerイメージを作る方法を紹介した。今回はsbt-packを利用した、より軽量な手法を紹介する。 前回の記事はこちら: blog.3qe.us sbt-pack: 1つのディレクトリにまとめる君 sbt-packを聞いたことがなくても、sbt-assembly…

Scala 3から導入されたParameter Untuplingが便利

Scala 3でParameter Untuplingという機能が追加された。この機能は従来Scala 2で問題となっていたタプルまわりの取り回しを大きく改善する。 Parameter Untupling 従来、F[(A, B)]のような型(例えばSeq[(String, Int)])に対してmapを行うときは、caseを使っ…

AWS LambdaでScala 3をContainer imageで動作させる

先日(といっても結構前のことだが)、Scala 3のLTSサポートバージョンである3.3.0がリリースされた。Scala 3の開発が円熟してきているようで嬉しい。これからも元気でいてね。今回はScala 3をAWS LambdaのContainer imageを使って動作させる手法についてお…

勉強の型を身に付けたい話

最近は、おもしろ技術について興味のおもむくまま手を動かしたりしていると詳しくなっている、というパターンが多い。一方で、コツコツ必要なことを学んで(応用の効く)体系的な知識を手に入れる、という行為にもあこがれがある。 例えば最近はScala.jsのビ…

推測するな、計測せよ、ただし予測せよ

会社で1on1をやった。そのときに、ツメが甘い状態を脱することで、より良いエンジニアになれるという話で盛り上がった。よく詰められている状態だと大きな成果を発揮できている。だからその状態を持続させたい。他方でツメが甘い状態になりがちである。それ…

Akka(2.8) PersistenceでSerializerとしてCirceを使う方法

Akka PersistenceはAkkaでイベントソーシングを行い、アクターの状態を永続化するためのライブラリである。 doc.akka.io イベントなどの永続化にJSONライブラリであるCirceを使ったのでその手順をメモしておく。ここではAkka Persistenceの導入そのものの話…

Akka(2.8)でアクターの監視(Supervise)を行う

Akka 2.8でActorがクラッシュした場合にどのように振る舞うかについて調べる機会があったのでメモ。 ライブラリ依存性は以下の通り: libraryDependencies += "com.typesafe.akka" %% "akka-actor-typed" % "2.8.3 Actorの監視 通常のプログラムは例外をキャ…

コードコミュニケーションによるMP減少を雑談で補充している

就業間際、ちょうどその日は疲れていたのでくたくたになっていていて、コードレビューの指摘を打ち返す気力が出ずに黙って修正を受け入れる、という感じになってしまうことがあるけど、当然同僚はコードを良くするためにレビューしているので、どっちが良い…

Scalaのコーディングスタイルガイドでは名前は短いほうがいい

仕事でこういうシチュエーションに遭遇した。 foo.bar.buzz.Piyoというクラスがある(パッケージがfoo.bar.buzz) 同名のhoge.fuga.Piyoというクラスがよそのパッケージにもある(パッケージがhoge.fuga) こういう場合、BuzzPiyo / FugaPiyoみたいに弁別できる…

古代文明の謎を追うようにコードや仕様を読む / 「理解」のシノニムを具体的に決めてみる

ツイッターにも書いたが、エンジニアをやってる根源的な動機として、「難しいけどイケてる仕組みを理解わかりてェ・・・」というものがあり、それに衝き動かされてソフトウェアエンジニアという職をやっているようなところがある。 その一方で、難しい仕組み…

Akka HTTPでContent-Typeを設定する方法

Akka HTTPは素朴なライブラリなので、特にそういうプラグインを使っていない場合は自分でレスポンスのContent-Typeを設定する必要がある。この記事では、Akka HTTPでContent-Typeを設定する方法と、Acceptヘッダを設定する方法を説明する。 この記事ではAkka…

ScalaCheckで任意の範囲のDateTimeを生成するGen

プロパティベースドテストを行うライブラリであるScalaCheckには、任意の値を生成できるGenという仕組みがある。任意の日付時刻を生成するためのGenを定義したメモを残しておく。 Gen Genとは値を生成するためのジェネレータである。例えばGen.longは任意のL…

エンジニア入門者に習得してほしい「熟考」とは何か、それは論理的飛躍の最小化ではないか

会社の1on1があって、 id:yigarashi と30分くらい話したら面白い話がいろいろできたので紹介する。掲題ではエンジニアと書いているが、別にウェブ系ソフトウェアエンジニアに限られた話でもないし、ホモサピエンス全員におすすめ、考える葦の皆様におすすめ…

ActivityPubで投稿を表示できるようにした

これは雑な日記。 blog.3qe.us blog.3qe.us こういうことをやっていた。HTTP Signatureの仕様がバラけていたり、フィールド名の内容をなぜか勘違いしてい(publishedフィールドにはその投稿を作成した時刻が入るのだが、なぜか投稿のURLを入れてしまっていた…

SHA-256ダイジェストをBase64で得る(hex形式をBase64に変換する)

わけあってHTTP Signatureの実装をしており、SHA-256と仲良くしようと頑張っている。 asnokaze.hatenablog.com しかし、HTTP上ではSHA-256ダイジェストはBase64で表現されることが多い一方で、linuxでsha256sumコマンドを使ってもhex形式で結果が返るので、…

ScalaのJSONライブラリであるCirceで余分なフィールドを持つJSONをデコードする

ScalaのJSONライブラリであるCirceは、JSONをパースしてさらにcase classへと変換してくれる機能があるけれど、余分なフィールドがJSONに生えていたらどうなるのか気になったので試してみた。 build.sbt 依存性は以下の通り。 scalaVersion := "3.2.2" libra…

ActivityPubサーバを実装したかったのでまとめWikiを作ったら人々が集いつつある

最近のTwitterの荒れ具合と、Fediverseへの流入がいちじるしい。そんな中自分は、Fediverseという愉快な電網の共通語であるActivityPubの上で、botを動かそうと練習を重ねている。 blog.3qe.us この情報を自分のアカウントで発信していると、ActivityPubの実…

田舎の昼のサイレンbotをActivityPubで実装する(マストドンにアカウントを認識してもらう編)

田舎の昼のサイレンbotというbotがある。正午にウゥーーーーとつぶやくだけの、謎のbotである。 https://twitter.com/Noon_Siren_bot 最近Twitterもあやういので、練習もかねてActivityPubに移植し、マストドンやMisskeyから閲覧できるようにしようと思った(…

Twitterに投稿できなくて困っています & こっちにいます

www.itmedia.co.jp こういったニュースが話題ですが、 僕は投稿もできなくて困っています。シャドウバン的なやつ?スパム認定された? 追記 なぜかRTはできるようなので、アカウント名に助けてくれ〜というメッセージを添えて程々にRTを行ってメッセージを伝…

Scala.jsを介したJavaScriptのObjectとの相互運用について勉強した

Scala.jsはScalaからJavaScriptのトランスパイラであり、執筆時点でバージョン1.13.2を記録しており、活発に開発が行われている。加えて、これを補助するコンパイラプラグインであるScalablyTypedによるTypeScriptの型定義からScalaの型定義への転写によって…

TypeScriptのvoidをasync voidとして継承できる / ScalablyTypedによるTypeScriptライブラリとScala.jsとの相互運用で、async functionがうまく変換されない問題

困っているので、思考の整理を兼ねてメモしておく。各項目がまちがっていたらおしえてください。 動機 Scala.js ScalablyTyped ScalablyTypedにおけるvoid ScalablyTypedにおけるasync TypeScriptにおけるasync void TypeScriptにおけるvoid methodのasynchr…

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