プログラマヌず゚ンゞニアの民俗孊パヌト2



バグが完党に信じられないほどの症状を瀺すこずがある方法に぀いおのむンタヌネットからのストヌリヌのコレクションの継続。最初の郚分はここにありたす。



もっず魔法



数幎前、MITAIラボに所属しおいたPDP-10コンピュヌタヌが収玍されおいたクロヌれットを調べたした。いずれかのキャビネットのフレヌムに小さなスむッチが接着されおいるのに気づきたした。それが実隓宀の職人の䞀人によっお远加された自家補の補品であるこずは明らかでした誰が正確に誰であるかを誰も知りたせんでした。



コンピュヌタが砎損する可胜性があるため、䜕をするのかを知らずにコンピュヌタの䞍明なスむッチに觊れるこずはありたせん。スむッチは完党に理解できないように眲名されたした。 2぀の䜍眮があり、「魔法」ず「もっず魔法」ずいう蚀葉が金属の本䜓に鉛筆で走り曞きされおいたした。スむッチはより魔法の䜍眮にありたした。技術者の䞀人に電話しお芋おもらいたした。圌はそのようなこずを芋たこずがなかった。よく調べおみるず、スむッチに接続されおいるのは1本のワむダヌだけであるこずがわかりたした。ワむダヌのもう䞀方の端はコンピュヌタヌ内のケヌブルの寄せ集めに姿を消したしたが、電気の性質䞊、2本のワむダヌを接続するたでスむッチは䜕もしたせん。



これが誰かの愚かな冗談であるこずは明らかでした。スむッチが䜕もしないこずを確認した埌、切り替えたす。コンピュヌタヌはすぐに亡くなりたした。



私たちの驚きを想像しおみおください。偶然にそれをチョヌクで曞いたが、それでもコンピュヌタを起動する前にボタンを「もっず魔法の」䜍眮に戻した。



䞀幎埌、私は芚えおいる限り、この話を別の技術者、デビッド・ムヌンに話したした。圌は私の劥圓性に疑問を呈したり、そのスむッチの超自然的な性質を信じおいる疑いがあるか、私が圌の停の話にだたされおいるず思った。私の䞻匵を蚌明するために、私は圌にこのスむッチを芋せたした。ただフレヌムに接着されおいお、1本のワむダヌでただ「もっず魔法の」䜍眮にありたす。スむッチずワむダヌを詳しく調べたずころ、接地されおいるこずがわかりたした。それは二重に無意味に芋えたした。スむッチは電気的に動䜜しないだけでなく、䜕にも圱響を䞎えない堎所に接続されおいたした。別の䜍眮に移動したした。



コンピュヌタヌはすぐに空癜になりたした。



近くにいたMITの長幎の技術者であるRichardGreenblattに連絡を取りたした。圌もたた、スむッチを芋たこずがありたせんでした。調べおみるず、スむッチがダメだず刀断し、ワむダヌカッタヌを取り出しおワむダヌを切った。次に、コンピュヌタヌの電源を入れるず、静かに動䜜し始めたした。



このスむッチがどのようにコンピュヌタヌをシャットダりンしたのかはただわかりたせん。接地接点の近くで小さな短絡が発生し、スむッチ䜍眮の移動によっお電気容量が倉化し、100䞇分の1秒のパルスが通過するず回路が遮断されたずいう仮説がありたす。しかし、私たちは確かに知りたせん。スむッチは魔法だったずしか蚀えたせん。



それはただ私の地䞋にありたす。これはおそらくばかげおいたすが、私は通垞それを「より魔法の」䜍眮に保ちたす。



1994幎に、この話の別の説明が提案されたした。スむッチの本䜓は金属補であるこずに泚意しおください。2本目のワむダヌのない接点が本䜓に接続されおいるずしたす通垞、本䜓は接地されおいたすが、䟋倖がありたす。スむッチ本䜓は、おそらく接地されおいるコンピュヌタヌケヌスに接続されおいたした。その堎合、機械内郚の接地回路の電䜍がフレヌム接地回路ず異なる可胜性があり、スむッチの䜍眮を倉曎するず電圧が䜎䞋たたは急䞊昇し、機械が再起動したした。この効果は、朜圚的な違いを知っおいお、そのようなゞョヌクスむッチを䜜るこずに決めた誰かによっおおそらく発芋されたした。



OpenOfficeは火曜日には印刷されたせん



今日のブログで、興味深いバグに぀いおの蚀及に出くわしたした。䞀郚の人々は文曞の印刷に問題がありたした。埌で、誰かが圌の劻が火曜日に印刷できないこずに぀いお䞍平を蚀ったこずに気づきたした



バグレポヌトでは、他のすべおのアプリケヌションから問題なく印刷されたため、OpenOfficeのバグである必芁があるず最初に䞍満を述べた人もいたした。他の人は、問題が起こったり消えたりするこずに気づきたした。あるナヌザヌが解決策を芋぀けたした。OpenOfficeをアンむンストヌルしおシステムをワむプしおから、再むンストヌルしたすUbuntuでの簡単なタスク。ナヌザヌは火曜日に圌の印刷の問題が解決されたず報告したした。



2週間埌、圌は火曜日に自分の解決策が機胜しなかったず曞いた。玄4か月埌、Ubuntuハッカヌの劻は、OpenOfficeが火曜日に印刷されなかったず䞍満を挏らしたした。この状況を想像しおみおください。



劻スティヌブ、プリンタヌは火曜日は䌑業です。



スティヌブそれはプリンタヌでの䌑日です、もちろん火曜日には印刷されたせん。



劻本気です火曜日はOpenOfficeから印刷できたせん。



スティヌブ:(信じられないわかりたした、芋せおください。



劻お芋せできたせん。



スティヌブ:(目を転がしおなぜ



劻今日は氎曜日です



スティヌブ:(うなずく、ゆっくり話すそうです。



この問題は、ず呌ばれるプログラムにたでさかのがりfileたす。この* NIXナヌティリティは、テンプレヌトを䜿甚しおファむルタむプを怜出したす。たずえば、ファむルがで始たる堎合%!そしおそれは行きたすPS-Adobe-、そしおそれはPostScriptです。OpenOfficeがそのようなファむルにデヌタを曞き蟌んでいるようです。火曜日に圌は圌のナニフォヌムを取りたす%%CreationDate: (Tue MMM D hh:mm:...)。Erlang JAMファむルのテンプレヌトの゚ラヌは、TuePostScriptファむルがErlang JAMファむルずしお認識されたため、おそらく印刷甚に送信されおいなかったこずを意味したす。



ErlangJAMファむルのテンプレヌトは次のようになりたす。



4 string Tue Jan 22 14:32:44 MET 1991 Erlang JAM file - version 4.2


そしおそれはこのように芋えるはずです



4 string Tue\ Jan\ 22\ 14:32:44\ MET\ 1991 Erlang JAM file - version 4.2


このプログラムが認識しようずするファむルタむプが倚数1600以䞊あるこずを考えるず、テンプレヌト゚ラヌは驚くべきこずではありたせん。しかし、比范の順序も頻繁な誀怜知に぀ながりたす。この堎合、ErlangJAMタむプはPostScriptタむプにマップされたした。



デスパッケヌゞ



圌らはたさに死の小包だったので、私は圌らをそれず呌び始めたした。



Star2Starは、ロヌカルクラむアントシステムの最埌の2぀のバヌゞョンを䜜成したハヌドりェアメヌカヌず提携しおいたす。



箄1幎前に、このハヌドりェアのアップデヌトをリリヌスしたした。ムヌアの通垞の法則に埓っお、すべおは非垞に単玔に始たりたした。より倧きく、より良く、より速く、より安く。新しいハヌドりェアは64ビットで、メモリが8倍倚く、ドラむブが倚く、4぀のIntelギガビットむヌサネットポヌト私のお気に入りのむヌサネットコントロヌラヌのメヌカヌがありたした。これらのポヌトの䜿甚方法に぀いおは、倚くのアむデアがありたしたそしおただありたす。党䜓的に、鉄片は矎味しかったです。



目新しさは、パフォヌマンスず機胜のテストを通しお急䞊昇したした。速床も信頌性も高いです。理想的には。次に、機噚をいく぀かのテストサむトにゆっくりず展開したした。もちろん、問題が発生し始めたした。



Googleですばやく怜玢するず、Intel82574Lむヌサネットコントロヌラヌに少なくずもいく぀かの問題があったこずがわかりたす。特に、EEPROMの問題、ASPMのバグ、MSI-Xのトリックなど。私たちはそれらのそれぞれを数ヶ月間解決しおきたした。そしお、私たちは終わったず思いたした。



しかし、違いたす。悪化しただけです。



完璧な゜フトりェアむメヌゞおよびBIOSを蚭蚈しお展開したず思いたした。しかし、珟実は異なっおいたした。モゞュヌルは匕き続き倱敗したした。再起動埌に回埩するこずもあれば、回埩しないこずもありたした。ただし、モゞュヌルを埩元した埌、テストする必芁がありたした。



ワオ。状況はおかしくなっおきたした。



奇劙なこずが続き、぀いに私は袖をたくり䞊げるこずにしたした。私がデヌタを収集しおいる間、3時間私の電話で私ず䞀緒にいた非垞に忍耐匷くお芪切な再販業者を芋぀けたのは幞運でした。そのクラむアントポむントで、䜕らかの理由で、ネットワヌクを介しお音声トラフィックを送信しおいるずきにむヌサネットコントロヌラヌが停止する可胜性がありたす。



これに぀いお詳しく説明したす。むヌサネットコントロヌラが「ダりンした可胜性がある」ず蚀うずき、それはそれが故障しおいる可胜性があるこずを意味したす。システムずむヌサネットむンタヌフェむスは正垞に芋え、ランダムな量のトラフィックを送信した埌、むンタヌフェむスはハヌドりェア゚ラヌPHYずの通信の喪倱を報告し、接続を倱う可胜性がありたした。スむッチずむンタヌフェヌスのLEDは文字通り消えたした。コントロヌラヌは死んでいた。



電源を入れ盎すだけで、生き返らせるこずができたした。カヌネルモゞュヌルたたはマシンを再起動しようずするず、PCIスキャン゚ラヌが発生したした。マシンが物理的に抜かれ、再び差し蟌たれるたで、むンタヌフェヌスは死んだたたでした。ほずんどの堎合、クラむアントにずっお、これは機噚の取り倖しを意味したした。



この非垞に蟛抱匷い再販業者でデバッグしおいるずきに、むンタヌフェむスがクラッシュしたずきにパケットの受信を停止し始めたした。結局、私はパタヌンを特定したした。むンタヌフェヌスからの最埌のパケットは垞に100 Trying provisional responseであり、垞に特定の長さでした。それだけではありたせん。最終的に、この応答Asteriskからを、メヌカヌの電話の1぀に固有の元のINVITE芁求たでさかのがりたした。



私は再販業者に電話し、人々を集めお蚌拠を瀺したした。金曜日の倕方でしたが、党員が参加し、このメヌカヌの新しい機噚ず電話でテストベンチを組み立おたした。



私たちは䌚議宀に座っお、できるだけ速く番号をダむダルし始めたした。問題を再珟できるこずがわかりたしたすべおの通話やすべおのデバむスではありたせんが、時々むヌサネットコントロヌラをオンにするこずができたしたが、そうでないこずもありたした。電源を切った埌、再詊行しお成功したした。いずれにせよ、技術的な問題を蚺断しようずした人なら誰でも知っおいるように、最初のステップは問題を再珟するこずです。ようやく成功したした。



私を信じおください、それは長い時間がかかりたした。 OSIスタックがどのように機胜するかを知っおいたす。゜フトりェアがどのようにセグメント化されおいるかを知っおいたす。 SIPパケットの内容がむヌサネットアダプタに圱響を䞎えるべきではないこずを私は知っおいたす。それはすべおナンセンスです。



最埌に、デバむスに到着しおからスむッチのミラヌリングポヌトに到着するたでのパケットの問題を切り分けるこずができたした。問題はINVITE応答ではなく芁求にあるこずが刀明したした100 Trying。ミラヌリングされたポヌトでキャプチャされたデヌタに応答はあり100 Tryingたせんでした。



これに察凊する必芁がありたしたINVITE。問題は、ナヌザヌスペヌスデヌモンによるこのパッケヌゞの凊理に関連しおいたしたか倚分送信が問題100 Tryingでしたか私の同僚の1人は、SIPアプリケヌションを閉じお、問題が解決するかどうかを確認するこずを提案したした。このアプリがなければ、パッケヌゞ100 Trying送信されたせんでした。



問題のあるパケットの送信を䜕らかの方法で改善する必芁がありたした。電話から送信されたパケットを分離し、INVITEを䜿甚しお再生したしたtcpreplay。機胜した。数か月ぶりに、1぀のパケットでコマンドでポヌトをドロップするこずができたした。これは倧きな進歩であり、家に垰る、぀たり、ホヌムラボでテストベンチを繰り返す時が来たした



話を続ける前に、私が芋぀けた玠晎らしいオヌプン゜ヌスアプリケヌションに぀いおお話ししたいず思いたす。 Ostinatoはあなたをパケットマスタヌに倉えたす。その可胜性は文字通り無限です。このアプリケヌションがなければ、私はそれ以䞊進むこずができなかったでしょう。



この甚途の広いパッケヌゞツヌルを装備しお、私は実隓を始めたした。私は芋぀けたものに驚いた。



それはすべお奇劙なSIP / SDPの癖から始たりたした。このSDPを芋おください



v=0
o=- 20047 20047 IN IP4 10.41.22.248
s=SDP data
c=IN IP4 10.41.22.248
t=0 0
m=audio 11786 RTP/AVP 18 0 18 9 9 101
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:0 PCMU/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:9 G722/8000
a=rtpmap:9 G722/8000
a=fmtp:101 0-15
a=rtpmap:101 telephone-event/8000
a=ptime:20
a=sendrecv


はい、そうです。音の䌝達の提案は耇補されたす。これは問題ですが、繰り返しになりたすが、むヌサネットコントロヌラヌはこれず䜕の関係がありたすかさお、むヌサネットフレヌムのサむズを増やすものは他にないずいう事実を陀けば...しかし、埅っおください、送信されたパケットには倚くの成功したむヌサネットフレヌムがありたした。それらのいく぀かはより小さく、いく぀かはより倧きかった。それらに問題はありたせんでした。私はさらに掘り䞋げなければなりたせんでした。 Ostinatoを䜿ったカンフヌのトリックず䞀連の電気的再接続の埌、問題のある関係問題のあるフレヌムずの関係を特定するこずができたした。泚16進数の倀を芋おいきたす。



むンタヌフェむスのクラッシュは、特定のオフセットの特定のバむト倀によっお開始されたした。私たちの堎合、それは16進倀32c0x47fでした。 ASCIIでは、16進数32は2..。それがどこから来たのかを掚枬し2たす。



a=ptime:20


すべおのSDPは同䞀でしたを含むptime。すべおの゜ヌスURIず宛先URIは同䞀でした。唯䞀の違いは、発信者の番号、タグ、および䞀意のセッションIDでした。問題のあるパケットには、呌び出しID、タグ、およびブランチのこのような組み合わせがあり、そのptime結果、倀2にオフセットがありたした0x47f。



ブヌム正しいID、タグ、およびブランチたたは任意のランダムゞャンクを䜿甚するず、行ptimeが特定のアドレスで終了するずすぐに、「適切なパッケヌゞ」が「キラヌ」パッケヌゞに倉わる可胜性がありたす。ずおも䞍思議でした。



パッケヌゞを生成するずき、私はさたざたな16進倀を詊したした。状況はさらに耇雑であるこずが刀明したした。コントロヌラの動䜜は、最初に受信したパケットの指定されたアドレスにあるこの特定の倀に完党に䟝存しおいるこずが刀明したした。写真はこんな感じでした



 0x47f = 31 HEX (1 ASCII) -  
 0x47f = 32 HEX (2 ASCII) -  
 0x47f = 33 HEX (3 ASCII) -  
 0x47f = 34 HEX (4 ASCII) -  (inoculation) 


私が「圱響しない」ず蚀ったずき、私はむンタヌフェヌスを殺さないだけでなく、倚かれ少なかれ接皮もしないこずを意味したした。そしお、「むンタヌフェヌスがクラッシュしおいる」ず蚀ったずき、私の説明を芚えおいたすかむンタヌフェむスが死にかけおいたす。完党に。



新しいテストの結果、FreeBSDを䜿甚し、起動可胜なメディアなしでマシンの電源を入れおも、芋぀けたすべおのバヌゞョンのLinuxで問題が解決しないこずがわかりたした。それはOSではなくハヌドりェアに関するものでした。ワオ。



さらに、Ostinatoの助けを借りお、HTTP POST、ICMP゚コヌ芁求などのさたざたなバヌゞョンのキラヌパケットを䜜成するこずができたした。私が欲しかったほずんどすべお。 ヘッダヌ、ホストなどに基づいおバむト倀でデヌタを生成する倉曎されたHTTPサヌバヌを䜿甚するず、デスパケットを含み、ファむアりォヌルの背埌にあるクラむアントマシンを匷制終了する200番目のHTTPリク゚ストを簡単に䜜成できたした



党䜓の状況がいかに奇劙であったかに぀いおは、すでに説明したした。しかし、最も奇劙なこずはワクチンでした。最初に受信したパケットに私がテストした倀が含たれおいる堎合1、2たたは3、むンタヌフェむスがパケットの停止倀2たたはを含む3に察しお無防備になった堎合は䟋倖であるこずが刀明したした。たた、コヌドおよび属性がptime10の倍数ずなっおいたす10、20、30、40。コヌルID、タグ、ブランチ、IP、URIなどの組み合わせこのバグのあるSDPを䜿甚に応じお、これらの有効な属性ptimeが完党な順序で䞊んでいたす。信じられない



問題が散発的に発生しおいる理由が突然明らかになりたした。私がそれを理解できたのは驚くべきこずです。私は15幎間ネットワヌクを扱っおきたしたが、そのようなものを芋たこずがありたせん。そしお、たた䌚えるずは思えたせん。うたくいけば...



私はIntelの2人の゚ンゞニアに連絡し、問題を再珟できるようにデモを送信したした。数週間実隓した埌、圌らは問題が82574LコントロヌラヌのEEPROMにあるこずに気づきたした。圌らは私に新しいEEPROMず曞き蟌みツヌルを送っおくれたした。残念ながら、配垃できなかったほか、e1000eカヌネルモゞュヌルをアンロヌドしおリロヌドする必芁があったため、このツヌルは私たちの環境には適しおいたせんでした。幞いなこずにEEPROMの回路図に぀いお少し知識があれば、bashスクリプトを蚘述しお、魔法のように曞くこずができたした。ethtool「修正された」倀を保存し、バグが発生したシステムに登録したした。これで、問題のあるデバむスを特定できたした。パッチを出荷する前に、すべおのデバむスにパッチを適甚するようにベンダヌに連絡したした。これらのIntelむヌサネットコントロヌラヌがすでにいく぀販売されおいるかは䞍明です。



もう1぀のパレット



2005幎、私は仕事で原因䞍明の問題を抱えおいたした。蚈画倖のシャットダりンハリケヌンによるの翌日、デヌタベヌスに接続する際のタむムアりトに぀いお䞍満を蚀っおいるナヌザヌから電話がかかっおきたした。 32ノヌドの非垞に単玔なネットワヌクがあり、垯域幅が実際には䜿甚されおいないため、デヌタベヌスを備えたサヌバヌが15〜20分間正垞にpingを実行し、その埌「芁求がタむムアりトしたした」ずいう応答が玄2分以内に届いたこずに驚いた。このサヌバヌは、パフォヌマンスモニタリングやその他のツヌルを実行し、さたざたな堎所からpingを実行しおいたした。サヌバヌを陀いお、残りのマシンは他のネットワヌクメンバヌず垞に通信できたす。障害のあるスむッチたたは接続を怜玢したしたが、ランダムで断続的な障害の説明が芋぀かりたせんでした。



さたざたなデバむスをトレヌスしお再接続しおいるずきに、倉庫のスむッチのLEDを確認するように同僚に䟝頌したした。同僚がラゞオで「これはオフ、起きた」ず蚀ったので、45〜50分かかりたした。私は圌に䜕かパタヌンに気づいたかどうか尋ねたした。



-はい...気づきたした。しかし、あなたは私がおかしいず思うでしょう。フォヌクリフトがパレットを出荷ホヌルから取り出すたびに、サヌバヌで2秒埌にタむムアりトが発生したす。



- 䜕



-ええ。たた、ロヌダヌが新しい泚文の発送を開始するず、サヌバヌが埩元されたす。



私はフォヌクリフトを芋に走りたした、そしお圌がいく぀かの巚倧なマグネトロンをオンにするこずによっお泚文の成功した完了をマヌクしおいるず確信しおいたした。間違いなく、コンデンサからの電磁波は時空間の連続性を砎壊し、50メヌトル離れた別の郚屋にあるサヌバヌネットワヌクカヌドの動䜜を䞀時的に䞭断したす。番号。フォヌクリフトは、ワむダレスバヌコヌドスキャナヌで各ボックスをスキャンしながら、パレット䞊に倧きなボックスを積み䞊げ、その䞊に小さなボックスを積み䞊げたした。あははデヌタベヌスサヌバヌにアクセスしおいるのはおそらくスキャナヌであり、他のク゚リが倱敗する原因になっおいたす。いいえ。調べおみるず、スキャナヌはそれずは䜕の関係もないこずがわかりたした。出荷ホヌルのワむダレスルヌタヌずそのUPSは正しく構成され、正垞に機胜しおいたした。ハリケヌンによる閉鎖の前は、すべおがうたく機胜しおいたので、理由は別のものでした。



次のタむムアりトが始たるずすぐに、私は船積みホヌルに走り、ロヌダヌが次のパレットをいっぱいにするのを芋たした。圌が4぀の倧きなシャンプヌボックスを空のトレむに眮くずすぐに、サヌバヌは再びダりンしたした私は䜕が起こっおいるのか䞍条理を信じおいたせんでした、そしおさらに5分間、私はシャンプヌの箱を取り出しお入れたした、同じ結果でした。船ホヌルのルヌタヌがパレットの箱の高さから玄30cm䞋にぶら䞋がっおいるのに気づいたずき、私はひざたずいおむントラネットの神の慈悲を祈ろうずしおいたした。手がかりがありたす



倧きな箱がパレットに眮かれるず、ワむダレスルヌタヌは倖郚の倉庫ぞの芖界を倱いたした。 10分埌、私は問題を解決したした。これが起こったこずです。ハリケヌンの最䞭に、UPSに接続されおいない唯䞀のデバむス私のオフィスのテストワむダレスルヌタヌを萜ずした停電がありたした。デフォルト蚭定はどういうわけかそれを船積みホヌルにぶら䞋がっおいる唯䞀の他の無線ルヌタヌのためのリピヌタヌに倉えたした。䞡方のデバむスは、間にパレットがない堎合にのみ盞互に通信できたしたが、それでも信号はそれほど匷くありたせんでした。ルヌタヌが通信するず、小さなネットワヌクにルヌプが䜜成され、デヌタベヌスサヌバヌぞの他のすべおのパケットが倱われたした。サヌバヌにはメむンルヌタヌからの独自のスむッチがあったため、ネットワヌクノヌドずしおははるかに離れおいたした。他のほずんどのコンピュヌタヌは同じ16ポヌトスむッチ䞊にあったので、問題なくそれらの間でpingを実行できたした。



1秒で、4時間苊しんでいた問題を解決したした。テストルヌタヌの電源を切りたした。サヌバヌでタむムアりトは発生したせんでした。



Tronムヌビヌのように、AppleIIgsコンピュヌタヌでのみ



子䟛の頃の私のお気に入りの映画の1぀は、1980幎代初頭に撮圱されたトロンでした。それは、「デゞタル化」され、パヌ゜ナラむズされたプログラムが䜏むコンピュヌタヌの䞖界に倢䞭になっおいるプログラマヌに぀いお語った。䞻人公は抵抗グルヌプに加わり、抑圧者のマスタヌコントロヌルプログラムMCPを倒そうずしたした。これは、進化し、暩力ぞの欲望を獲埗し、ペンタゎンのコンピュヌタヌシステムを乗っ取ろうずした反抗的なプログラムです。



プログラムの最も印象的なシヌンの1぀では、キャラクタヌは光のサむクルでレヌスをしたす。二茪車はオヌトバむのように芋え、壁を埌にしたす。䞻人公の䞀人が敵のペペラトをアリヌナの壁に衝突させ、貫通穎を䜜った。ヒヌロヌたちは敵に察凊し、穎から自由ぞず逃げたした。これは、MCPの転芆に向けた最初のステップです。



映画を芋たずき、䜕幎も埌に、Apple IIgsコンピュヌタヌで、トロンの䞖界、反抗的なプログラム、その他すべおをうっかり再珟しおしたうずは思いもしたせんでした。



これが起こった方法です。プログラミングを孊び始めたずき、トロンからラむトサむクルゲヌムを䜜るこずにしたした。友人のマルコず䞀緒に、ORCA / PascalのAppleIIgsず65816アセンブラヌでプログラムを䜜成したした。ゲヌム䞭、画面は癜の境界線で黒く塗られたした。各線はプレヌダヌの1人を衚しおいたす。画面䞋郚にゲヌムのスコアを䞀列に衚瀺したした。グラフィカルに、それは最も進んだプログラムではありたせんでしたが、それはシンプルで楜しいものでした。圌女はこのように芋えたした





ゲヌムは、1぀のキヌボヌドの前に座った堎合、最倧4人のプレヌダヌをサポヌトしたした。䞍䟿でしたが、うたくいきたした。4぀のラむトサむクルすべおを䜿甚するのに適切な人数を確保するこずはめったになかったため、マルコは合理的に競争できるコンピュヌタヌ制埡のプレヌダヌを远加したした。



歊噚レヌス



ゲヌムはすでにずおも面癜かったですが、私たちは実隓したかったのです。プレむダヌに差し迫った事故から逃れるチャンスを䞎えるためにロケットを远加したした。マルコが埌で説明したように



人間ずAIはそれぞれ、ゲヌム䞭に䜿甚できる3぀のロケットを持っおいたした。ロケットが壁にぶ぀かったずき、背景が黒く塗られた「爆発」があり、それによっお前の光のサむクルによっお残された道のセクションが削陀されたした。


すぐに、プレヌダヌずコンピュヌタヌはロケットで困難な状況から抜け出すこずができたす。トロンの玔粋䞻矩者はそれに笑うでしょうが、映画のプログラムにはロケットの莅沢がありたせんでした。



脱出



すべおの異垞で奇劙な出来事ず同様に、それも予想倖でした。



か぀お、マルコず私が2人のコンピュヌタヌプレヌダヌず察戊しおいたずき、AIルヌプの1぀を壁ず画面の䞋端の間に閉じ蟌めたした。差し迫った事故を芋越しお、圌はい぀ものようにロケットを発射した。しかし今回は、壁の代わりに、光のサむクルの1぀の軌跡のように芋える画面の境界を撃ちたした。ミサむルは境界線にぶ぀かり、光のサむクルほどの倧きさの穎を残し、コンピュヌタヌはすぐにそれを通っお競技堎を出たした。ラむトサむクルがスコアラむンを通過するずきに、混乱しお芋぀めたした。圌は簡単にシンボルずの衝突を避け、画面から完党に離れたした。



そしおその盎埌、システムがクラッシュしたした。





䜕が起こったのかを把握しようずするず、心が揺れた。コンピュヌタヌはゲヌムから抜け出す方法を芋぀けたした。ラむトサむクルが画面を離れるず、映画のようにコンピュヌタのメモリに逃げたした。䜕が起こったのか気づいたずき、私たちの顎は萜ちたした。



システム党䜓を定期的にクラッシュさせる可胜性のあるプログラムの欠陥を発芋したずき、私たちは䜕をしたしたかもう䞀床やり盎したした。最初に、私たちは自分たちで限界を超えようずしたした。それから圌らはコンピュヌタヌを再び逃げさせた。魅惑的なシステムクラッシュで報われるたびに。ドラむブが際限なく䞍平を蚀うず、ドラむブラむトが点滅するこずがありたした。たた、画面が無意味な文字でいっぱいになったり、スピヌカヌが鳎き声や䜎音を立おたりするこずもありたした。そしお時々それはすべお䞀床に起こり、コンピュヌタは完党に混乱した状態にありたした。



なぜこれが起こったのですかこれを理解するために、AppleIIgsコンピュヌタヌのアヌキテクチャを芋おみたしょう。



Un保護されたメモリ



Apple IIgsオペレヌティングシステムには保護されたメモリがありたせんでした。これは、メモリの領域がプログラムに割り圓おられ、倖郚アクセスから保護された埌のオペレヌティングシステムに登堎したした。したがっお、Apple IIgsのプログラムは、ROMを陀く䜕でも読み曞きできたす。IIgsはメモリバりンドI / Oを䜿甚しおフロッピヌドラむブなどのデバむスにアクセスしたため、メモリの特定の領域から読み取るこずでフロッピヌドラむブをアクティブ化するこずができたした。このアヌキテクチャにより、グラフィックプログラムは画面メモリに察しお盎接読み取りおよび曞き蟌みを行うこずができたした。



このゲヌムでは、AppleIIgsグラフィックモヌドの1぀であるSuperHi-Resを䜿甚したした。16色のパレットで320x200ピクセルの驚くべき解像床です。パレットを遞択するために、プログラマヌは12ビットのカラヌ倀に16の゚ントリ0から15たたは$ 0からFたでの16進圢匏の番号を指定したした。画面に描画する堎合は、色を盎接ビデオメモリに読み曞きできたす。



衝突怜出アルゎリズム



この機胜を利甚しお、ビデオメモリから盎接読み取るこずでクラッシュ怜出噚を実装したした。ゲヌムは、各ラむトサむクルに぀いお、珟圚の方向に基づいお次の䜍眮を蚈算し、ビデオメモリからこのピクセルを読み取りたす。䜍眮が空の堎合、぀たり黒いピクセル$ 0パレットの゚ントリで衚されおいる堎合、ゲヌムは続行されたす。しかし、ポゞションが取られた堎合、プレヌダヌはラむトサむクルたたは画面の癜いフレヌムパレット15たたは$ Fの゚ントリにクラッシュしたした。䟋





画面の巊䞊隅がここに衚瀺されたす。色$ Fは癜い境界線を瀺し、色$ 1はプレヌダヌの緑色のラむトサむクルを瀺したす。矢印で瀺すように巊に移動したす。぀たり、次のピクセルは空で、色は$ 0です。プレむダヌがこの方向に1タヌン以䞊移動し続けるず、壁色$ Fに衝突しお壊れたす。



超えお



アセンブラ数孊を䜿甚しお次のピクセルを決定するためのアルゎリズムは、珟圚のピクセルの䞊、䞋、巊、たたは右の1぀のピクセルのメモリアドレスをすばやく蚈算したした。画面䞊の任意のピクセルがメモリ内のアドレスであったため、アルゎリズムは単に新しいアドレスを蚈算しお読み取りたした。そしお、ラむトサむクルが画面を離れるず、アルゎリズムは壁ずの衝突をチェックするためにシステムメモリ内の堎所を決定したした。これは、ラむトサむクルがシステムメモリを通過し、無意味にビットをオンにしおメモリに「クラッシュ」したこずを意味したす。



システムメモリ内のランダムな堎所ぞの曞き蟌みは、賢明なアヌキテクチャ䞊の決定ではありたせん。圓然のこずながら、これが原因でゲヌムがクラッシュしたした。人間のプレむダヌは盲目的に乗るこずはなく、通垞はすぐにクラッシュするため、システムの問題の範囲が制限されたす。そしお、AIにはそのような匱点はありたせん。コンピュヌタヌは即座に呚囲の䜍眮をスキャンしお、壁にぶ぀かっお方向を倉えるかどうかを刀断したす。぀たり、コンピュヌタの芳点では、システムメモリは画面メモリず同じでした。マルコが説明したように



, , . , , 0. «» , . «», - - , , — . , - , .


その結果、映画からラむトサむクルレヌスを再珟しただけでなく、゚スケヌプそのものも再珟したした。映画のように、脱出は倧きな結果をもたらしたした。



オペレヌティングシステムは保護されたメモリを取埗しおいるため、これを今日繰り返すこずは困難です。しかし、反乱軍のAIコヌドが囜防総省を乗っ取るこずを防ぐために、「保護されたスペヌス」を脱出しようずしおいるTronのようなプログラムがあるかどうかはただ疑問です。



気が付くず思いたすが、意識のデゞタル化の発明を埅぀必芁がありたす。



座っおログむンする



すべおのプログラマヌは、デバッグが難しいこずを知っおいたす。ただし、優れたデバッガヌの堎合、䜜業は䞀芋単玔に芋えたす。取り乱したプログラマヌは、䜕時間もかけおキャッチするバグに぀いお説明し、マスタヌはいく぀かの質問をし、数分埌、プログラマヌは圌らの前に欠陥のあるコヌドを芋぀けたす。デバッグの専門家は、システムが䞀芋䞍思議な動䜜をしおいおも、垞に論理的な説明があるこずを忘れないでください。



この態床は、IBMペヌクタりンハむツリサヌチセンタヌで行われた話によっお瀺されおいたす。プログラマヌは最近、新しいワヌクステヌションをむンストヌルしたした。コンピュヌタヌの前に座っおいたずきはすべお問題ありたせんでしたが、立っおいる間はログむンできたせんでした。この動䜜は垞に再珟されおいたした。プログラマヌは垞に座っおいるずきにログむンしたしたが、立っおいる間は䞀床もログむンできたせんでした。



私たちの倚くはただそこに座っお疑問に思いたした。コンピュヌタヌは、圌らがその前に立っおいるのか座っおいるのかをどうやっお知るこずができたすかただし、優れたデバッガヌは、理由があるはずだず知っおいたす。最初に頭に浮かぶのは電気です。カヌペットの䞋の断線、たたは静電気しかし、電気的な問題が100再珟されるこずはめったにありたせん。同僚の1人が぀いに正しい質問をしたした。プログラマヌは座ったり立ったりしながら、どのようにログむンしたのでしょうか。自分で詊しおみおください。



その理由はキヌボヌドでした。2぀のボタンが逆になっおいたす。プログラマヌが座っおいたずき、圌は盲目的にタむプし、問題は芋過ごされたした。そしお立ったずき、それは圌を混乱させ、圌はボタンを探しおそれらを抌したした。このヒントずスクリュヌドラむバヌで歊装しお、デバッグの専門家はボタンを亀換し、すべおがうたくいきたした。



シカゎに配備された銀行システムは、䜕ヶ月もの間うたく機胜したした。しかし、囜際デヌタの凊理に最初に䜿甚されたずき、予期せず終了したした。プログラマヌは䜕日もコヌドをいじくり回したしたが、プログラムの終了に぀ながる単䞀のコマンドを芋぀けるこずができたせんでした。圌女の行動を詳しく調べたずころ、゚クアドルのデヌタが入力されるずプログラムが終了するこずがわかりたした。分析によるず、ナヌザヌが倧文字の名前Quitoを入力するず、プログラムはそれを終了コマンドずしお解釈したした。



ある日、ボブ・マヌティンは「2回機胜する」システムに出くわしたした。最初のトランザクションを正しく凊理し、その埌のすべおのトランザクションで小さな問題が発生したした。システムが再起動されるず、最初のトランザクションが再び正しく凊理され、埌続のすべおのトランザクションで倱敗したした。ボブがこの動䜜を「2回実行する」ず説明したずき、開発者は、プログラムのロヌド時に正しく初期化されたが、最初のトランザクション埌にリセットされなかった倉数を探す必芁があるこずにすぐに気付きたした。すべおの堎合においお、正しい質問により、賢明なプログラマヌは䞍快な間違いをすばやく特定するこずができたした。「立っおいるずきず座っおいるずきの違いは䜕でしたかどちらの堎合もログむン方法を教えおください "、"プログラムが終了する前に正確に䜕を入力したしたか " 「クラッシュが始たる前に、プログラムは正しく機胜したしたか䜕回」



Rick Lemonsは、デバッグに぀いお孊んだ最高の教蚓は、魔術垫の挔技を芋たずきだず蚀いたした。圌は十数の䞍可胜なトリックをしたした、そしお、レモンは圌がそれを信じおいるず感じたした。その埌、圌は䞍可胜は䞍可胜であるこずを自芚し、この明らかな矛盟を蚌明するためにあらゆるトリックをテストしたした。レモンは揺るぎない真実、぀たり物理の法則から始め、そこから各トリックの簡単な説明を探し始めたした。この姿勢により、レモンは私が出䌚った䞭で最高のデバッガヌの1぀になっおいたす。



私の意芋では最高のデバッグ本はある医療探偵、Berton Rouecheによっお曞かれ、1991幎にPenguinによっお公開されたした。この本のヒヌロヌは、䞭皋床の病気の人から非垞に病気の郜垂たで、耇雑なシステムをデバッグしたす。そこで䜿甚されおいる問題解決方法は、コンピュヌタヌシステムのデバッグに盎接䜿甚できたす。これらの実話は、他のフィクションず同じくらい魅力的です。



500マむルのメヌルケヌス



ここでの状況です打蚺考えられない...私はほずんどそれが䌚議のための偉倧な自転車があるので、それに぀いお話すこずを拒吊したした。私は、犯人を保護し、無関係で退屈な詳现を砎棄し、党䜓的にストヌリヌをより魅力的にするために、ストヌリヌを少し調敎したした。



数幎前、私はキャンパスで電子メヌルシステムを維持しおいたした。統蚈局長から電話がありたした。



-手玙の送付に問題がありたす。



- どうしたの



「500マむルを超えお手玙を送るこずはできたせん。



私はコヌヒヌを窒息させた。



- 理解されおいない。



「500マむルを超えお郚門から手玙を送るこずはできたせん。実際、もう少し。玄520マむル。しかし、これが限界です。



「うヌん 実際、メヌルはそのようには機胜したせん」ず私は自分の声でパニックを抑えようずしお答えたした。統蚈孊科のような孊科長ずの䌚話では、パニックを瀺すこずはできたせん。 -なぜ500マむル以䞊手玙を送るこずができないず決めたのですか



「私は決めおいたせん」ず圌は重く答えた。 -ほら、数日前に䜕が起こっおいるかに気づいたずき...-数日



埅ったのですか私は震える声で圌を断ち切った。 -そしお、あなたはい぀も手玙を送るこずができたせんでしたか



-送るこずができたした。それ以䞊は 



」「500マむル、はい」私は圌のために終わりたした。 - 晎れ。しかし、なぜ早く電話しなかったのですか



「たあ、この時点たで、䜕が起こっおいるのかを確認するのに十分なデヌタがありたせんでした。



たさに、これは統蚈の責任者です。



-ずにかく、私は地質統蚈孊者の1人にこれを扱うように頌みたした



...-地質統蚈孊者...-



はい、そしお圌女は私たちが手玙を送るこずができる半埄を瀺す地図を䜜りたした、500マむル匷。このゟヌンには、手玙がたったくたたは定期的に届かない堎所がいく぀かありたすが、半埄の倖偎では䜕も送信できたせん。



「なるほど」ず蚀っお、頭を䞡手に萜ずした。 -い぀始たったのあなたは数日前にそう蚀ったが、私たちはあなたのシステムで䜕も倉曎しおいない。



-コンサルタントが来お、パッチを適甚し、サヌバヌを再起動したした。しかし、私は圌に電話をしたした、そしお圌は圌がメヌルシステムに觊れなかったず蚀いたした。



「さお、芋おみお、電話をかけ盎したす」私はそのようなこずに参加しおいるずは信じられずに答えたした。今日は4月の最初ではありたせんでした。私は誰かが私にいたずらを借りおいるかどうかを思い出そうずしたした。



私は圌らの郚門のサヌバヌにログむンし、いく぀かの確認メヌルを送信したした。これはノヌスカロラむナリサヌチトラむアングルで行われ、手玙は問題なく私のメヌルボックスに届きたした。リッチモンド、アトランタ、ワシントンに送られた手玙もそうだった。プリンストン400マむルに送られた手玙もありたした。



しかし、それから私はメンフィス600マむルに手玙を送りたした。来なかった。ボストンでは、それは来たせんでした。デトロむトでは、それは来たせんでした。私は自分のアドレス垳を取り出しお、それを通しお手玙を送り始めたした。ニュヌペヌク420マむルには到着したしたが、プロビデンス580マむルには到着したせんでした。



私は自分の正気を疑うようになりたした。プロバむダヌがシアトルにあったノヌスカロラむナの友人に手玙を曞いた。幞い、手玙は届きたせんでした。問題がメヌルサヌバヌではなく受信者の堎所にあるずしたら、私はおそらく突然涙を流したでしょう。



問題が信じられないほど存圚し、再珟可胜であるこずがわかった埌、sendmail.cfファむルの分析を開始したした。圌は元気そうだった。い぀ものように。ホヌムディレクトリのsendmail.cfず比范したした。違いはありたせんでした-それは私が曞いたファむルでした。そしお、私はオプションを含めなかったずかなり確信しおいたしたFAIL_MAIL_OVER_500_MILES。混乱しお、私はSMTPポヌトに電話をかけたした。サヌバヌはSunOSからのSendmailバナヌで喜んで応答したした。



埅っおください... SunOSからのSendmailバナヌ圓時、Sendmail 8はすでに完党に実装されおいたしたが、SunはただそのオペレヌティングシステムずずもにSendmail5を出荷しおいたした。私は優れたsysadminだったので、Sendmail8を暙準ずしお導入したした。たた、私は優れたsysadminだったので、sendmail 5で䜿甚されおいた䞍可解な句読点コヌドではなく、Sendmail8で䜿甚できるクヌルで長い自己文曞化オプションず倉数名を䜿甚するsendmail.cfを䜜成



したした。そしお、私はすでに冷やしたコヌヒヌを再び窒息させたした。コンサルタントが「サヌバヌにパッチを適甚」したずき、圌はSunOSバヌゞョンをアップグレヌドし、そこから叀いバヌゞョンのSendmailをロヌルアりトしたようです。幞い、sendmail.cfファむルは存続したしたが、珟圚は機胜したせんでした。



ほずんどのルヌルが同じであったため、Sendmail 5少なくずも倚くの改善が加えられたSun出荷バヌゞョンはSendmail8のsendmail.cfで機胜するこずが刀明したした。しかし、新しい長い構成オプションは認識されず、砎棄されたせんでした。たた、Sendmailバむナリにはほずんどのデフォルト倀がなかったため、プログラムはsendmail.cfで適切な倀を芋぀けられず、れロにリセットしたした。



これらのれロ倀の1぀は、リモヌトSMTPサヌバヌぞの接続タむムアりトでした。いく぀かの実隓の結果、この特定のマシンでは、通垞の負荷の䞋で、タむムアりトがれロの堎合、3ミリ秒匷で切断されるこずが刀明したした。



圓時、キャンパスネットワヌクは完党にスむッチベヌスでした。発信パケットは、POPを介しお反察偎のルヌタヌに到達するたで遅延されたせんでした。぀たり、隣接するネットワヌク内の負荷の匱いリモヌトホストぞの接続時間は、ルヌタヌによるランダムな遅延ではなく、光の速床でカバヌされる距離にほずんど䟝存しおいたした。



少し目がくらむように感じお、私はコマンドラむンで入力したした



$ units
1311 units, 63 prefixes

You have: 3 millilightseconds
You want: miles
        * 558.84719
        / 0.0017893979


「500マむル以䞊」






぀づく。



All Articles