第11回Center CLR勉強会
忙しかったので準備も大変だったけど、終わってからもこれを書く時間が取れずにもう木曜日...
今回の私の登壇は、去年(2025)の成果の2つを (忘れないうちに) 発表するという感じでした。
伝えるべき情報を結構絞ったのですが、それでも1セッション辺り60ページ超えてるので、 1ページ1分弱のペースで喋る必要があり、ずっと喋り続けて喉が痛い...
でもこれで安心して脳の記憶スペースを空けることが出来たので、肩の荷が降りました (忘れないように色々覚え続けておくのは辛い)。
後で動画公開しようとして録画はしたのですが、残念ながら音声不良のためボツとなりました。
以下に私のセッションの内容について少し紹介します:
あなたが必要だったNuGetサーバー
キャッチーなタイトルを付けてしまった...
一言で言うと、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 はもう十分有名な地図表示のためのライブラリプロジェクトですが、 多数の移動体(移動する物体)を表示するには難しい問題があります (多数の動かない地物を表示するのは全く問題ない)。 それで、MapLibreには、いわゆるプラグインインターフェイスが存在するので、これを使って多数の移動体を表示できるように拡張できる 「レイヤーライブラリ」を実装した、という話です。
フィーチャー:
- 大量のスプライトを配置・変更・削除できる。
- 各スプライトの座標点を自由に移動出来る。つまり、移動体を簡単に表現できる。
- 各スプライトには、座標のアンカー位置を指定できる。精密な位置の描画が可能。
- 各スプライトには複数の画像を追加出来て、回転・オフセット・スケール・不透明度などを指定できる。同様にテキストも配置できる。
- スプライトの座標移動・回転・オフセットをアニメーション補間出来る。
- 画像の重なりを制御するための、サブレイヤーとオフセット指定も可能。
- 完全命令型API。高性能かつ拡張性のある更新を実現。
- WASMとシェーダーによる計算処理の高速化。
この取り組みでも、経験の無かった方面 "WebGL", "WASM", "SIMD" について取り組んでいます (SIMDはSSE2までは少しかじったことがある)。
WebGLやWASM未経験から始めて見えた部分や失敗したことなどを色々紹介しています。
私はネイティブC/C++開発については経験があるので、そういう低レイヤーから眺めるこれらの技術、というような視点も少しあります。 特にウェブ界隈は高レイヤーなアーキテクチャの話が多いので、なんだか「ブラウザのはらわたを弄ってる」感じがして面白かったです。
機能面で言えば当初目標は十分に達成しているので、このプロジェクトも良い感じで終えることが出来ました。
ところでこのセッションでは、WASMの開発環境としてC/C++ (Emscripten SDK) を使った、という話しかしなかったのですが、 Emscripten SDKの準備をするのが割と面倒 (難しくはない) という問題があって、これを簡単に実現する emsdk-env も作っています。
(だいたい、開発環境周りを整備するために必要な道具も作る、みたいな事をやってるから苦労するんだというのは自覚がある...) これについては、近々ここに説明を載せようと思います。と言っても、私の書いているプロジェクトは、必要な情報をREADMEに盛り込むことが多いので、 被らない範囲の何かを書くことになると思います。
次回の開催
まだ第12回は未定ですが、しゃべるネタは色々あるので、梅雨か夏の前ぐらいを目処にconnpassに立てると思います。 特に中部圏の方は、ぜひご参加下さい。

