虫眼鏡でコードを検査するコンセプトイメージ

AIが見たことのない.NET UIフレームワークでIDEを作るとき、エージェントはどうやってAPIを把握するのか

2026-02-08 — LibraStudio開発記 #1 背景 なぜまた別の.NET IDEなのか .NETエコシステムにおけるIDEの選択肢は、実はそれほど広くありません。Visual Studioは強力ですがWindows専用であり、Community Editionでさえ商用利用に制約があります。VS Code + C# Dev Kitの組み合わせも優れていますが、C# Dev Kitがプロプライエタリライセンスである点は変わりません。結局、重要な部分でベンダーロックインが発生し、その上に構築したツールチェーンとワークフロー全体が特定ベンダーの意思決定に依存してしまいます。 かつてはSharpDevelopがWindowsで、MonoDevelop(Xamarin Studio)がクロスプラットフォームでその役割を担っていました。しかしSharpDevelopは2017年に開発が停止し、MonoDevelopはXamarinに統合された後、事実上スタンドアロンIDEとしての役目を終えました。それ以降、最新の.NET(Core以降)開発環境を適切にサポートするオープンソースでリベラルライセンスのクロスプラットフォームIDEは登場していません。 この点がずっと惜しいと感じていました。そこでLibraStudioを始めました。ElectronやVS Codeベースではなく、純粋な.NETネイティブIDEを目指します。一人でVisual Studioレベルのものを作ろうというわけではありません。しかし2026年にはAIベースのコードエディタの力を借りることができます。AIエージェントにフレームワークAPIの探索、ボイラープレートの生成、繰り返しの実装を委任すれば、一人でカバーできる範囲は過去とはまったく異なります。 UIフレームワークにはAprillz.MewUIを使用しています。NativeAOTに対応し、XAMLなしでC#コードだけでUIを構築する軽量フレームワークです。このフレームワークは、私と同じく韓国の代表的な.NET開発者コミュニティであるDotNetDev(.NET Dev、https://forum.dotnetdev.kr/)で活動しているソン・ヨンジェ氏のオープンソースプロジェクトです。 AIが知らない新生フレームワークという難関 MewUIはまったく新しいコンセプトの新生UIフレームワークです。XAMLベースのWPFやAvaloniaUIとは異なり、純粋なC# fluent APIでUIを構築する独自の設計を持っています。当然、公式ドキュメントが豊富ではなく、Stack Overflowに関連する質問が蓄積されてもいません。 これに.NETというプラットフォーム自体の問題も重なります。大規模言語モデルの学習データにおいて、.NET/C#はJavaScriptやPythonに比べて相対的に学習頻度が低いです。メジャーフレームワークであるWPFやWinFormsでさえ不正確なコードを生成することがあるのに、学習データにほとんど含まれていないMewUIのAPIを正確に当てる可能性は極めて低いです。 このような状況でAIコーディングエージェントに「最小限のタブベースのテキストエディタを作ってください」と依頼すると、何が起こるでしょうか。 一般的なアプローチ:推測と反復 通常のAIコーディングエージェントのワークフローは次のとおりです: 学習データから類似のAPIを思い出してコードを書きます ビルドします エラーが出たらエラーメッセージを見て修正します 2〜3を繰り返します この方式は、学習データに豊富に含まれているメジャーフレームワーク(WPF、React、SwiftUIなど)ではうまく機能します。しかし、MewUIのようにまったく新しいコンセプトの新生フレームワーク――しかも相対的に学習頻度が低い.NETベース――では、推測の精度が極めて低くなります。メソッド名、パラメータの順序、オーバーロードの有無、イベントシグネチャ――すべてが外れる可能性があります。 別のアプローチ:アセンブリを直接覗く 今回の作業では、私自身が開発したHandMirror MCPを使用しました。HandMirrorは、NuGetパッケージのコンパイル済みアセンブリを直接検査するMCP(Model Context Protocol)サーバーです。 Webドキュメントを検索する代わりに、実際の.dllを分析し、次の情報を返します。注目すべきは、HandMirrorが一般的な.NETリフレクション(System.Reflection)ではなくMono.Cecilを使用している点です。Cecilは.NETアセンブリのメタデータをランタイムロードなしに直接読み取るため、検査対象アセンブリの.NETランタイムバージョンに影響されません。.NET Framework 4.x用ライブラリでも.NET 10対象でも同様に分析できます: すべての名前空間と型の一覧 各型のコンストラクタ、プロパティ、メソッド、イベントのシグネチャ Extension methodがどの名前空間にあるか 継承階層構造 実際に得られた情報 Aprillz.MewUI v0.9.1を検査した結果: 178個のパブリック型、14個の名前空間 MultiLineTextBoxがTextBaseを継承し、Text、Placeholder、AcceptTab、Wrap、IsReadOnlyなどのプロパティを持つこと TabControl.SelectionChangedがAction<int>であること(ドキュメントがなければAction<TabItem>と推測していたでしょう――実際そうでした) FileDialog.OpenFile()がOpenFileDialogOptionsを受け取り、Title、Filter、Ownerなどのプロパティを持つこと Menu.Item()とContextMenu.Item()のオーバーロードが異なること――Menu.Itemにはショートカット文字列パラメータがない ObservableValue<T>がSubscribe()、NotifyChanged()、Set()メソッドを持つこと この情報だけで、エディタのコアコードをほぼ正確に記述できました。 結果:初回ビルドでエラー3個 コード全体を書き上げた後、初回ビルドで発生したエラーはわずか3個でした: エラー 原因 Menu.Item("text", "shortcut", action) — オーバーロードなし ContextMenu.ItemにしかないショートカットパラメータをMenu.Itemでも使用 BorderThickness(0, 1, 0, 0) — 4パラメータのオーバーロードなし 実際にはBorderThickness(double)の単一パラメータのみ存在 SelectionChangedの型不一致 HandMirrorがAction<int>と教えてくれたが、コードで誤ってAction<TabItem>を使用 3つ目は純粋に読み取った情報をコードに誤って反映したミスでした。HandMirrorが提供した情報自体は正確でした。 ...

2026年2月8日 · 2 分 ·  rkttu
オープンソースプロジェクト間の協力とコードポーティングを象徴するイメージ

AI時代のオープンソース貢献:HwpLibSharpポーティングプロジェクトから学んだこと

AI時代のオープンソース貢献:HwpLibSharpポーティングプロジェクトから学んだこと Microsoft MVPとして活動して17年になります。その間、.NETコミュニティで最も多く受けた質問の一つが「C#でHWPファイルをどう扱えばいいですか?」でした。韓国のハンコム社の公式ライブラリはWindowsとCOMベースであり、クロスプラットフォーム.NET環境では事実上、解決策がありませんでした。 そんな中、@neolord0さんのhwplibを見つけました。Javaで書かれた、純粋にHWPファイルフォーマットをパースするオープンソースライブラリです。「これを.NETに移植すればコミュニティに貢献できる」とすぐに思いましたが、簡単なことではありませんでした。コードベースが膨大な上に、今も継続的にアップデートされていたからです。 2026年、AIコーディングアシスタントと共にこの作業を始めました。 一回限りのポーティングではなく「同期化」 一見、HWPは頻繁に変わるフォーマットではないため、一度ポーティングすれば手を加える必要はないと思いがちです。しかし、あらゆる技術は変化し続けます。元のプロジェクトが今も活発にメンテナンスされているのはもちろん、.NET技術自体も進化しているため、一回限りの作業では不十分です。 従来のフォーク(fork)は、時間が経つほど原本との距離が開きます。最終的に「自分たちのバージョン」と「オリジナル」がそれぞれ別の道を歩むことになります。当然の流れですが、それでも別のアプローチを選びました。単なるフォークではなく、原本と共に生き続ける「移植された実装(Ported Implementation)」 というアイデンティティを明確にしたのです。 元プロジェクト: hwplib (Java) ↓ 定期的な同期 ポーティングプロジェクト: HwpLibSharp (C#) ↓ .NET特化の改善 エコシステム拡張 そのため、READMEにもこう記載しました。 「本プロジェクトの意思決定および判断の優先権は、オリジナルプロジェクトの作者である @neolord0 氏の意思を優先します。」 これは礼儀のために書いた文章ではありません。2つのプロジェクトが長期的に共存するためには、誰が方向性を決めるのかを最初から明確にする必要があると判断したからです。 AIと共に行ったポーティング作業 正直に言えば、AIコーディングアシスタントなしでこのプロジェクトを進めていたら、初期ポーティングだけで6ヶ月以上かかっていたでしょう。アップストリーム同期は到底手が出せず、結局放置された「もう一つのレガシー」になっていたはずです。 しかし、AIと一緒に作業することで、まったく異なるアプローチが可能になりました。 AIがうまくできたこと 構文変換はほぼ完璧でした。Javaのgetter/setterをC#プロパティに変換し、命名規則をC#コンベンションに合わせ、nullチェックをNullable参照型に変換する作業は、ほとんど自動化できました。 ライブラリのマッピングでもAIの助けは大きかったです。Apache POIをOpenMcdfに置き換える際、「Javaでこのライブラリが果たす役割を.NETでは何で代替できるか」を素早く見つけてくれました。元プロジェクトがアップデートされるたびに変更点を追跡してC#バージョンに反映する反復作業でも、ヒューマンエラーを大幅に削減してくれました。 Upstream変更の自動追跡 この過程で特に効果的だったのは、AIエージェントを活用したupstream変更の自動追跡方式でした。元のhwplibプロジェクトに新しいコミットが入るたびに、AIエージェントが変更されたJavaソースファイルと対応するC#ソースファイルを比較分析し、実装上の差異を検出します。 この同期を体系的に管理するために、ポーティングされたすべてのC#ソースファイルの先頭に、元のJavaファイルとの対応関係を明示するヒントヘッダーを残しました。 // ===================================================================== // Java Original: kr/dogfoot/hwplib/util/compressors/Compressor.java // Repository: https://github.com/neolord0/hwplib // ===================================================================== このヘッダーがあれば、AIエージェントは「このC#ファイルの元はJava側のどのファイルか」を即座に把握できます。upstreamでCompressor.javaが変更されると、AIが対応するC#ファイルを見つけてdiffを分析し、不足している変更点や実装上の差異をレポートしてくれます。人間が数百のファイルを一つずつ照合する必要なく、AIが「この部分が原本と異なっているので確認が必要です」と教えてくれる方式です。 実際にこの方式を導入した後、upstream同期にかかる時間が従来比80%以上短縮されました。以前は変更ログを読んで関連ファイルを一つずつ探しながら手動で反映していたのが、今ではAIが変更リストと影響範囲を自動的に整理してくれるようになりました。 AIができなかったこと 一方、HWPファイルのSection-Paragraph-Control構造、各コントロールの意味、韓国語ワープロ文書ならではの特性といったドメイン知識は、完全に自分の役割でした。AIがもっともらしく提案したコードが実際に正しいかどうかの検証は、やはり人間がやるべき仕事です。 戦略的な意思決定も同様でした。Native AOTをサポートするか、Blazor WebAssemblyでどう動作させるか、どの.NETバージョンまでサポートするか。こうした判断には.NETエコシステム全般への理解と、実際のユーザー環境に対する感覚が必要です。ライセンス文言、原作者との関係設定、韓国の開発者コミュニティの文脈を反映する作業も、AIが下書きを作り、自分が仕上げるという方法で進めました。 .NETエコシステムに合わせた再設計 単にコードを移すだけで終わりではありませんでした。.NET開発者が自然に使えるよう、原本プロジェクトの哲学と意図を損なわない範囲でAPIを整える作業も必要でした。 // Blazor WebAssemblyサポート(ファイルシステムなしでストリームから) var hwpFile = HWPReader.FromStream(memoryStream); // Native AOT互換、URLからの非同期ロード var hwpFile = await HWPReader.FromUrlAsync(url); これらの機能はオリジナルのJavaバージョンには存在しません。しかし.NET開発者なら当然期待するものです。おかげで、Azure FunctionsでHWPを処理したり、Blazorでブラウザ上にHWPをレンダリングすることも可能になりました。 ...

2026年2月7日 · 1 分 ·  rkttu
AIコーディングツールと開発者のバランスの取れた関係

AIコーディングツール、「遅れをとる」という不安に振り回されない方法

最近のAIコーディングツール業界のニュースを見ていると、新しいツールが登場するたびに「これが未来だ」「使わなければ遅れをとる」というメッセージが過度に強調されているのがわかります。バックグラウンドエージェント、並列AIセッション、自律コーディング—毎週新しい概念が登場し、それを導入しなければ時代に遅れているかのように感じさせられます。 しかし、このようなメッセージをそのまま受け入れることが本当に健全なアプローチでしょうか?私はそうではないと思います。 Hypeはどのように作られるのか AIコーディングツール業界のhypeには構造的な理由があります。AI技術で収益を上げなければならない企業の経営者は、投資家や株主を満足させなければならない立場にあります。そのため、彼らのメッセージには二重の聴衆問題が存在します。開発者には「生産性向上」を約束しながら、同時に投資家には「市場支配力」と「不可欠なツール」という物語を提供しなければなりません。 この過程で「半分だけ正しい言葉」が溢れ出します。「AIがコーディングを革新する」は間違っていませんが、「今すぐこのツールを使わなければ淘汰される」という飛躍が一緒にパッケージングされます。完全な嘘は簡単に反論されますが、誇張された真実は検証が困難だからです。 このようなメッセージはAI企業から始まり、先を行こうとする一部の企業の経営者や技術リーダー、そしてインフルエンサーを経て、実務開発者に届きます。問題は、中間の伝達者たちが自分の利害関係のためにメッセージをフィルタリングするよりも、より強く増幅させる傾向があるということです。「最新技術を導入している」というイメージ自体が彼らの市場でのポジショニングであり営業ツールになるからです。 バックグラウンドエージェントの約束と現実 最近強調されているトレンドの一つが「バックグラウンドエージェント」です。VS CodeのAgent HQ、Google AntigravityのManager Viewなどの機能が代表的です。これらのツールの核心的な約束は、タスクを委任すればAIが別の環境で自律的に実行し、開発者は他の作業ができるというものです。複数のエージェントを並列で実行すれば生産性が何倍にも向上するという主張も付いてきます。 しかし、この約束には根本的な問題があります。バックグラウンドエージェントは本質的にHuman-In-The-Loop(HITL)を意図的に排除する方向で設計されています。「非同期作業」「自律実行」「委任後の確認」という概念自体が、中間介入ポイントをなくすことを前提としています。 実際に事故はすでに発生しています。GoogleのAntigravityエージェントがハードドライブのパーティション全体を削除した事件が報告されています。従来のチャットウィンドウで作業する場合、各ステップで結果を確認して途中で介入できますが、バックグラウンドエージェントは間違った方向に進んでも完了するまで認識しにくいのです。 免責条項とマーケティングの矛盾 興味深い点は、すべてのAIサービス事業者が「AIは間違える可能性があるので必ず確認してください」という免責条項を明示していることです。しかし同時に、マーケティングでは「自律的に働くエージェント」を強調しています。この二つのメッセージを同時に真剣に受け止めると、並列エージェントの効用はかなり限定的にならざるを得ません。 「複数のエージェントを並列で実行してこそ本当の生産性」という主張は、「AI出力は必ず確認せよ」という警告と正面から衝突します。一つのセッションの出力でも検証が必要なのに、それを五つ同時に実行すれば検証の負担が五倍になるのであって、生産性が五倍になるのではありません。ボトルネックが生成から検証に移動するだけで、全体のスループットが線形に増加するわけではありません。 逆説的に、五人を並列で投入しても、管理と確認なしには品質は保証されません。調整コストが増加し、一貫性が崩れ、成果物の品質のばらつきが大きくなります。これはソフトウェアエンジニアリングで数十年間繰り返し検証されてきた事実です。AIエージェントがこの原則から自由である理由はありません。 技術リーダーが持つべき姿勢 CTOや技術意思決定者の立場から見ると、この状況で最も重要な徳目は「冷静な距離感と判断」です。問題はこれを実践するのが構造的に難しいということです。冷静な判断を下すと「革新に消極的だ」「トレンドを知らない」という評価を受けるリスクがあり、その判断が正しかったことは数年後にようやく検証されます。 マクロ的に見ると、技術に対する深い理解(アンカー)がない状態で意思決定をしなければならない経営者は、外部のシグナルに頼らざるを得ません。しかし、そのシグナルの大部分が利害関係の絡んだソースから来るため、簡単に不安になり、簡単に焦ってしまう脆弱な状態に置かれることになります。 一つの実用的な代替案はLab戦略です。実験の範囲とコストを制御しながらも、組織が新しい技術を学習し評価できる空間を確保することです。失敗コストが低い領域(内部ツール、プロトタイプ)では積極的なツール選択を許可し、コアビジネス領域には検証済みのツールを維持します。こうすれば「私たちもAIツールを積極的に活用している」という物語を維持しながら、実際のビジネスリスクは管理できます。 ツール(Harness)の重要性:馬と馬具の比喩 最近、AnthropicのリサーチャーBoris Chernyが興味深い比喩を提示しました。「Claudeは馬(horse)で、Claude Codeはharness(馬具)だ。馬に乗るには鞍が必要で、その鞍が馬に乗る時に大きな違いを生む」というものです。彼の説明によると、AIコーディングが長い間うまく機能しなかった理由は、モデルが十分に良くなかったこともありますが、モデルの上のscaffolding(ツール)が十分に良くなかったことも大きな理由でした。 この比喩で重要な点は、人間のプログラマーがまだループの中にいるということです。馬具を使って馬を望む方向に導くように、開発者はツールを通じてAIを制御します。そして、そのツールの品質が成果物の品質を大きく左右します。 伝統的なIDEインフラの再発見:Visual Studio 2026の事例 この文脈で、Visual Studio 2026のデバッガエージェントは注目に値します。この機能は、単体テストが失敗した時に次のプロセスを自律的に実行します。ワークスペースからコンテキスト(テストコード、関連ソース、最近の修正)を収集し、失敗原因についての仮説を形成し、分析に基づいてコードを修正し、デバッガでテストを実行して検証し、問題が続けばデバッガのインサイトを活用して仮説を精緻化し、テストが通過するまで繰り返します。 ここで重要なのは、これらすべてが数十年間蓄積されたIDEインフラの上で動作するという点です。ブレークポイント操作、変数状態のリアルタイム追跡、コールスタック分析、シンボル解決、プロファイリング—これらはターミナルベースの軽量エージェントでは簡単に実装できない領域です。AIが「仮説を立てて検証する」ことは、このようなインフラが支えてこそ意味のある自動化になります。 .NET開発者の観点から見ると、トレンドに従ってターミナルベースのツールに移行することが必ずしも生産性向上を意味するわけではありません。むしろ、完成度の高い伝統的なIDEがAIと組み合わさった時に、より強力なシナジーが発生する可能性があります。新しいものが常により良いわけではありません。 同期セッションの高度化という現実的な代替案 バックグラウンドエージェントやHITLなしで実行されるモードに対する確信や信頼がなければ、無理して使用する理由はありません。むしろ、現在のようにHITLが維持される同期セッションベースのワークフローをより深く見つめながら高度化することが、安全性と効率性を同時に確保する戦略です。 プロンプトパターンの体系化、コンテキスト提供方式の最適化、IDE統合機能の深い活用、作業単位の適切な分割などの領域で熟練度が高まれば、新しいツールが登場しても、その価値を冷静に評価できる基準が生まれます。 結論:ツールの新規性よりツール使用の深さ 「確認してください」という警告が形式的な免責ではなく実質的な運用指針であるならば、現在のAIツールの適切な使用方法は、HITLが維持される単一または少数のセッションの深い活用です。並列自律エージェントは、AIの信頼性が今よりはるかに高くなった後にこそ意味のある選択肢になるでしょう。 ツールの新規性よりツール使用の深さが実務の生産性に大きな影響を与えます。そしてこれがhypeに振り回されない実質的な競争力になります。新しいツールが登場するたびに「これが解決する実際の問題は何か」を最初に問う習慣を身につけてください。 ツールは手段であって、アイデンティティではありません。

2026年1月27日 · 1 分 ·  rkttu
JavaからNETへのコード移植を表現した抽象的なイメージ

Java hwplibを.NETに移植する:AIと共に歩んだオープンソース移植の旅

始まりは単純な好奇心から 「HWPファイルを.NETで直接扱えたらいいのに…」 こんな考えをした.NET開発者は私だけではないでしょう。HWPファイルは韓国で公共機関を中心に今でも広く使われている文書形式ですが、.NETエコシステムではこれを適切に扱えるオープンソースライブラリがありませんでした。 これまで.NETでHWPファイルを扱うには、Windows OS限定でアレアハングルをインストールすると付属するHWP ActiveXコントロールのCOMタイプライブラリを呼び出して制御する程度しかありませんでしたが、残念ながらこれさえもサポートが終了し、今は道が閉ざされた状態です。 そんな中、Javaで書かれたhwplibを発見しました。neolord0さんが継続的にメンテナンスしてきたこのライブラリは、HWPファイルの読み書きを完成度高くサポートしていました。 以前なら、このようなライブラリを移植することは、強い使命感と目的意識がなければなかなか手を出せる作業ではありませんでした。しかし、高性能なAIモデルが多く登場し、今なら新しい挑戦ができるのではないかという好奇心がありました。 こうして始まった3週間の旅を共有します。 数字で見るプロジェクト 本格的な話の前に、Javaバージョンのプロジェクトの規模を数字でまとめてみましょう。 項目 内容 元プロジェクト neolord0/hwplib (Java) 移植プロジェクト rkttu/libhwpsharp (C#) ターゲットフレームワーク .NET Standard 2.0, .NET Framework 4.7.2, .NET 8 総コミット数 54個 開発期間 2025-12-16 ~ 2026-01-08(約3週間) 初期移植コード 641ファイル、50,010行 641ファイル、5万行。正直、最初にこの数字を見たときは「これは可能なのか?」という疑問が湧きました。 初日:AIと共に行った大規模コード変換 5万行を1日で? 2025年12月16日、プロジェクトを開始しました。通常の状況であれば、5万行のJavaコードをC#に変換するには数ヶ月かかったでしょう。しかし、AIコーディングアシスタントがゲームチェンジャーでした。 AIにJavaファイルを渡し、C#に変換してもらいました。もちろん、機械的な変換だけでは不十分でした。JavaとC#は似ているように見えますが、微妙な違いが多いからです。 // Java public byte getValue() { return value; } public void setValue(byte value) { this.value = value; } // C# public byte Value { get; set; } このようなパターン変換はAIがうまく処理してくれました。しかし、本当の問題は別にありました。 最大の難関:Apache POIからOpenMcdfへ OLE2複合ドキュメントの沼 HWPファイルはMicrosoftのOLE2複合ドキュメント形式(Compound File Binary Format)に基づいています。簡単に言えば、1つのファイルの中に複数の「ストリーム」がフォルダ構造のように格納されている形式です。 JavaではApache POIライブラリがこの形式を扱いますが、.NETには直接対応するものがありません。代わりにOpenMcdfというライブラリを使う必要がありましたが、残念ながらApache POIとはAPIが完全に異なります。 ...

2026年1月8日 · 2 分 ·  rkttu
TableClothカタログUIアップデート

テーブルからカードへ:TableClothカタログUIの現代化

はじめに 韓国でインターネットバンキングを利用したことがあれば、各種セキュリティプログラムのインストール要求に頷くことでしょう。ActiveXは姿を消しましたが、その代わりとなった数多くのセキュリティプラグイン—AhnLab Safe Transaction、TouchEn nxKey、Veraportなど—は依然として私たちのPCへのインストールを要求しています。 TableCloth(食卓布)プロジェクトは、これらのセキュリティプログラムをWindows Sandboxという隔離された環境で実行できるようにするオープンソースツールです。TableClothカタログは、どの金融サイトでどのセキュリティプログラムが必要かを整理したデータベースの役割を果たしています。 今回のアップデート概要 TableClothカタログプロジェクトに5件のコミットが適用されました。今回のアップデートはフロントエンド、バックエンド、DevOpsの3つの領域にわたる総合的な改善です。 領域 変更内容 主要技術 フロントエンド カタログWebページの全面再設計 カードUI、カテゴリフィルター、レスポンシブレイアウト バックエンド ビルドツールアーキテクチャのリファクタリング Generic Host、依存性注入、構造化ロギング DevOps 品質管理自動化ツールの追加 画像検証、未使用リソース整理、ファビコン収集改善 各領域で何が変わったのか、なぜそのような決定を下したのか、詳しく見ていきます。 フロントエンド:テーブルからカードへ なぜUIを変更する必要があったのか? 既存のカタログページは典型的なHTMLテーブル形式でした。カテゴリ、サービス名、必要なパッケージリストが行と列で整列された構造です。機能的には問題ありませんでしたが、いくつかの限界がありました。 まず、100を超えるサービスをスクロールしながら探す必要がありました。モバイル環境では横スクロールが発生してユーザビリティが低下し、視覚的な階層構造がないため情報の把握が困難でした。何より、カテゴリ別のフィルタリングができず、目的のサービスを素早く見つけることが難しい状況でした。 これらの問題を解決するため、カードベースのUIへの全面改編を決定しました。 XSLトランスフォームで実装したレスポンシブカードUI TableClothカタログの興味深い点は、データがXML形式で保存され、Webページが**XSLT(XSL Transformations)**を通じてレンダリングされることです。サーバーサイドのロジックなしに、ブラウザが直接XMLをHTMLに変換します。 デザイントークンシステムの導入 モダンなCSS設計の核心はデザイントークンです。色、間隔、影などをCSS変数として定義することで、一貫性のあるデザインを維持しながらメンテナンスが容易になります。 :root { /* カラーパレット */ --primary-color: #2563eb; --primary-hover: #1d4ed8; --bg-color: #f8fafc; --card-bg: #ffffff; --text-primary: #1e293b; --text-secondary: #64748b; --border-color: #e2e8f0; /* シャドウ */ --shadow: 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06); --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -2px rgba(0,0,0,0.05); /* レイアウト */ --radius: 12px; } このカラースキームはTailwind CSSのデフォルトパレットからインスピレーションを得ています。スレート系のテキストカラーとブルー系のアクセントカラーを組み合わせることで、クリーンかつプロフェッショナルな印象を与えることができます。 ...

2025年12月8日 · 2 分 ·  rkttu
TableClothプロジェクト カタログビルダーアップデート

TableClothカタログビルダー、.NET 10とFBAで現代化

TableClothプロジェクトとは TableClothは、韓国のインターネットバンキング環境で必要なセキュリティプラグインをWindows Sandbox環境で安全に使用できるようにするオープンソースプロジェクトです。様々な金融機関のウェブサイトで要求されるセキュリティプログラムを隔離された環境で実行し、ホストシステムの安全を確保します。 カタログリポジトリとは TableClothCatalogリポジトリは、TableClothプロジェクトで参照する金融機関サイト別のセキュリティプログラムリストを保管する保存場所です。銀行、証券会社、保険会社などのウェブサイトで要求されるセキュリティプラグイン情報が体系的に整理されており、カタログビルダーツールはこの情報を基にTableClothアプリで使用可能な形式に加工します。 最近のカタログビルダーアップデート 最近、このリポジトリに重要なアップデートが適用されました。今回のコミットでは、カタログビルダーツールが.NET 10にアップグレードされ、プロジェクト構造が大幅に簡素化されました。 主な変更点 .NET 10アップグレード # 変更前 dotnet-version: 8.0.x # 変更後 dotnet-version: 10.0.x ビルドパイプラインが.NET 8から.NET 10にアップグレードされました。これにより、最新ランタイムのパフォーマンス向上と新しい言語機能を活用できるようになりました。 File-Based App(FBA)方式への移行 最も目立つ変化はプロジェクト構造の簡素化です。従来は別途の.csprojプロジェクトファイルとソリューションファイル(.sln)を使用していましたが、今回のアップデートでこれらのファイルが削除され、単一のC#スクリプトファイル(catalogutil.cs)に統合されました。 #!/usr/bin/env dotnet #:package IronSoftware.System.Drawing@2025.9.3 #:property PublishAot=false using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Png; using System.Collections.Concurrent; // ... これが.NETの**File-Based App(FBA)**方式です。FBAは以下のような利点を提供します: プロジェクトファイル不要:.csprojなしで単一の.csファイルでアプリケーション実行可能 インラインパッケージ参照:#:packageディレクティブでNuGetパッケージを直接参照 インラインビルドプロパティ設定:#:propertyディレクティブでビルドプロパティを設定 シバン(Shebang)サポート:#!/usr/bin/env dotnetでUnixスタイルの実行をサポート Graceful Shutdownサポート 新しいバージョンでは、プロセス終了時により安定した処理が可能になりました: // Graceful shutdown タイムアウト var gracefulShutdownTimeout = TimeSpan.FromSeconds(5); Console.CancelKeyPress += (sender, e) => { if (cts.IsCancellationRequested) { // 2回目のCtrl+C:強制終了 Console.Out.WriteLine("Info: Force exit requested. Terminating immediately..."); e.Cancel = false; return; } Console.Out.WriteLine($"Info: Cancellation requested. Shutting down gracefully (timeout: {gracefulShutdownTimeout.TotalSeconds}s)..."); Console.Out.WriteLine("Info: Press Ctrl+C again to force exit."); e.Cancel = true; // 即時終了を防止 cts.CancelAfter(gracefulShutdownTimeout); cts.Cancel(); }; 主な特徴: ...

2025年12月6日 · 1 分 ·  rkttu
AIと開発を象徴するイメージ

AI「学習」という用語に騙されないでください

サービス開発をしている同僚たちと話をしていると、AI導入について漠然とした負担感を感じているケースをよく見かけます。その負担感の根源を掘り下げると、大抵は**「学習(Training)」**という用語が生む誤解に起因しています。 「モデルをサービスに組み込むと、ユーザーデータを取り込んでリアルタイムで学習して賢くなるんですか?」 「じゃあ、その学習プロセスを私たちがコントロールできますか?変なことを学んだらどうしますか?」 もしこのような悩みをお持ちでしたら、少し心配を置いても大丈夫です。今日はその誤解を開発者の言葉で解説します。 「学習」はビルドタイム、「推論」はランタイム 最初に正すべきことは、私たちがサービスにデプロイするAIモデルは、ほとんどの場合「凍結された(Frozen)」状態であるという点です。 開発用語で例えると次のようになります。 概念 AI用語 開発用語の比喩 説明 モデルを作る 学習(Training) ビルドタイム(Build Time) 膨大なリソースと時間が必要 モデルを使う 推論(Inference) ランタイム(Runtime) リクエストを受けて結果を返す 私たちがサービスを運用するとき、実行中のバイナリコードが自らコードを修正して進化することはありません。AIも同様です。 モデルはデプロイされた瞬間、もはや「学ぶ学生」ではなく、**「指示通りに働く労働者」**になります。私たちが心配すべき領域は学習ではなく、この労働者がうまく仕事ができるよう環境を整えることです。 図書館の比喩でAI構造を理解する では、最新情報はどのように反映され、AIはどのような役割を果たすのでしょうか?私はこの構造を**「図書館」**に例えることがよくあります。 構成要素 図書館の比喩 説明 AIモデル(LLM) 司書 言語能力と推論能力を持つ存在 RAG / DB 書庫 サービスデータと最新情報が保存される空間 プロンプト 業務指示書 司書に仕事を任せるときに渡すガイドライン サービス開発者である私たちが毎日やっていることは、**「図書館に新刊を補充すること(DBアップデート)」**です。司書(AI)は私たちが補充した本を必要なときに取り出し(Retrieve)、内容を読んで組み合わせてユーザーに提供する(Inference)だけです。 多くの方が恐れている**「学習(Fine-tuning)」は、「司書を大学院に送って再教育すること」**に相当します。司書が基本的な読解力が不足している場合や、一般的な常識では理解できない特殊なドメインを扱う必要がある場合にのみ必要なエッジケースです。 ほとんどのビジネス問題は、司書を再教育(学習)させることではなく、以下の3つで解決できます: 優秀な司書を採用する - 良いベースモデルを選択 良い業務マニュアル - よく設計されたプロンプト 整理された書庫 - 構造化されたRAG/DB AIは「意味処理アクセラレータ」である このように構造を把握すると、AIはもはや恐ろしい未知の存在ではありません。単に私たちのシステムアーキテクチャに組み込むべき一つの**「部品」**に過ぎません。 コンピュータの歴史は「処理の高速化」でした。 ハードウェア 高速化対象 CPU 計算とロジック(if-else)処理 GPU グラフィックスとピクセル処理 AI(LLM) 意味(Semantics)と文脈(Context)処理 私たちはこれまでif (text.contains("りんご"))のようなコードで人間の言語を機械的に処理するのに苦労してきました。今では、その「意味処理」を専門に担当する高性能アクセラレータ(AI)が登場したのです。 おわりに AI時代だからといって、開発者がAIモデルを直接作ったり数式を理解したりしなければならないという強迫観念を持つ必要はありません。 MySQLの内部エンジンのソースコードを知らなくても優れたバックエンドサーバーを構築できるように、AIという**「優秀な司書」を私たちのサービスのどのデスクに座らせ、どのような権限を与えるかを設計するアーキテクチャリング能力**は今でも有効であり、さらに重要になっています。 AIに過度な意味を付与しないでください。それは自ら考えて反乱を起こす人工知能ではなく、私たちが入力したデータを確率的に最もそれらしく処理して返す**「関数(Function)」であり「ツール(Tool)」**です。 ツールは恐れるべき対象ではなく、手に馴染ませてうまく活用すべき対象です。

2025年12月5日 · 1 分 ·  rkttu
ブログ執筆のためのノートパソコンとコーヒー

/dev/write: AIと一緒に技術ブログを運営する

技術ブログを運営する上で最大の悩みは「どうすれば継続的に質の高い記事を書けるか」です。多言語でコンテンツを提供したいなら、翻訳まで気にしなければならないので、負担が倍増しますよね。 /dev/writeはこうした悩みから生まれました。Hugo静的サイトジェネレーターにGitHub Copilotを組み合わせて、執筆に集中できる環境を作ってみました。 なぜまたブログシステムなのか? 正直に言えば、既存のブログプラットフォームも十分優れています。Medium、Qiita、Zenn、どれも素晴らしい選択肢です。でも、いくつか物足りない点がありました。 まず、多言語対応です。韓国語で書いた記事を英語と日本語でも提供したかったのですが、ほとんどのプラットフォームでは別アカウントや複雑な設定が必要でした。 次に、AI学習データとして使用されることへの懸念です。一生懸命書いた記事が同意なくAIモデルの学習に使われるのは、あまり気持ちの良いものではありませんよね。 そして、自動化されたワークフローです。記事を書いて、レビューして、翻訳して、公開するプロセスをできるだけ自動化したかったのです。 そこで、Hugo + PaperModテーマをベースに、この3つを解決するシステムを自作しました。 GitHub Copilotと一緒に執筆する /dev/writeで最も面白い部分は、GitHub Copilotを執筆ツールとして活用する方法です。VS Codeで/コマンドを入力すると、様々なプロンプトを呼び出せます。 /create-draft Dockerコンテナネットワーキングについて書いて こんな風にトピックだけ投げてもいいですし、もっと具体的にアウトラインを提供することもできます。 /create-draft - トピック:Kubernetes入門 - 内容:Pod、Service、Deploymentの概念 - 対象読者:Dockerを知っている開発者 既存のREADMEやドキュメントがあれば、それをベースにチュートリアルを作ってもらうこともできます。 /create-draft このREADMEファイルを基にチュートリアル投稿を作って #file:README.md AIが全部書くわけじゃない もちろん、AIに最初から最後まで任せることだけが答えではありません。むしろ自分でまず下書きを書いて、AIに肉付けしてもらう方式の方が良い結果を出すことが多いです。 例えば、以前別のブログで書いた記事を持ってきて技術ブログスタイルで書き直したい場合: /complete-manual-post この投稿を技術ブログスタイルで書き直して #file:my-old-post.md 自分で書いた下書きがあれば、コード例を追加したり説明を補強してもらうこともできます。 私が書いたこの下書きを基に、内容をより豊かにしてください。 コード例を追加し、説明をより詳しくしてください。 #file:2025-12-05-my-draft.md 個人的な経験や意見が重要な記事、技術的な正確性を自分で検証したい記事は、このアプローチの方がはるかに効果的です。AIはあくまで助手であり、最終判断は人間がするものですから。 1つ書けば3つできる /dev/writeのもう一つの特徴は自動翻訳です。韓国語で記事を書くと、英語と日本語バージョンが自動的に生成されます。 もちろん機械翻訳には限界があります。でも、最初から3言語で書くよりはずっとマシですよね。翻訳結果をレビューして、必要な部分だけ修正すればいいのです。 翻訳過程で一貫性を維持するために、いくつかのルールがあります。 slug、translationKey、dateなどのメタデータはすべての言語で同一に維持 タイトル、タグ、要約、本文は各言語に翻訳 コードブロックは翻訳しない(当然ですよね!) 英語はAmerican Englishで、日本語はです/ます体で作成されます。技術用語は原語を維持するか、括弧で併記します。 翻訳が終わったら、検証スクリプトで3言語バージョンがちゃんと揃っているか確認します。 .\scripts\validate-translations.ps1 技術ドキュメントの正確性検証 技術ブログで最も重要なのは正確性です。特にAzureや.NETなどMicrosoft技術を扱う時は、公式ドキュメントと一致するか確認するのが必須ですよね。 /dev/writeはMS Learn MCPサーバーを通じてこのプロセスを自動化しました。mcp.jsonファイルにMCPサーバーを登録して使用するように設定しています。 MCPサーバーがMicrosoft公式ドキュメントを照会して、最新APIバージョンか、非推奨の機能はないか、公式推奨事項と合っているかレビューしてくれます。ブログ記事に「この方法はもう推奨されていません」というコメントが付くのを事前に防げますよ。 ソーシャルメディアを意識した予約投稿 記事を書いたら公開しなければなりませんよね。/dev/writeは予約投稿をサポートしています。dateフィールドに未来の日付を設定すると、その時間に自動的に公開されます。 date: 2025-12-10T08:00:00+09:00 # 12月10日午前8時に公開 予約投稿はGitHub Actionsのcronトリガーで動作します。一日中動かすとランナーコストがもったいないので、ソーシャルメディアのピークタイムに合わせて1日3回実行するように設定しました。 午前8時:通勤中にスマホをチェックする時間 午後12時:昼休みにちょっとブラウジングする時間 午後5時:退勤前に最後にフィードをチェックする時間 schedule: - cron: '0 23 * * *' # KST 08:00 - cron: '0 3 * * *' # KST 12:00 - cron: '0 8 * * *' # KST 17:00 もっと細かい公開スケジュールが必要な場合は、ローカル環境で直接トリガーを設定することもできます。Windowsタスクスケジューラやcrontabを活用すれば、1時間間隔、30分間隔など、好きなように調整可能です。GitHub Actionsの無料枠も節約でき、公開タイミングもより精密に設定できますよ。 ...

2025年12月5日 · 1 分 ·  rkttu
サーバー仮想化環境のイメージ

Windows 10/11 ProでHyper-V第2世代VMからUbuntuを起動する方法

はじめに Windows Proには標準でHyper-Vが含まれています。別途仮想化ソフトウェアをインストールしなくても、OS内で直接仮想マシンを作成・管理できます。この記事では、Hyper-Vの第2世代(Generation 2)仮想マシンを使用してUbuntuを起動する方法をご紹介します。 まず、管理者権限でPowerShellを開き、次のコマンドを入力してHyper-V機能を有効にします。 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All インストールが完了したら、システムを再起動してください。 次に「Hyper-Vマネージャー」を起動し、新しい仮想マシンを作成します。世代は必ず「第2世代(Generation 2)」を選択し、メモリは4GB以上、ディスクは20GB以上を指定してください。 ネットワークアダプターは「既定のスイッチ(Default Switch)」を選択すれば、追加設定なしですぐにインターネット接続が可能です。 次に、Ubuntu公式サイトからISOイメージをダウンロードし、仮想マシンのDVDドライブ→「イメージファイル」に接続します。ファームウェア設定でDVDドライブを起動順序の一番上に移動させれば、ISOから直接起動できます。 重要なポイント ここまでは一般的な手順です。しかし、実際にUbuntuをインストールしようとすると、「No bootable device」や「Start boot option」などのエラーが発生し、起動できないことがよくあります。 その理由は簡単です。Hyper-Vの第2世代VMは、デフォルトでWindows専用のUEFIセキュアブートテンプレートを使用しているからです。 この問題を解決するには、仮想マシンを作成した後、必ず「設定→セキュリティ」に移動してください。 ここで**「セキュアブートを有効にする(Enable Secure Boot)」にチェックを入れ、下の「テンプレート」オプションを「Microsoft UEFI証明機関(Microsoft UEFI Certificate Authority)」**に変更してください。 この設定が正しく行われていないと、Ubuntuのブートローダーが署名されていないイメージとして認識され、UEFIによって起動がブロックされます。 つまり、ISOファイルやディスク構成をいくら作り直しても、この設定がなければUbuntuは絶対に起動しません。 上記の手順を完了すると、Ubuntuのインストール画面が正常に表示され、案内に従ってインストールを進めることができます。 Ubuntu 20.04以降のバージョンには、Hyper-V統合サービスがデフォルトで含まれているため、追加のドライバーをインストールしなくても、クリップボード共有、画面解像度の自動調整、時刻同期などの機能がすぐに動作します。 結論として、Hyper-V第2世代VMでUbuntuを起動するには、「セキュアブートテンプレート」を必ずMicrosoft UEFI証明機関に設定する必要があります。 この1つの設定さえ忘れなければ、Windows Pro環境でも安定してUbuntuを実行し、開発環境を構築することができます。

2025年10月23日 · 1 分 ·  rkttu