第11回Center CLR勉強会

Center CLR No.11

忙しかったので準備も大変だったけど、終わってからもこれを書く時間が取れずにもう木曜日...

今回の私の登壇は、去年(2025)の成果の2つを (忘れないうちに) 発表するという感じでした。

伝えるべき情報を結構絞ったのですが、それでも1セッション辺り60ページ超えてるので、 1ページ1分弱のペースで喋る必要があり、ずっと喋り続けて喉が痛い...

でもこれで安心して脳の記憶スペースを空けることが出来たので、肩の荷が降りました (忘れないように色々覚え続けておくのは辛い)。

後で動画公開しようとして録画はしたのですが、残念ながら音声不良のためボツとなりました。

以下に私のセッションの内容について少し紹介します:

あなたが必要だったNuGetサーバー

nuget-server - あなたが必要だったNuGetサーバー
by Kouji Matsui
speakerdeck.com
Kouji Matsui

キャッチーなタイトルを付けてしまった...

一言で言うと、2025年現在 (もう去年だけど) 、プライベートでサクッと立ち上げることが出来る定番のNuGetサーバーが存在しないと思われるため、 自分で作った、という話です。

フィーチャー:

  • NuGet V3 API互換性:最新のNuGetクライアント操作をサポート
  • データベース管理不要:パッケージファイルとnuspecをファイルシステムに直接保存、データベース管理から解放
  • パッケージ公開:cURLやその他のツールでHTTP POSTを使用して.nupkgファイルを柔軟にアップロード
  • 基本認証:必要に応じて公開と一般アクセス用の認証を設定
  • リバースプロキシサポート:適切なURL解決のための信頼できるリバースプロキシ処理を設定可能
  • 拡張機能を備えたモダンなWeb UI:
    • 複数パッケージアップロード:複数の.nupkgファイルを一度にドラッグ&ドロップ
    • ユーザーアカウント管理:ユーザーの追加/削除、パスワードリセット(管理者のみ)
    • APIパスワード再生成:セルフサービスでAPIパスワードを更新
    • パスワード変更:ユーザーは自分のパスワードを変更可能
  • パッケージインポーター:既存のNuGetサーバーからのパッケージインポーター付属
  • Dockerイメージ利用可能

特に、ゼロコンフィグレーションにはこだわりました。要するに、これだけで起動します (要Node.js):

$ npx nuget-server

何でそうしたのか? というバックグラウンドはスライドで軽く触れていますが、セッション中も色々背景を話しました。 そして、実際に仕事でも使ってドッグフーディングしていて、公開直前まで調整を行っていました。

他にも、Dockerイメージについてはマルチアーキテクチャ対応をやってみたかったので、その対応方法について解説しています。 普段はpodmanを使っているので、podmanでのマルチアーキテクチャ、具体的にはamd64(x86_64)とarm64(aarch64)の両方に対応させています。 今だと、Raspberry Piの32ビット向けにarmv7に対応させる事も出来るかもしれません。

podmanを使う場合は、クロスアーキテクチャ実行が可能なので、普通にDockerイメージを起動するかのように、異なるアーキテクチャのイメージを実行できます (素晴らしい) 。 この機能を使って、amd64環境のUbuntu 24.04上でarm64のビルドも行っています。 但し、この機能はqemuを使って実現しているようです。なので、クロスアーキテクチャイメージを起動すると、それなりに遅いです。

解説中にも補足しましたが、アーキテクチャオプションの指定が --platform linux/arm64 なんですよね。 もしかしたらpodmanのチームは、(マボロシの) Windowsコンテナに対応させる気があるのかもしれませんね。

地図に移動体たくさん表示したい

maplibre-gl-layers - 地図に移動体たくさん表示したい
by Kouji Matsui
speakerdeck.com
Kouji Matsui

え、何で (私が) いきなり地図? という疑問があるかもしれません。私もそう思います。 (仕事で) 必要だから作ったという、いつもの流れです。

MapLibre GL はもう十分有名な地図表示のためのライブラリプロジェクトですが、 多数の移動体(移動する物体)を表示するには難しい問題があります (多数の動かない地物を表示するのは全く問題ない)。 それで、MapLibreには、いわゆるプラグインインターフェイスが存在するので、これを使って多数の移動体を表示できるように拡張できる 「レイヤーライブラリ」を実装した、という話です。

フィーチャー:

  • 大量のスプライトを配置・変更・削除できる。
  • 各スプライトの座標点を自由に移動出来る。つまり、移動体を簡単に表現できる。
  • 各スプライトには、座標のアンカー位置を指定できる。精密な位置の描画が可能。
  • 各スプライトには複数の画像を追加出来て、回転・オフセット・スケール・不透明度などを指定できる。同様にテキストも配置できる。
  • スプライトの座標移動・回転・オフセットをアニメーション補間出来る。
  • 画像の重なりを制御するための、サブレイヤーとオフセット指定も可能。
  • 完全命令型API。高性能かつ拡張性のある更新を実現。
  • WASMとシェーダーによる計算処理の高速化。

この取り組みでも、経験の無かった方面 "WebGL", "WASM", "SIMD" について取り組んでいます (SIMDはSSE2までは少しかじったことがある)。

WebGLやWASM未経験から始めて見えた部分や失敗したことなどを色々紹介しています。

私はネイティブC/C++開発については経験があるので、そういう低レイヤーから眺めるこれらの技術、というような視点も少しあります。 特にウェブ界隈は高レイヤーなアーキテクチャの話が多いので、なんだか「ブラウザのはらわたを弄ってる」感じがして面白かったです。

機能面で言えば当初目標は十分に達成しているので、このプロジェクトも良い感じで終えることが出来ました。

ところでこのセッションでは、WASMの開発環境としてC/C++ (Emscripten SDK) を使った、という話しかしなかったのですが、 Emscripten SDKの準備をするのが割と面倒 (難しくはない) という問題があって、これを簡単に実現する emsdk-env も作っています。

(だいたい、開発環境周りを整備するために必要な道具も作る、みたいな事をやってるから苦労するんだというのは自覚がある...) これについては、近々ここに説明を載せようと思います。と言っても、私の書いているプロジェクトは、必要な情報をREADMEに盛り込むことが多いので、 被らない範囲の何かを書くことになると思います。

次回の開催

まだ第12回は未定ですが、しゃべるネタは色々あるので、梅雨か夏の前ぐらいを目処にconnpassに立てると思います。 特に中部圏の方は、ぜひご参加下さい。

リブート

とうとうブログをリセットすることにしました。

経緯

というよりも、以前から(かれこれ10年弱?)賞味期限切れ状態で久しかったのでリセットしたかったのですが、 リセット準備と言う名のやるやる詐欺が横行した結果、今の今まで伸び伸びになってしまってました。

理由の一つは、WordPressから脱却して、自分で設計したドキュメントサイトジェネレータに移行することだったんですが、 最初のバージョンが途中で頓挫し、それから作り直して形にするまでに時間が取れなくて数年経ってたという...

その、昔の作りかけのコードをようやくR.I.Pとしてアーカイブすることが出来ました。完成させられなくてごめんな。おやすみ。

新しいジェネレータのコードはもう公開してあるのですが、これについては今まさにドッグフーディングを始めたところなので、 紹介はまた今度の機会にしようと思います。

自らを試すため、これを公開したと同時に、以前のレンサバをバックアップ取らずに即解約したぞ

過去の記事をコンバートする事も考えたのですが、WPの記事の機械的な変換が結構面倒なのと、 最初に示したようにもう賞味期限切れの記事がほとんどだったので、思い切って捨てることにしました。

あれを読んで参考になったと言ってくれた人も居たので、ちょい惜しい気もしましたが、どうか忘れてください :)

近況

そんなわけで、最初の記事として何を書こうかと考えたんですが、近日にCenter CLRでしゃべる事もあるし(しかも3枠)、 その後のネタもどう発表するか考えあぐねていたこともあって、いざ書けるようになっても何書いて良いのかあんまり思いつかない...

なので、今取り組んでいることをリストアップしてみようかと思います。

最近は、仕事と趣味両方ともTypeScript環境主軸で、一部C/C++でコードを書いてます。 仕事専用のものは公開できないのですが、一部のコードはOSSにしつつ、仕事でも使っています:

  • nuget-server: NuGetサーバー。プライベートまたはチーム・個人運用の公開向けNuGetサーバー。簡単に立ち上げることが出来て、認証周りも出来て、データベース不要でモダンな外観でDocker imageもあってコマンドライン一発で起動もできるやつ(今度登壇して解説)。
  • maplibre-gl-layers: MapLibre GL JS用のプラグイン的なライブラリで、多数(>1000)のスプライトを同時にアニメーション動作させることができる。車両や地物のアイコン表示、識別のためのラベル表記、自動追尾など、これ一つで「動くターゲット」を地図に多数表示できます(今度登壇して解説)。
  • funcity: テキストプロセッサで関数型言語を使いたかったので実装した、テキストプロセッシング言語処理系。完全に機能します(恐らく)。awk+sed とかの代わりに使うことを強く想定しています。そのとおりに使えるかどうかはしらんけど。
  • mark-deco: markdownをHTMLに変換する際に欲しくなる、細々とした付随機能を全部盛り込んだ、変換ライブラリ(このサイトジェネレータでも使用しています)。
  • async-primitives: TypeScriptで非同期処理(Promise)やるときに道具が無さすぎて困るので、まとまったライブラリを作った。
  • prettier-max: ソースコード整形のPrettierを自動的に走らせる、Viteプラグイン。deprecated検出とかもできる。ESLintの管理に疲れたので作った。
  • screw-up: TypeScriptなどのトランスパイル結果の成果物に、バージョン番号等を自動挿入する、Viteプラグイン。RelaxVersionerの、TypeScript/NPM用的な位置づけ。バージョン計算アルゴリズムがRelaxVersionerと同一なので、両方を一元管理する場合は、Gitだけでバージョン管理できるので特に重宝する。名前が不吉なのは洒落だと思って忘れてください。
  • dir4json: ディレクトリ内のファイル情報をJSONで生成するやつ。dir2jsonがイマイチだったので2番煎じ。
  • typed-message: Reactアプリケーションのメッセージの多国語化。これもn番煎じだけど、これのアドバンテージは定義体のシンボルがタイプセーフになること。Viteプラグイン。
  • tar-vern: tarの他の実装の公開インターフェイスがイマイチだったので作った。screw-upで、NPMパッケージの操作に使用。
  • scheme-cd-ripper: CDのリッピングソフトウェア。CLI。Ubuntu/Debian向けのネイティブ実装。アルバムアート画像をAAで表示できるのが最大の売り(?)(今度登壇して解説)。
  • screw-up-native: screw-upが思いのほか良いツールに仕上がったので、将来を見越してネイティブ版を実装。C言語のみで実装。
  • ga_runner: GitHub Actionsで、イミュータブルビルドをプライベートランナーで実現するためのスクリプトセット。内部はpodmanでのコンテナリサイクル、GAのアップデートに自動追従など、GAのホスティングと同じような感じでランナーを使えるようにすることを目標にしたけど、まだちょっと詰めが甘いかもしれない。

あとはまだ完成が遠いものがいくつかあります(上に挙げたものは基本的に完成、もしくはほぼ完成のものです)。 数が多いので全部細かく紹介出来ませんが、いくつかはそのうちここで取り上げるかもしれません。

それではまた。

About

Kouji Matsui

  • Full name: Kouji Matsui.
  • kekyo, けきょ, kozy_kekyoというクレジットを使うことがあります。
  • 愛知県の付近のモグリで引き籠モラー。
  • 自転車乗りです(最近忙しすぎて乗れてない)
  • Center CLR主催しています。
  • バックエンドシステム・言語処理系とそのツールチェイン・ライブラリインターフェイス設計、などが主戦場/興味の中心。
  • 最近はTypeScript、またはC/C++、ハードウェアデザイン(コンピューター回路設計)辺り。 TypeScriptやってるとUIerと間違われそうだけど、専門領域は違います。 成果物はだいたい公開しているので、GitHubを参照してください。
  • 赤い色は、某WP 1520由来。今ではマイカラー。燃える赤 🔥

Links

おことわり

  • 本サイトではGoogle Analyticsによる統計を参照しています。 この情報は、私がこのサイト内のアクセス状況を見て、自分でご満悦、あるいは失望するためだけに把握します。 また、閲覧者が何らかのツールでこのトラフィックをブロックしても全く問題ありません。
  • ページに含まれるリンクには、Amazonのアフィリエイトリンクが含まれる可能性があります。ご了承ください。一杯おごるつもりで踏んで貰えると嬉しいです。