自分のプロセス内でスレッドを一時停止しないでください!

2025-04-15
自分のプロセス内でスレッドを一時停止しないでください!

ある顧客が、長期間にわたる低頻度のハング問題に遭遇しました。UIスレッドがカーネルを呼び出した後、理由もなくハングしていました。残念ながら、カーネルダンプでは、スタックがページアウトされていたため、ユーザーモードからのスタックを表示できませんでした。(ブロックされたスレッドはスタックを使用しないため、システムがメモリ不足になるとスタックがページアウトされます。)調査の結果、ウォッチドッグスレッドがUIスレッドを定期的に一時停止してスタックトレースを取得していましたが、今回は5時間以上ハングしていました。原因はデッドロックでした。ウォッチドッグスレッドはUIスレッドのスタックトレースを取得しようとしていましたが、関数テーブルのロックが必要でした。しかし、UIスレッドは一時停止されており、そのロックを保持していました。この記事では、自分のプロセス内でスレッドを一時停止しないように強調しています。リソースの競合によってデッドロックが発生するリスクがあるためです。スレッドを一時停止してスタックトレースを取得する必要がある場合は、デッドロックを回避するために、別のプロセスから実行する必要があります。

続きを読む

謎の受動型USB-PS/2マウスアダプター

2025-03-28
謎の受動型USB-PS/2マウスアダプター

初期のUSBマウスには、USB Type-AプラグをPS/2に変換する緑色のアダプターが付属していることがよくありました。これはスマートアダプターではなく、純粋に機械的なもので、回路は含まれていませんでした。マウス自体が変換を行い、信号の種類(USBまたはPS/2)を検出してそれに応じて調整しました。これは単純な電源アダプターに似ており、インテリジェンスはデバイス自体にあり、アダプターにはありません。そのため、このようなものを見つけた場合、それが物理的なコネクターにすぎないことを覚えておいてください。実際の変換はデュアルバスマウス内で行われます。

続きを読む
ハードウェア マウスアダプター

競合状態のデバッグ:RtlRunOnceExecuteOnceの落とし穴

2025-03-23
競合状態のデバッグ:RtlRunOnceExecuteOnceの落とし穴

同僚が毎週のデバッグセッションで厄介なコンカレンシー問題に遭遇しました。クリティカルセクションが2つのスレッドが同じコードブロックに入るのを防げず、`TraceLoggingRegister`の二重登録エラーが発生しました。詳細なデバッグにより、根本原因が判明しました。`RtlRunOnceExecuteOnce`の初期化関数`InitializeCriticalSectionOnce`が`STATUS_SUCCESS`(0)を誤って返していました。これにより`RtlRunOnceExecuteOnce`は初期化に失敗したと判断し、毎回クリティカルセクションを再初期化し、競合状態を引き起こしていました。解決策は、戻り値を`TRUE`に変更するか、よりスマートに`CRITICAL_SECTION`を`SRWLOCK`に置き換えることです。このケースは、戻り値のわずかなエラーが深刻な結果につながることを示し、適切な同期プリミティブを選択することの重要性を強調しています。

続きを読む
開発

TypeScriptネイティブコンパイラ:10倍のパフォーマンス向上

2025-03-11
TypeScriptネイティブコンパイラ:10倍のパフォーマンス向上

TypeScriptチームは、TypeScriptコンパイラとツールのネイティブポートを発表し、パフォーマンスを劇的に向上させました。このネイティブ実装により、エディターの起動時間が大幅に短縮され、ほとんどのビルド時間が10倍になり、メモリ使用量が大幅に削減される予定です。初期テストでは、いくつかの大規模プロジェクト(例:VS Code、Playwright)のコンパイル速度が10倍以上向上しました。将来のネイティブTypeScript(TypeScript 7として計画)は、より高度なリファクタリング、より深いコード分析をサポートし、次世代AI開発ツールの基盤となります。TypeScript 6(JSベース)は、円滑な移行を確保するために引き続き保守されます。

続きを読む

C++/WinRTにおける微妙なinvoke問題とその解決策

2025-03-09
C++/WinRTにおける微妙なinvoke問題とその解決策

C++/WinRTのプルリクエストにより、`winrt::impl::promise_base::set_completed`における`invoke`の呼び出しの曖昧さが修正されました。これは、引数依存名検索(ADL)が原因でした。C++20のコルーチンのアップグレードによってADLの検索範囲が広がり、意図した`winrt::impl::invoke`ではなく`std::invoke`が誤って検出されました。この記事ではADLのメカニズムを詳しく説明し、古いバージョンのC++/WinRTに対する修正プログラムを提供します。`winrt::Windows::Foundation`名前空間に、より適切に一致する`invoke`関数を宣言することで、コンパイラを正しい関数に誘導します。この修正プログラムには、C++/WinRTのアップグレード後に自動的に無効になる静的アサーションも含まれています。

続きを読む
開発

列挙型における「その他」の落とし穴:バージョン互換性とオープンエンドな列挙型

2025-03-02
列挙型における「その他」の落とし穴:バージョン互換性とオープンエンドな列挙型

この記事では、C++の列挙型において「その他」の値(例えばWidgetFlavor::Other)を使用することの潜在的な問題点を論じています。新しい列挙値を追加する際に、それらの値をどのように処理し、古いバージョンのコードとの互換性を維持するかが課題となります。著者は、「その他」の値を避けて列挙型をオープンエンドにすることを推奨しています。これにより、プログラムが未知の値を独自に処理できるようになり、バージョン互換性の問題をエレガントに解決できます。新しい列挙値を追加する際の混乱を防ぎ、新旧コード間のスムーズな移行を保証します。

続きを読む

MSVC Address Sanitizer (ASan) の大幅な改良

2025-02-25
MSVC Address Sanitizer (ASan) の大幅な改良

マイクロソフトは、MSVC Address Sanitizer (ASan) の品質を大幅に向上させました。ASan の主要部分を LLVM にアップストリームすることで、LLVM コミュニティからの改善をより迅速に統合できるようになりました。さらに、コンパイラ、リンカ、ツールを含む MSVC コードベースに ASan を統合し、継続的インテグレーションでメモリ安全性の問題を検出できるようにしました。Visual Studio 2022 バージョン 17.13 では、誤検出の削減、エラーレポートの改善、マルチプロセスシナリオの処理など、多くの問題が修正されました。

続きを読む
開発

Windows 95 セットアップ:驚くほど複雑なミニOSの物語

2025-02-17
Windows 95 セットアップ:驚くほど複雑なミニOSの物語

この記事は、Windows 95 セットアッププログラムの隠された複雑さを明らかにしています。一見シンプルなインストーラーを作成するために、チームはMS-DOS環境下で、グラフィックライブラリ、ウィンドウマネージャー、多言語サポート、さらにはWindows 3.1との互換性を含む、ミニチュアオペレーティングシステムをゼロから構築しなければなりませんでした。最終的に、膨大な開発努力を避けるために、既存のWindows 3.1ランタイムを使用する方がはるかに効率的であることに気づきました。この物語は、ソフトウェアエンジニアリングにおけるコードの再利用の重要性を強調し、Windows 95 セットアッププログラムの驚くほど複雑な性質を明らかにしています。

続きを読む
開発

「コンピューターの電源を切っても安全です」画面:Windows 95へのノスタルジックな旅

2025-02-16
「コンピューターの電源を切っても安全です」画面:Windows 95へのノスタルジックな旅

Windows 95の「コンピューターの電源を切っても安全です」というメッセージを覚えていますか?この記事では、飛行機の中で隣に座っていた人が「Windowsがシャットダウンされました」という画面を見て、何度も再起動ボタンを押していたという面白い話を紹介しています。これは、古いコンピューターに電源管理機能がなかったことを示しており、Windows 95がこのメッセージを含めていた理由を説明しています。電源ボタンを押しても安全だと優しく教えてくれるメッセージだったのです。

続きを読む
テクノロジー

USB仕様会議の逸話:半透明ブルーのプレミアム

2025-02-10
USB仕様会議の逸話:半透明ブルーのプレミアム

USB仕様の会議で、ある企業がUSBフロッピードライブを発表し、驚くべきことにPCとMacの別々のバージョンを提供していました。委員会のメンバーは困惑しました。なぜなら、仕様では同じドライブが両方のシステムで動作することが保証されていたからです。担当者は、ドライブは電子的に同一であり、唯一の違いはMac版が半透明の青いプラスチック製で、価格が高くなっていることだと説明しました。これは、当時のiMacの半透明プラスチックという流行を反映しており、一部のメーカーがデザインの違いを価格のプレミアムとして利用していたことを浮き彫りにしています。

続きを読む
ハードウェア フロッピードライブ

ミサイルソフトウェアにおける「ヌルガーベージコレクタ」:メモリリーク?問題なし!

2025-02-07
ミサイルソフトウェアにおける「ヌルガーベージコレクタ」:メモリリーク?問題なし!

開発者が、ミサイルソフトウェアにおける「ヌルガーベージコレクタ」の巧妙な応用事例を紹介しています。飛行時間が限られており、ハードウェアのメモリが十分にあるため、プログラムのメモリリークは問題になりませんでした。エンジニアは飛行中の潜在的なメモリリーク量を計算し、その2倍のメモリを追加して、ミッション完了前にプログラムがクラッシュしないようにしました。このアプローチは、プログラムの実行時間制約を巧みに利用し、メモリリーク問題を効果的に解決しました。一種の「究極のガーベージコレクション」と言えるでしょう。

続きを読む

Go 1.24暗号化の大幅な改良:FIPS 140-3準拠を実現

2025-02-06

Go 1.24は、暗号化パッケージを大幅にリファクタリングし、FIPS 140-3準拠を実現しました。これは大きな進歩であり、純粋なGo(およびGoアセンブリ)で実装されたFIPS 140-3検証済みの暗号化モジュールが特徴で、cgoやシステムコールへの依存を排除しています。Microsoft Go 1.24も更新され、macOSのプレビューサポートとAzure Linuxの強化されたサポートが追加されましたが、暗号化にはシステムライブラリを引き続き使用しており、公式Goのアプローチとは異なります。GODEBUG=fips140=onやGOFIPS140=latestなどの新しい環境変数はFIPSモードを制御します。FIPS準拠システム(Azure Linux、Windows)では、ランタイムが自動的に有効になります。

続きを読む
開発

Windows 3D Pipesスクリーンセーバーの隠されたデザイン欠陥とティーポット

2024-12-28
Windows 3D Pipesスクリーンセーバーの隠されたデザイン欠陥とティーポット

魅力的なパイプアニメーションで知られるWindows 3D Pipesスクリーンセーバーには、あまり知られていない秘密が隠されています。それは、めったに現れないティーポットです。このティーポットは、コンピュータグラフィックスにおける標準的な参照オブジェクトであるユタティーポットへのオマージュですが、その出現率の低さから、生産性の低下に関するユーザーからの苦情が寄せられました。この記事では、古いバージョンのWindowsでは、ソフトウェアレンダリングにより、サーバーでのCPU使用率が高くなることも明らかにされており、サーバーには黒いスクリーンセーバーを使用することを推奨しています。

続きを読む

C++コンパイラエラー:関数宣言からの無意味なエラー

2024-12-12
C++コンパイラエラー:関数宣言からの無意味なエラー

C++アプリケーションにXAMLサポートを追加しようとした開発者は、winrt/Windows.UI.Xaml.hヘッダーファイルを含めるだけで、一連のコンパイラエラーに遭遇しました。エラーの原因は、一見普通の関数宣言のように見える以下の部分でした。`template struct consume_Windows_UI_Xaml_IExceptionRoutedEventArgs { [[nodiscard]] auto ErrorMessage() const; };`根本原因は、開発者のプロジェクトに既に存在するErrorMessageという名前のマクロで、関数名と衝突していました。このマクロはErrorMessageStringオブジェクトを作成し、エラーメッセージ文字列へのポインタを返していました。マクロの境界がないため、コンパイラは関数宣言をマクロ呼び出しと誤って解釈し、「引数が足りない」などのエラーが発生しました。解決策としては、ヘッダーファイルを含める前に#pragma undefを使用してマクロを無効化するか、マクロを完全に削除してインライン関数に置き換えることです。

続きを読む