The Daily WTF 日本語 ノート

The Daily WTF 日本語

The Daily WTFは、Alex Papadimoulisが作成したプログラミング志向のユーモアブログです。このブログは、ソフトウェア開発とテクノロジーの世界に関する話を中心にしています。主に、プロジェクトの問題、コードの例、ITに関するおかしな話を基にしています。このサイトには、多くの開発者が仕事で遭遇する奇妙でおかしな体験の膨大なコレクションが含まれており、技術的に関連するものであれば、技術的なものか個人的なものかにかかわらず、すべてがテック関連です。

ノートのスレッド

著者は、日付の入力ミスや計算ミスに関連するいくつかの「エラー」を受け取りました。Tim R. は、タイムゾーン変換を目的としたウェブサイトを指摘しましたが、1時間ずれていたため失敗しました。匿名の読者は、日付の異常を示すスクリーンショットを共有し、ビッグテックへの不信感と、Microsoftのデータを手動でクリアする習慣を強化しました。Daniel D. は、6月が30日までしかないにもかかわらず、「6月31日」を拒否した日付計算機に遭遇し、日付差の計算におけるその信頼性に疑問を呈しました。Daniel D. はまた、中央ヨーロッパのeコマースサイトが、バッテリー寿命のフィルターを「時間」と「秒」の間でランダムに切り替えていたことを指摘しました。Marc Würth は、標準の日付順序を反転させ、スラッシュの代わりにダッシュを使用した、奇妙なNetwork Solutions Domain History Date Formatを発見しました。これらの事例は、日付と時刻の処理に関連する、滑稽でありながらもフラストレーションのたまる様々なソフトウェアの不具合を総体的に示しています。エラーは、単純な1つずつの間違いから、完全に非論理的な日付の拒否まで多岐にわたりました。このような不整合は、ユーザーの不信感につながり、効率的なデータ処理を妨げます。この記事は、ソフトウェア開発における、特に一見単純なデータ型に関する、根強い課題を思い出させるものとなっています。
CdXz5zHNQW_vNtMRaVOyt.png
Kris W.は、Amazon Spainが古いVAT番号が個人アカウントに登録されていたため、キッチンナイフをEU域内取引とみなし、VAT免除の低価格で請求するという予期せぬ税務問題に直面しました。このVAT番号はアカウント設定で表示されなくなり、管理不能な状態でした。Amazonのカスタマーサポートチャットボットと担当者は、国際旅行者や軍関係者向けの詳細な書類を要求するなど、矛盾した役に立たないアドバイスを提供しました。Amazonの公式ヘルプページに従い、Krisは、カスタマーサービスが削除できないと言われたにもかかわらず、Amazon Businessアカウントを作成してVAT番号を削除しようと試みました。Businessアカウント登録中、Amazonは不可解にも、削除しようとしていたVAT番号を再入力するように求めてきました。事業を証明するためにスペイン政府発行の公式証明書を提供した後、彼のBusinessアカウントは最終的に承認されました。しかし、新しいBusinessアカウントの専用VAT管理ページには、既存のVAT番号を編集または削除するオプションがありませんでした。代わりに、「税IDを変更するにはカスタマーサービスに連絡する」というリンクが提供されているだけでした。これは、カスタマーサービスがVAT番号を削除できないとすでに述べていたため、Krisを振り出しに戻しました。Krisの経験は、Amazonが税務情報を管理するために作り出した複雑で循環的なプロセスを浮き彫りにし、顧客を役に立たないサポートと機能しないセルフサービスオプションのフラストレーションのループに追い込んでいます。
CdXz5zHNQW_Cw9oRz8am2.png
Dr. Doom は、TikTok のウェブページにある彼が「doom-scrollbars」と呼んだものについてコメントし、スクリーンショットにユーモラスに「Scrollbar-ception」とタイトルを付けました。彼は当初、それを doom-scrolling のソーシャルメディアの例として提示しましたが、画像自体は不快なものではありませんでした。匿名の読者は、ドラッグ&ドロップでテーブルを再編成する際に遭遇した Microsoft Word のエラーメッセージについて説明しました。B.J. H. は、サウスウエスト航空の荷物追跡システムでのフラストレーションを共有しました。このシステムは、荷物が追跡されているにもかかわらず、当初はスキャンが表示されませんでした。これは、B.J. が自身の存在について疑問を抱かせる別のページによってさらに悪化しました。Adam R. は、Stripe からの異常な数値フォーマットを報告しました。そこでは、取引金額の記号が別の行に表示されていました。彼は、これは非改行スペースがないための改行アルゴリズムの問題によるものだと示唆しました。Peter S. は、Peloton の機器販売サイト「Repowered」にある、混乱を招く一連のはい/いいえボタンを見つけました。彼は、インターフェースが明確な選択というよりはギャンブルを示唆していると感じました。著者は、Peter が Peloton のギアを売却する動機について疑問に思いました。提供されたテキストには、BuildMaster の広告も含まれています。全体的なテーマは、ユーザーインターフェースとユーザーエクスペリエンスの奇妙さを報告し、ユーモラスにコメントすることです。
CdXz5zHNQW_G5UYqFYRut.png
デンマークの社会保障システムであるCPRは、880万人の個人情報が流出した大規模なデータ侵害に見舞われました。これは、第三者企業がCPRデータベースへのアクセスを「123456」という非常に弱いパスワードで保護していたために発生しました。ハッカーはこの脆弱性を悪用し、アクセス権を取得して、検知されるまでの10日間システムを閲覧しました。この侵害は、パスワードセキュリティにおけるシステム的な問題と、容易に侵害される可能性のある個人識別番号への依存を浮き彫りにしました。別途、著者はブロックチェーン技術に対して懐疑的な見方を示しており、明確な問題のないソリューションであり、トークン取引がその主な応用であると考えています。ブロックチェーン企業がハッキングされることは一般的であるにもかかわらず、最近のハードウェアウォレットメーカーLedgerに対するサプライチェーン攻撃は注目に値します。攻撃者はサプライチェーン中にデバイスを侵害し、デバイスの画面に表示されるリカバリーコードを盗むことができるハードウェアを埋め込みました。これにより、約1億ドルの暗号通貨を盗むことができました。この攻撃は、サプライチェーンのセキュリティと検査の徹底性について疑問を投げかけます。最終的に、このテキストは、特にエンドユーザーや弱いパスワードに依存する場合のセキュリティの固有の難しさを強調しています。
著者は、米国刑務所における郵便物のデジタル化と対面面会の廃止について、落胆の意を表明している。現在、多くの州で、すべての送受信郵便物をスキャンし、原本を破棄して、有料タブレットでのみアクセス可能にしている。このプロセスは遅く、しばしばAIによって行われる検閲が含まれ、コミュニケーションから個人的な要素が失われる。著者はこれを自身の過去の検閲や没収の経験になぞらえている。当局はこれらの措置が薬物密輸阻止のためだと主張しているが、その有効性を示す証拠は不足している。この記事は、これらの慣行が、収容されている個人とその家族にとっての重要な生命線を引き裂き、甚大な損害を与えると論じている。物理的な郵便物と面会は、刑務所にいる人々の精神的健康にとって不可欠なものとして提示されている。著者は、読者に対し、刑務所廃止運動を支援すること、協力企業への加担を避けること、意識を広めること、そして収容されている個人に手紙を書くことによって行動を起こすよう促している。彼らは、特にテクノロジー専門家からの集団的な行動が、これらの残酷な慣行に対抗するために推進できると強調している。著者は、このような侵襲的なデジタル慣行が刑務所の外にも及ぶべきかどうかを疑問視している。
CdXz5zHNQW_W0bWKSOezh.jpeg
著者は、生物学的分類法を用いてオブジェクト指向の概念を説明するという一般的な慣習を、特に継承を過度に強調するその限界から批判しています。次に、開発者がオブジェクト指向の重要な原則を誤解し、問題のあるコードにつながっているC++のコードベースについて論じます。その例として、動物が触手を持っているかどうかを判断するためにポリモーフィズムではなく、実行時型チェック(IS_INSTANCE_OF)を使用するStealTentacle関数が挙げられます。IS_INSTANCE_OFマクロは、意図しない動作につながる可能性のあるCスタイルのキャストでdynamic_castを誤って使用しています。このマクロは、実際の型をチェックする前にオブジェクトポインタを基底型に強制しようとしており、C++のキャスト規則の理解不足を示しています。開発者のコメントは、dynamic_castが直接的な継承のチェックだけでなく、関連する派生型間のクロスキャスティングを実行できることについての彼らの混乱を明らかにしています。著者は、このような実行時型チェックはアンチパターンであり、解決しようとしている問題は型システム自体を使用してよりエレガントに処理できると主張しています。コードは、マクロチェック後にダウンキャストを試みるために、より多くのCスタイルのキャストを使用することで、これをさらに例示しています。最終的に、著者は、オブジェクト指向の機能は強力になり得るものの、特に実行時型情報との誤用は、複雑で非効率的なコードにつながり、言語のエレガンスを損なう可能性があるという意見に同調しています。
ロバート・Gは、列車が予期せず切り離されたことで旅行の遅延を経験しました。彼は旅程を再予約する必要があり、それが30分の遅延を引き起こしました。さらなる不便を避けるため、ロバートは鉄道会社のアプリを使用して次の列車への予約を確保し、確認を受け取りました。待っている間、彼はスムーズな乗り換えを期待してコーヒーを飲みました。次の列車に乗り込むと、彼は同じ予約席を主張する別の乗客に遭遇しました。両方の乗客は、同じタイムスタンプで同じ座席予約を示したスマートフォンのアプリの確認を提示しました。彼らはまた、電子メールの確認も確認し、それがさらに彼らの矛盾した予約を裏付けました。幸いなことに、列車は満席ではなかったため、全員が問題なく席を見つけました。この事件は、鉄道会社の予約システムにおける重大な競合状態を浮き彫りにしました。そこでは、チェックと予約のプロセスがアトミックではありませんでした。著者は、無関心または他のソフトウェア問題の圧倒的な数のために優先順位が付けられていないためにバグが存続していると推測しています。チェックと予約のアクションが単一の不可分な操作として実行されないため、システムはおそらく同時に2人のユーザーが同じ座席を予約することを許可しています。
ジュニア開発者は、Javaコマンドラインからユーザー入力を読み取り、それを処理する方法を学びたいと考えていました。Robertのチームには、強い意見と指導的なアプローチで知られるシニア開発者がいます。このシニアは、概念を説明するためにサンプルアプリケーションを提供しました。コードは、mainメソッドとヘルパー関数を持つScannerToolクラスを定義しています。mainメソッドは、ユーザー入力を処理するために複雑なマップ構造を初期化します。ユーザーに入力を繰り返し促すためにdo-whileループを使用します。ループの条件は、初期化されたマップ内の洗練されたルックアップに依存します。nextCharacter関数は、入力行を読み取り、最初の文字を含むOptional、または入力が空の場合は空のOptionalを返します。提供されたソリューションは、文字を読み取るためだけにScannerを広範囲に使用しており、これは過剰であると見なされています。過剰設計の核心は、メッセージとループ制御ロジックを管理するためのタプルを作成しようとするMapのMap.Entryオブジェクトにあります。この複雑な構造は指導の例として提示されましたが、基本的なタスクを著しく複雑化しました。著者は、シニア開発者のソリューションの複雑さに困惑を表明しています。
今週の「Error'd」は、フラストレーションのたまるパスワードポリシーに焦点を当てています。読者の一人が、表示されているすべての条件を満たしているにもかかわらず、パスワードが拒否された経験を共有しました。Michael R.は、「Handy」がドイツ語で携帯電話を意味することを明らかにしました。Sacha R.は、OracleのFusionアプリケーションでは、手動リセット中にパスワードポリシーの要件が誤って表示されると指摘しました。Matthew S.は、「Pick one, Staples!」と書かれた看板が、アンパサンドの問題を示唆しているとユーモラスに指摘しました。別の匿名ユーザーは、登録するには特殊文字を削除する必要があることを発見し、翻訳またはソフトウェア設計上の欠陥の可能性を示唆しました。これらの事例は、不必要に複雑または誤解を招くパスワード要件によってユーザーが直面する一般的なフラストレーションを浮き彫りにしています。根本的な問題は、表示されるポリシーと実際のシステムルールとの間の断絶にあるようです。これはしばしば混乱を招き、ユーザーが満足のいくパスワードを作成できない原因となります。このようなポリシーは、ユーザーのエンゲージメントと満足度にとって大きな障壁となり得ます。
CdXz5zHNQW_e6ta0t9cAy.png
ニコライのチームは、CI/CDパイプラインで断続的なビルド失敗を経験しており、テストは約0.5%の確率で失敗していました。この煩わしさが、ニコライが独自に問題を調査するきっかけとなりました。失敗したテストは、UUIDアルゴリズムのラッパーであるMicrosoftのGUID実装に関連していました。具体的なアサーションはAssert.DoesNotContain("000", transactionId.ToString());であり、これはGUID文字列に"000"が含まれているかどうかをチェックしていました。これは空のUUIDを検出することを意図していましたが、「000」が決して有効なGUID文字列に出現しないという仮定は誤りでした。ニコライは、この文字列表現が0.5527%の頻度で発生すること、つまり約181回に1回の割合で発生することを発見しました。テストは設計が悪く、より堅牢なチェックで改善できる可能性がありました。より良いアプローチは、すべてのビットがゼロに設定されたUUIDを表す組み込みのGUID.Empty定数を利用することでしょう。著者は、開発者がそのような明白な定数を使用しない可能性があることに不満を表明しており、ドキュメントを参照すればその存在が明らかになる可能性が高いと示唆しています。この記事には、NuGetガイドの広告が含まれています。
ティム・Cは、ソフトウェア開発のためにディスク容量が必要になった際、WTF Exchange(WTFX)で別の官僚的な課題に直面しました。担当者のマルグリットは、ティムの緊急性にもかかわらず、わずか40GBの要求に対しても正式な計画と会議を主張しました。彼女は、ティムが数ヶ月前にディスク容量の必要性を予測していなかった理由を問い詰めましたが、ティムは誰も見積もりを求めたことがないと説明しました。いら立ったティムは、プロセスを回避しようと外付けハードドライブを購入しました。しかし、WTFXは、それが新品でティムが提供したものであったにもかかわらず、調達ポリシー、ベンダー基準、資産管理上の懸念を理由にドライブを拒否しました。マルグリットは、公式な会議と推奨されるハードウェアの必要性を繰り返し述べ、嫌悪感を示して外付けドライブを却下しました。数日間の遅延の後、ティムはついに公式チャネルを通じて必要なディスク容量を受け取りました。後に、彼らの会社の重要なソフトウェア契約が、WTFXの全体的なプロジェクト予算のごく一部であり、その予算の大部分が遊休中の駐在員コンサルタントに割り当てられていたことを発見しました。これらの「アンダーソン・アンドロイド」と呼ばれるコンサルタントは、厳格なガントチャートのスケジュールに従ってソフトウェア開発を完了するのをティムのチームが待っていました。
CdXz5zHNQW_3avBLnYrMA.jpeg
このテキストは、読者が遭遇した誤訳をユーモラスに強調しています。Mike V.は、オランダのDellウェブサイトで見かけた紛らわしいクッキーボタンの翻訳を指摘し、ボタンのテキストとそれに付随する説明との間に矛盾があることを述べています。Matthias J.は、Euro-Tunnelの予約サイトでドイツ語設定に関する問題を共有しており、古いドイツ語がサポートされなくなったようです。一方、sztmbrは、ポーランドのGlovoアプリのメッセージの明確さについて疑問を呈しており、「理解する」をクリックすることが嘘つきであることを認めることを意味するのかどうか確信が持てません。The Beast in Blackは、Roborockロボット掃除機の広告からの奇妙な誤訳を語っており、掃除を改善するために床を改善することを不可解にも提案しています。TheRealSteveJudgは、ドイツのeBayで特に奇妙な誤訳を見つけました。そこでは、中国の販売者が「サイキックアドレス」を求めていました。著者はこれらの貢献を批判ではなく、楽しませてくれるものとして評価しています。このテキストは、これらの例が言語的な誤りからどのようにユーモアが生まれるかを示していると結論付けています。また、BuildMasterの広告についても簡単に触れています。
CdXz5zHNQW_Wc1Xmd2JMk.png
TruStageは生命保険会社であり、2026年7月10日に重大なサイバーセキュリティインシデントを経験しました。数ヶ月後も主要な事業機能は部分的にしか利用できない状態でした。同社は現在も侵害の範囲を把握しようとしており、どのデータが侵害されたのか、またはサービスがいつ完全に復旧するのかを特定していません。保険業務は影響を受けましたが、信用組合向けの銀行業務をサポートするシステムは稼働を続けていました。このインシデントは多数の訴訟を引き起こし、保険業界における複雑な仲介者の役割を浮き彫りにしています。保険プロセスには、顧客を保険契約に結びつけるためにAIを利用するEthosや、TruStageのような企業と提携するFamily First Life(FFL)など、複数のパートナーが関与することがよくあります。サイバーセキュリティインシデントによりTruStageが支払い処理できなくなったことで、保険契約が失効しています。この失効は、エージェントのコミッションの損失と、EthosやFFLのようなパートナー企業へのチャージバックにつながっています。FFLの社長であるShawn Meaikeは、業界カンファレンスでEthosを公に批判し、彼らをパートナーシップの「最も弱い環」と呼び、謝罪を要求しました。MeaikeがEthosの従業員であるDylan Cummingsをステージ上で辱めたことは、特に気まずい瞬間と見なされています。この一連の状況は、TruStageによる深刻なサイバーセキュリティと災害復旧の失敗を示しており、顧客に悪影響を与え、業界に混乱を引き起こしています。最終的に、このインシデントはTruStageにおける組織的な無能さと、単一の発行者に大きく依存するAI主導の保険スタートアップの、問題のあるビジネスモデルを明らかにしています。
コードの自動フォーマットは、可読性を維持するための標準的かつ不可欠なプラクティスです。エディタに統合されているか、ビルドステップとして実行されるかにかかわらず、何らかの形式の自動フォーマッタを利用しない正当な言い訳はありません。Visual Studio のような多くの IDE でさえ、このプロセスを自動化することに非常に積極的です。これは、古い ASP.Net アプリケーションからのコードサンプルを特に不可解なものにしています。Page_PreInit 関数は完全に 1 行に収まっており、その直後に Page_Load の宣言が続きます。このフォーマットの決定は、Logic() 関数がどこで呼び出されているかについて大きな混乱を引き起こします。元の開発者は、ブラウザ文字列で「Safari」をチェックするためにユーザーエージェントのスニッフィングも実装しました。もし「Safari」が検出された場合、Page.ClientTarget は不可解な「uplevel」値に設定されます。これは、悪い命名規則、ユーザーエージェントのスニッフィング、および列挙型がより適切かもしれない場所で文字列を使用することの組み合わせを示しています。最も懸念されるのは、この問題のあるパターンがアプリケーションの複数のページにわたって繰り返されていることです。これは、開発者が意図的にこの混乱していて読みにくいスタイルを選択し、再利用可能な実行可能なソリューションと見なしたことを示唆しています。
このスクリプトは、すべてのアクティブディレクトリユーザーとその最終ログオン時刻を報告することを目的としていますが、非効率的で複雑なアプローチを採用しています。ユーザーアカウントをフィルタリングするためにアルファベットの各文字を反復処理しますが、これは完全にアルファベット順のソートを保証するものではありません。各文字に対して、新しいDirectorySearcherオブジェクトを作成し、「name」プロパティのみを明示的に要求し、一致するすべての comptes を検索します。その後、取得された各名前に対して、スクリプトはさらに別のDirectorySearcherを作成します。この新しい検索erは、すべてのプロパティを取得するために特定のユーザーアカウントをクエリするために使用されます。ユーザー名の検索では1つの結果のみが期待されますが、FindAll()メソッドが使用され、配列が返されます。これにより、単一要素の配列を反復処理するための不要なループが必要になります。最後に、ユーザー名と最終ログオン時刻をコンマで連結して出力します。スクリプトの設計は、検索erのインスタンス化の繰り返し、冗長なクエリ、および非論理的なフィルタリング方法により、非常に非効率的です。その欠点にもかかわらず、マネージャー向けのCSVを生成できる能力により、組織内で「ミッションクリティカル」となっています。
グレタは、古いPascal開発環境で作業中に、プログラムがファイルの存在を報告しないというバグに遭遇しました。彼女はこの問題をシステムライブラリのFileExists関数にまでたどりました。この関数は、ファイルの最終更新タイムスタンプを取得するFileAgeに依存しています。FileAgeは、さらにFileTimeToDosDateTimeを使用して時間形式を変換します。決定的な欠陥は、FileAgeがFileTimeToDosDateTimeの戻り値を処理する方法にあります。FileTimeToDosDateTimeは、成功または失敗を示すためにブール値を返し、失敗時にはエラーコードを設定します。しかし、FileAgeはこのブール値の戻り値をチェックしません。FileTimeToDosDateTimeが失敗した場合、FileAgeは-1を返します。その結果、FileExistsはこの-1をファイルが存在しないと解釈します。グレタの特定の問題の根本原因は、ファイルを書き込んでいるプロセスが「最終書き込み時刻」を設定していなかったことでした。有効な最終書き込み時刻がないと、FileTimeToDosDateTimeは失敗し、FileAgeは-1を返し、したがってFileExistsは誤ってファイルを存在しないと報告します。これは、システムライブラリで一般的な問題であり、エラー処理における微妙なエラーが重大な機能バグにつながることを浮き彫りにしています。
CdXz5zHNQW_L7qyl0OcGp.jpeg
DNS の CAA レコードタイプは、ドメイン所有者が、自分のドメインに対して証明書を発行することを許可されている証明書発行者を指定できるようにします。当初は RFC6844 で定義され、その後 RFC8659 で更新されましたが、コアコンセプトは同じままです。CAA レコードの重要な機能は「Issuer Critical」フラグであり、これは発行者が証明書を発行する前にレコードを検証することを意図しています。このクリティカルフラグは、フラグビットマスクのビット 0 として設計されており、有効にするには値 128 を使用する必要があります。しかし、一般的な誤解により、多くの人がビット 7 をクリティカルフラグと解釈して値 1 を使用しました。この誤解は、RFC を十分に読んでいないユーザーの間で広く見られます。Let's Encrypt のような証明書発行者はジレンマに直面しました。仕様に厳密に従って誤って設定されたレコードを拒否するか、機能性を維持するために広く見られるエラーに対応するかです。彼らは後者を選択し、事実上、値 1 をクリティカルフラグのエイリアスとして受け入れました。この決定は、元の仕様への厳密な準拠よりも、ユーザーエラーの実際的な現実を認識しています。filterCAA の提供された Go コードスニペットは、これが実際にはどのように処理されるかを示しています。「issue」および「issuewild」タグをフィルタリングし、認識されないクリティカルタグもチェックします。特に、コードは、認識されないクリティカルタグが存在するかどうかを判断するために、フラグが 128(正しい値)または 1(一般的に使用される誤った値)に設定されているかどうかをチェックします。両方の値を含めることは、クリティカルフラグに関する広く見られるユーザーエラーへの対応を反映しています。著者は、このようなフラグにビットマスクを使用することが混乱やエラーにつながる場合、その賢明さに疑問を呈し、より単純なフラグメカニズムの方が読みやすく、エラーが発生しにくい可能性があると示唆しています。ビットマスクの有用性は認めつつも、この逸話は、その複雑さが実際の実装において重大な運用上の問題を引き起こす可能性があることを強調しています。技術仕様、ユーザーの理解、および実際の間の相互作用は、繰り返されるテーマです。
Valaは、C#のような機能とCに近いパフォーマンスを持つ、Gnome向けに設計されたプログラミング言語です。非同期プログラミングをasync/awaitセマンティクスでサポートしており、関数が制御を譲渡することを可能にします。Valaの多くのI/Oライブラリ関数は非同期であり、make_directory_asyncなどがその例です。しかし、コアライブラリには、ディレクトリチェーンを同期的に作成するcreate_directory_with_parentsの非同期バージョンが欠けています。この欠落は、非同期での競合状態の処理の複雑さが原因である可能性が高いです。作者であるEriはこの問題に遭遇し、カスタムの非同期ソリューションを実装しました。Eriの初期のアプローチは、リーフノードから親ノードへとディレクトリを作成しようとし、不足している親を配列に収集します。その後、この配列を逆方向に反復してディレクトリを作成します。この方法は、制御フローのために例外処理を使用しているため、洗練されていないと考えられています。Eriは、特に非同期競合状態の管理において、問題の難しさを認めています。メインループのわずかに改善されたバージョンが提示されていますが、アプローチは依然として複雑です。そのぎこちなさにもかかわらず、Eriのソリューションは、欠けているライブラリ機能を効果的に解決しています。作者は、実装された関数が正しく動作したら隠すべきだと示唆しています。
CdXz5zHNQW_tmcjJ0Qed6.jpeg
ミニスプリットシステムは、コストパフォーマンスとエネルギー効率の高さから、古い住宅の改修に広く利用されていますが、赤外線リモコンに依存しているため、ホームオートメーションとの連携が複雑になります。 これらのシステム内部の温度変換ロジック、特に摂氏と華氏間の変換において、よくある問題が発生します。ミニスプリットをホームオートメーションに統合しようとするオープンソースプロジェクトにより、この温度変換方法に欠陥があることが明らかになりました。このプロジェクトのコードでは、摂氏から華氏、および華氏から摂氏への変換にルックアップテーブルを使用しています。これらのテーブルには特定の(しばしば不正確な)マッピングが含まれており、標準的な変換式と比較して不一致が生じます。例えば、18℃は(四捨五入した場合)より正確な64°Fではなく、誤って65°Fにマッピングされています。 これらのルックアップテーブルの設計からは、正確な数学的計算というよりは、近似的な換算を試みていることがうかがえます。筆者は当初、これを趣味のプロジェクトによる単純な最適化だと考えていましたが、コード内のコメントにより、これらが「リモコンに基づく直接的な対応関係」であることが明らかになりました。これは、不正確さがリモコン自体に起因していることを示しています。 リモコンは、浮動小数点演算を効率的に処理できない可能性のある組み込みマイコンの制限により、ルックアップテーブルを使用していると考えられます。その結果、ユーザーがリモコンで72Fのような温度を設定すると、リモコンは内部でそれを概算の摂氏値(例:22.5C)に変換してから、ユニットにコマンドを送信します。この近似は、ほとんどの状況では「十分」ですが、精密な自動化においては不整合を引き起こします。 著者によれば、根本的な問題は、この趣味のプロジェクトのコードやリモコンそのものではなく、世界的に非標準の単位(華氏)が依然として使用されていることにあり、それがこうした不正確な換算を余儀なくさせているのです。
レイチェルは新しいチームに参加し、そこでは上司のザーンが、最低コストでウィジェット生産を最大化することに焦点を当てた、メトリクス主導のアプローチを強調していました。自動化された生産ラインは複雑なソフトウェアを伴い、テストの制約から、変更は実際の生産でのみ検証されていました。レイチェルの最初のタスクは、ユーザーは常にExcelを好んでいましたが、6つのデータベースからデータを取得するGoogleスプレッドシートのメトリクスダッシュボードを更新することでした。チームは、「単位時間あたりのウィジェット生産数」のような出力メトリクスのみを追跡しており、システムの動作やボトルネックを説明するための詳細なデータはありませんでした。例えば、自動品質管理スキャナーは、ウィジェットが拒否された理由、さらには拒否されたアイテムの数を直接記録していませんでした。ソフトウェアへの変更は全体的な出力メトリクスに対してスコアリングされ、これらのメトリクスはノイズが多く、ソフトウェア自体以外の外部要因の影響を受けていたため、検証が困難でした。拒否されたウィジェットを記録する変更を実装しようとするレイチェルの試みは、当初、彼女のコードではなく環境問題によって引き起こされたメトリクスの後退によって妨げられました。限られたテスト実行とメトリクスの後退を考慮する必要性から、単純な変更でさえ検証に数週間かかることがありました。レイチェルは、有用なシステムモデルを構築することを期待して、より詳細なデータを収集するためにコードにインストルメンテーションを追加し始めました。しかし、ザーンは主要な出力メトリクスの即時改善に固執していました。彼は、そのような診断データは「主要メトリクス」ではないと述べ、それらのメトリクスがそのように動作する理由を理解するためのデータを収集することの価値を却下しました。これは、システムの理解を求めるレイチェルの願望と、トップラインのパフォーマンス指標に焦点を当てるザーンとの間に根本的な対立を生み出しました。レイチェルは、トップレベルのメトリクスを改善するために行った変更が、その変更の動作を説明するためのインストルメンテーションも含まれるようにすることで、妥協点を見つけました。この戦略により、メトリクスの改善に対するザーンの要求を満たし、システムのオブザーバビリティを段階的に向上させることができました。最終的に、包括的な洞察なしにトップレベルのメトリクスを推進することと比較して、複雑なシステムの理解は低い優先順位のままでした。
このブログ記事では、問題のあるPHPコードについて説明します。著者は一人で作業しており、カタルシスとブラックユーモアのために共有しています。機密性を保護するため、コードは一般化されており、矛盾が生じる可能性があります。コードはデータを取得し、それを反復処理し、ローカライゼーションのために動的なプロパティアクセスを使用して詳細を取得します。次に、カテゴリ変数に基づいてコストをフォーマットし、任意のインデックスを持つ配列$motにアクセスします。数量選択ブロックの生成を含む、広範なHTML文字列操作が存在します。コードは時間のデータをデコードするためにJSONをデコードしており、日付が文字列として保存されていることを示しています。ドロップダウンリストは$mot配列の値を使用して構築されます。最終的に、処理されたデータはテンプレートに挿入されます。このプロセスは子アイテムに対しても繰り返され、ほぼ重複したコードにつながります。さらに、子アイテムは兄弟を持つこともでき、同様のコードロジックで別の反復処理が必要になります。著者は、元のプログラマーが最終的にメソッドと関数を使用することを学ぶことを願っています。提供されたコードスニペットは、メインアイテムと子アイテムの初期データ取得と処理ループを示しています。コスト計算とフォーマットのための複雑な条件付きロジックが含まれています。ローカライゼーションと通貨のための動的なプロパティアクセスが強調されています。数量と時間の選択のためのHTMLスニペットの導入も指摘されています。メインアイテム、子アイテム、兄弟アイテムのコードの繰り返し性は、コードベースを非効率にしています。
提供されたC++コードスニペットは、Deadlock例外の例外ハンドラを示しています。この例外をキャッチすると、コードはretryを試みます。しかし、retryは標準的なC++キーワードではなく、おそらくマクロです。著者は、このマクロがgotoステートメントを使用して実装されていると推測しています。中心的な問題は、retryがデッドロックを解決するという仮定にあります。デッドロックは、2つ以上のスレッドが無限にブロックされ、それぞれが別のスレッドが保持しているリソースを待機している場合に発生します。retryが効果的であるためには、デッドロックされたスレッドが現在保持しているリソースを解放する必要があります。コードの著者であるKevinによると、retryマクロはいかなるリソースも解放しません。代わりに、単にcatchブロックの先頭にジャンプします。これは、スレッドがデッドロック状況に閉じ込められたままであることを意味します。Kevinは、システムがすでに多数のデッドロックに苦しんでいたと指摘しています。コンサルタントがリソースアクセスの順序を変更し、ミューテックス関連の問題を特定することによって、これらの問題に対処するために雇われました。コンサルタントによるretryの実装は、意図せずにさらに多くのデッドロックを導入したようです。Kevinは、コンサルタントが独自のデッドロックを追加するつもりだったのではないかとユーモラスに示唆しています。
カキストクラシー、すなわち最悪で最も資格のない者による統治という概念が、関連概念として導入される。教師であるジャレッドBは、ハリーという機械工学教授が設立したEdTech企業での経験を共有する。ハリーはCインタプリタを開発し、それを基盤とした企業を設立し、Cプログラミングに基づいたK-12カリキュラムを提供していた。彼のソフトウェアには、Web IDEと、Cコードをリモートで実行するためのデーモンを備えたローカルインストール版Windowsが含まれていた。しかし、このデーモンには認証機能がなく、0.0.0.0にバインドされていたため、同じネットワーク上の任意のドメインやコンピュータが任意のCコードを実行できる状態だった。これらの重大なセキュリティ脆弱性は、ハリーが専属で雇っていた大学院生開発者たちに見過ごされたまま、長年存在していた。このソフトウェアは数千台の学校用コンピュータにインストールされていた。ジャレッドはこれらの問題についてハリーに報告し、ハリーは「セキュリティ改善」を理由にアップデートをリリースしたが、ITリーダーにアップデートの重要性を伝えることはなかった。ジャレッドはまた、ハリーの別のウェブサイトでクッキースティーリングエクスプロイトとコードインジェクションの脆弱性を発見した。後者の脆弱性により、数千件の暗号化されていないクレジットカード取引記録が漏洩した。これらの重大なセキュリティ上の欠陥とデータ漏洩にもかかわらず、ハリーの会社は事業を継続し、称賛を受けている。コメンテーターは、この状況を、古い技術に固執していたが教育システムを危険にさらさなかった知人と対比させている。
CdXz5zHNQW_B1k6IsjyP4.png
著者は、糟糕なソフトウェアのドキュメントのフラストレーションと、さらに大きな課題である質の悪いハードウェアデータシートを対比させている。集積回路の正確で完全なドキュメントを見つけることは、開発者にとって非常に重要である。データシートはしばしば不完全であったり、不正確であったり、あるいは異なる言語で書かれていたりする。現代のチップの複雑さは詳細なデータシートを必要とするが、一部のベンダーは不十分な情報しか提供せず、ユーザーに機能の逆アセンブルを強いる。データシートと実際のチップの動作との間の不一致は、電源ピンの誤認識やコンポーネントの損傷といった重大なエラーにつながる可能性がある。優れたデータシートを作成するベンダーもいる一方で、組み込み分野におけるコストの考慮事項が、しばしばドキュメントの不十分なハードウェアにつながる。著者は、チップのデータシートに「Super User Fantastic Feature Enable Register」と記載されていた具体的な事例を回想している。このレジスタは、開発者が困難な組み込みプロジェクトで経験することから、ユーモラスに「SUFFER」と略された。この機能の有効化は、高度なユーザーがデバッグの動作を変更することを意図していた。このレジスタのリセット値はすべて1であり、デフォルトで有効になっていることを示している。「SUFFER」レジスタという名前は、このような困難なドキュメントに対処する際の感情を的確に捉えている。
著者は、あるMicrosoftプラットフォームから別のプラットフォームへのデータ移行について説明しており、予期せぬ問題が発生しました。当初、データ抽出とロードはSSISによって処理されていましたが、著者はより多くの制御を得るためにPowerShellに切り替えました。目標は、SharePoint on-premisesからSQL Serverデータベースへ顧客ドキュメントとメタデータを移行することでした。重要なフィールドである顧客番号は、SharePointではNumber型として格納されていました。内部的には、SharePointのNumberフィールドはDoubleとして表現されており、10桁の数値を正確に格納するには十分です。しかし、SSISによって生成されたSQL Serverスキーマでは、このフィールドに'float'データ型が使用されていました。著者は、PowerShellスクリプト内の'.Net'型'float'がSQL Serverの'float'型と完全に一致すると誤って仮定しました。この不一致は、SQL Serverの'float'がデフォルトで倍精度であるにもかかわらず、著者がこの表現の違いに気づかなかったために発生しました。その結果、数値が転送および変換される際に、大きな顧客番号が精度損失により最後の数桁を失いました。テスターは当初このエラーを見逃していましたが、完全なデータロード中に発見されました。チームは、破損した数値を特定し、移行後に手動で修正する必要がありました。
CdXz5zHNQW_ElgNsoYbYY.jpeg
ソフトウェア開発には、エディタやコンパイラだけでなく、さまざまなサポートツールが必要です。ソース管理はその代表的な例です。しかし、多くの重要な開発ツールは、優れたものではなく、単に「十分良い」ものに過ぎないと言えます。ビルドシステムはそのようなカテゴリの一つであり、真に優れた選択肢が欠けています。チケットおよびタスク管理ツールもこの問題のあるカテゴリに属し、Jiraはその中でも特に批判されている例です。Jiraが企業に支持されるのは、その豊富な機能にありますが、残念ながらそれが複雑さにつながり、ユーザーはカスタムワークフローをプログラムする必要があります。これにより、実際のプロジェクトの進捗ではなく、プロジェクトマネージャーによる終わりのない設定が行われる可能性があります。Jiraは、チケットワークフローをステートマシンとして定義することを可能にし、チームメンバー間の自動ルーティングも含まれます。その後、テキストは、混乱したJiraワークフローに遭遇したKlinstenを紹介します。表示されたワークフローの例は、バイリンガル(オランダ語と英語)で、過度に複雑です。この過剰な状態と遷移の数は、チームの作業シーケンスを明確にするという目的を損なっています。著者は、ブラウザタブを閉じたいと思った経験に例えて、フラストレーションを表明しています。Klinstenのワークフローの複雑さは、理解して効果的に使用することを困難にしています。
CdXz5zHNQW_LSUkNG7WkF.png