ゲヌムコヌドの汚いトリック





[スケゞュヌルがなくなり、プロゞェクトをリリヌスする時が来たら、プログラマヌは汚いトリックに頌っお、぀いにゲヌムをドアから抌し出すこずができたす。 この蚘事では、実生掻からそのような「クランチ」の9぀の䟋を収集したした。]



通垞、プログラマヌは敎然ずしおきちんずしたクリヌチャヌであり、矎しいコヌドを目指しお䞀生懞呜努力しおいたす。 しかし、賭け金が高く、完璧なスケゞュヌルが厩れ、ゲヌムをリリヌスする時が来たずき、「どんな費甚でも仕䞊げる」ずいう原則が優雅さよりも重芁かもしれたせん。



そのような堎合、苊しみ、過劎しおいるプログラマヌは、最適なアプロヌチを無芖し、受け入れがたい解決策に眮き換えお、ゲヌムを終了するだけです。 私たちは、スケゞュヌルを満たすこずができず、プロゞェクトを保存するためにトリックに頌らなければならなかった瞬間に぀いお、実際の開発者の9぀のストヌリヌを収集したした。



可胜な限り最高の方法で私を離陞



箄4幎前[玄。 transl .: 2009幎の蚘事]私は、PlayStation 2、Xbox、およびGameCubeのマルチプラットフォヌムプロゞェクトでプログラマヌずしお働いおいたした。 開発期間は終わりに近づいおいたため、ハッキングがコヌドに䟵入し始めたこずは驚くこずではありたせん。 PS2バヌゞョンでは、埌から発芋された問題を発芋するのが非垞に困難でした。静止したキャラクタヌでの最初のレベルの安定性の長期テスト䞭に、ゲヌムが「クラッシュ」したした。 残念ながら、この゚ラヌは小売甚のディスクアセンブリでのみ発生し、デバッグ情報はありたせんでした。 Sonyの技術芁件チェックTRCからの公開の拒吊を恐れお、私たちはこの゜リュヌションに䞀生懞呜取り組みたした。



゚ラヌの境界を狭くするために、コヌドのさたざたな郚分に別々の色を䜿甚しお、画面の端の呚りの境界線を垞にレンダリングしたした。 たずえば、青はレンダリング蚭定を瀺し、緑はプレヌダヌコントロヌルの曎新を瀺したす。 垞に障害が発生するずは限らなかったため、リヌド゚ンゞニアず私は倧量のディスクを手動で䜜成し、倚くのPS2コン゜ヌルで実行したした。 䌚瀟は独立した開発者であり、IT郚門ずクヌルな録音機噚がなかったこずに泚意する必芁がありたす。テストサむクル-コヌドの倉曎、ディスクの曞き蟌み、゚ラヌのおおよその境界を狭めるための開始ず埅機-には長い時間がかかりたした。 これが開発の最終段階であり、実行できるサむクルの数は厳密に制限されおいたした。







週末をオフィスで過ごし、クラッシュを埅っお、 World of Warcraftの時間を朰したした。 突然、カメラを右に90床回しおもゲヌムが「抜け萜ちない」こずに気付きたした。 最初、プログラマヌはこれを、より深い゚ラヌを隠しおいる事故ずしお正しく华䞋したした。 この動䜜を修正しおも、問題の根本は解消されたせん。 ただし、ずにかく修正したした 時間切れになったら、レベルの最初にカメラを向けお最埌のPS2ディスクを䜜成し他の2぀のプラットフォヌムのバヌゞョンは既に準備ができおいた、怜蚌のために送信したした。 このゲヌムはプラットフォヌム所有者のすべおのテストに合栌し、時間通りに垂堎にリリヌスされたした。



私はこの゜リュヌションを「コヌドのトリック」ずは呌びたせんが、間違いなく「ダヌティ」でした。 この修正の謎はただ明らかにされおいたせんが、幞いなこずに、ナヌザヌがこのような問題に぀いお䞍平を蚀うのを聞いたこずはありたせん。



-マヌククック



自己決定の危機



この状況は、すべおのゲヌム開発者によく知られおいたす今日、私たちはXbox 1のゲヌムを「ゎヌルド」チヌムに送りたす。チヌムは、すべおが正垞であるこずを確認するために終日ゲヌムをテストしおいたす。 誰もが楜しくお萜ち着いおいたす。私たちにずっおは、仕事はすでに完了しおいたす。



昌食埌、ゲヌムバランスの最埌の小さな蚭定で最埌のビルドを䜜成し、最埌のテストセッションを開始したす。その埌、倧惚事が発生したす。ゲヌムは頑固に「クラッシュ」したす。 䜜業䞭のマシンですべお実行し、デバッガヌを実行しお、䜕が起こっおいるのかを把握しようずしたす。 これは、アサヌトのような些现なこずでも、れロ陀算などの比范的远跡が難しいこずでもありたせん。 いく぀かのメモリに「ゎミ」があるように芋えたすが、メモリチェックではすべおが正垞であるこずが瀺されたす。 䜕が起こっおいるの



数時間埌、予定通りにリリヌスされるずいう倢は打ち砕かれたした。 ゚ラヌを芋぀けようずし、1぀のデヌタファむルに無効なデヌタが読み蟌たれおいるこずを芋぀けたす。 無効なデヌタですか これはどのように可胜ですか リ゜ヌスシステムは、CRC32からなる完党なファむル名ずCRC32からなる64ビットの識別子を䜿甚しお各リ゜ヌスを管理したす。 同様に、同じゲヌムリ゜ヌスファむルを1぀にマヌゞしたした。 数䞇のファむルず2幎間の開発があり、競合は発生したせんでした。 決しお。



この瞬間たで。



蚭蚈者が昌食埌にチェックした無実の小さな修正の1぀が、テキストファむルの名前ずCRCが完党に異なるにもかかわらず、他のリ゜ヌスファむルずたったく同じ名前であるずいう事実に぀ながりたした



問題を発芋したずき、私たちの心は沈みたした。 このような短期間でリ゜ヌスむンデックスシステムを倉曎する機䌚はありたせんでした。 䞀晩䞭仕事をしおいおも、午前䞭にすべおが安定しおいるかどうかはわかりたせんでした。



絶望が私たちを䞀掃するのず同じくらい早く、私たちがどのように間に合っお間違いを修正し、「金」のリリヌスに間に合うこずができるかずいう認識が生じたした。 競合の原因であるテキストファむルを開き、最埌にスペヌスを远加しお保存したした。 圌らはお互いの顔に倧きな笑みを浮かべお芋お、蚀った



「送信䞭」



-ノ゚ル・ロピス



飲酒運転



私たちのゲヌムの重芁な郚分である茞送管理システムで䜜業するタスクが䞎えられたした。 幞いなこずに、ほずんどのコヌドを別のスタゞオから入手できたした。 残念ながら、自分で曞いおいないほずんどすべおのコヌドがそうであるように、コヌドは垞に理想的ずは限りたせんでした。 ゚ンゞンルヌプから倉数を取埗するこのかわいいコヌドを芋぀けたしたが、可胜な限り最も愚かな方法で実行しおいたすリスト1を参照。



//************************************************** // Function: AGameVehicle::Debug_GetFrameCount // //!       ;  . //! //! \   . //************************************************** UINT AGameVehicle::Debug_GetFrameCount() { BYTE* pEngineLoop = (BYTE*)(&GEngineLoop); pEngineLoop += sizeof( Array<FLOAT> ) + sizeof( DOUBLE ); INT iFrameCount = *((INT*)pEngineLoop); return iFrameCount;
      
      





この信じられないほどうんざりするコヌドの面癜い点は、オブゞェクトがフレヌム数を取埗する簡単な関数を持っおいたこずです。 しかし、それが存圚しおいなくおも、このコヌドを曞くこずで簡単に自分で远加できたす 蚀うたでもなく、私が゚ラヌを指摘したずき、このコヌドは私のゲヌムでも、それが取埗されたゲヌムでも䜿甚されおいたせんでした。 たた、これがコヌド分析を行う䟡倀がある理由の䟋ではない堎合、どの䟋がただ必芁なのかわかりたせん。



-オヌスティンマッギヌ



10進コヌド



[Company X]で働いおいたずき、[プロゞェクト]が完成しないず思いたした。 いずれかのレベルで、非衚瀺にするこずになっおいたオブゞェクトがありたした。 レベルを再゚クスポヌトしたくなかったため、チェックサムで名前を䜿甚したせんでした。 したがっお、゚ンゞンコヌドの真ん䞭に、このようなものがありたした。 そしお、このコヌドでゲヌムが完成したした。



 if( level == 10 && object == 56 ) { HideObject();
      
      





箄1幎埌、非垞にむラむラしたアヌティストが私たちの゚ンゞンを䜿甚しお私たちに近づき、オブゞェクトが10番目のレベルで衚瀺されなかった理由を尋ねたした。 本圓に、なぜですか



-匿名



すべおの兆候はノヌず蚀う



この問題は、新しいWolfenstein Raven゜フトりェアの開発時に発生したした。 Xbox 360のコントロヌラヌサポヌト蚭定を䜜成したした。Liveず統合する堎合、どのコントロヌラヌが入力むベントを送信するかを知る必芁があるこずがわかりたした。 䜿甚したDoom 3入力コヌドは、 Quake 3からほが完党にコピヌされおいたため、かなり単玔なシステムでした。



既存のむベントシステムでは、远加のパラメヌタヌが必芁な堎合に備えお、各むベントに2぀の敎数匕数ずNULLポむンタヌが枡されたした。 したがっお、タスクはコントロヌラヌIDを各入力むベントに関連付けるこずでした。 問題ないようです-コントロヌラヌIDをむベントの敎数匕数の1぀にパックするだけですよね そしおもちろん、䞡方の議論はすでに取られおいたす。



そのため、別のアむデアが生たれたした。断片化するこずなく、高速で単䞀フレヌムのメモリアロケヌタを䜿甚しおメモリを割り圓お、コントロヌラ識別子を曞き蟌み、むベントポむンタでポむンタを枡したす。



むベントシステムは、むベントを凊理した埌、freeを䜿甚しおnullむベントポむンタヌをクリアするこずが刀明したした。 もちろん、この動䜜は、マルチヒヌプアプロヌチず完党に互換性がありたせんでした。 さらに、コヌドにはむベントコヌドでfree呌び出しに䟝存しおいた叀いDoom 3コヌドフラグメントが含たれおいたため、コヌドベヌス党䜓に重芁な倉曎を加えずに呌び出しを削陀するこずはできたせんでした。 そしお、3番目の敎数パラメヌタヌを远加するずどうなりたすか 次に、数癟の関数呌び出しを倉曎する必芁がありたす。



締め切りはすでに迫っおいたため、問題を解決する時間がありたせんでした。 したがっお、私は考えられないこずに決めたした-コントロヌラヌパラメヌタヌをポむンタヌパラメヌタヌにパックしたした。 完党に「caps」ず入力された4行のコメントで、これをひどいハックずしおマヌクし、コヌドベヌスにアップロヌドしたした。 そしお、この束葉杖は、入力システム党䜓が少し優れたものに眮き換えられるたで問題なく機胜したした。



-デビッドダむナヌマン



粘着性の詐欺垫



画像



PS2の初期のプロゞェクトのストヌリヌは次のずおりです。 衝突/境界線には倚くの問題がありたしたが、通垞は最埌の最埌にキャラクタヌの衝突システムを曞き盎すこずで解決したした。 これは、「コラむダヌ」モデルに倉曎されたした。これは、指向性境界茪郭の階局ツリヌよりもはるかに優れた衝突を凊理する䞀連の球䜓ですこれらはHavok゚ンゞンが登堎する前の時代でした。



しかし、私たちは絶え間なく「バグ」を抱えおおり、それが私たちを倢䞭にさせたした。 私たちはそれを「粘着性」ず呌びたした-プレむダヌのキャラクタヌが壁の近くにあり、それに沿っお滑るたびに、コラむダヌの球は突然壁の反察偎にあるず刀断し、それを匕き裂きたせんでした぀たり、キャラクタヌが衚面にくっ぀きたした。



それは、「すべおが単玔なように思われる」ずいう、ずんでもない間違いの1぀でした。 球䜓が反察偎にあるず考えおいる理由を芋぀けお修正するだけです。 問題は、この問題が発生する前に、衝突認識のすべおのケヌスで䜕が起こるかを远跡する必芁があるこずです。



奇劙な応答を远跡するコヌド内の䟿利な条件付きコントロヌルポむント、たたはコラむダヌを混乱させる䜍眮の倉曎で問題を解決できなかった堎合、単にフレヌムレヌトを䞋げお「バグ」が発生しないようにしたした。 この問題の実際の解決策は、通垞は省くこずができる血液、汗、涙、およびその他の液䜓を必芁ずしたすが、それは別の話です。



テストのためにゲヌムを送信し、このような゚ラヌのあるゲヌムはリリヌスされないずいう応答を絶えず受け取りたした。 問題の䞍圚を保蚌するために、球䜓の境界を増やすずいう1぀の「解決策」を思い付きたしたが、これは正しい修正ずは蚀えたせん。 この「バグ」を䜿甚しおゲヌムをアヌティストチヌムにリダむレクトし、アヌティストがそれを修正し、真の深い問題を探す貎重な時間を獲埗したした。



テスタヌは、「プレむダヌは目に芋えない壁に盎面しおいるが、これはあっおはならない」などのレビュヌを私たちに送り始めたした。 この問題は同じレベルの深刻さですコラむダヌの境界を狭くし、粘着性が非垞にたれに発生し、再珟が困難だったため、キャラクタヌが壁に近づき始めたしたが、ゲヌムの残りの郚分を修正した数サむクル埌に、解決策、血、汗、涙が必芁であるこずが最終的に発芋され、ゲヌムは流通ず棚ぞの道を進み続けたした。



回避ず回避によっお問題を解決するこのサむクルを誇りに思っおいるずは蚀いたせんが、少なくずも䞀時的にこの負担を肩から取り陀くこずができたした。 私たちは垞に「ああ、いや、昚日テストのためにゲヌムを送った」ず蚀っお、いたいたしい問題を解決し続けたした。



-匿名



私ず私のパッチ



次のような叀いゞョヌクがありたす。



患者 「医垫、これが奜きなずきは痛いです。」



博士 「それではこれをしないでください。」



面癜いですが、これらの賢明な蚀葉は特定の状況ではありたせんか 3Dサヌドパヌ゜ンシュヌティングゲヌムをPCから最初のPlayStationに移怍しようずしおいたずきの痛みを想像しおください。



そもそもPS1には浮動小数点サポヌトがなかったため、コヌドを再コンパむルし、すべおの浮動小数点倀を固定小数点倀に眮き換えお移怍を行いたした。 そしお、衝突の認識に至るたで、すべおがかなりうたくいきたした。



ゲヌムのPCバヌゞョンでは、レベルのゞオメトリはうたく機胜したしたが、浮動小数点ず固定小数点の埮芖的な違いにより固定小数点倀に倉換するず、すべおの瞫い目、T字型ゞョむントなどの問題が発生したした。 この困難はそれ自䜓を感じさせたしたメむンキャラクタヌDampず名付けられたは単にこれらの小さな穎を通っおレベルの䞋の空所に萜ちたした。



Dampが倱敗しないようにゞオメトリを調敎するこずで芋぀かったすべおの穎を修正したした。 しかし、テストのためにゲヌムが出版瀟に送られたずき、圌は突然「䞖界䞭で倱敗する」ずいう倚くの゚ラヌを私たちに知らせたした。 毎日、Dampが通り抜けるこずができる穎の新しいリストがありたした。 それらを削陀し、ゞオメトリを修正し、翌日には他の堎所が12個あるこずを通知されたした。 これは数日間続いた。 出版瀟のテスト郚門は1人の埓業員を雇いたした。埓業員は1日10時間䞖界䞭を飛び回り、陥る堎所を芋぀けるこずだけでした。



問題は、ゞオメトリが悪いこずでした。 密でシヌムレスではありたせんでした。 PCには十分でしたが、固定小数点挔算が問題を倧幅に耇雑化したPS1には䞍十分でした。 理想的な解決策は、ゞオメトリを修正しおシヌムレスにするこずです。



ただし、これは時間のかかるタスクであり、限られたリ゜ヌスでは時間どおりに完了できなかったため、テスト郚門に頌っお問題領域を探したした。



この堎合の問題は、圌らが垞にそのような堎所を芋぀けたこずでした。 毎日がさらに痛みをもたらしたした。 毎日-叀い「バグ」の新しいバリ゚ヌション。 終わらないように芋えたした。



最埌に、それは私たちに思いをせたした本圓の問題は幟䜕孊の穎にありたせん。 問題は、湿気がこれらの穎に萜ちるこずです。 これを実珟しお、次のような非垞に迅速か぀簡単な修正を曞くこずができたした。



 IF (Damp   ()) THEN  
      
      





実際、コヌドはそれほど耇雑ではありたせんでしたリスト2を参照。



リスト2私ず私のパッチ



 damp_old = damp_loc; move_damp(); if (NoCollision()) { damp_loc = damp_old;
      
      





千のバグが䞀挙に修正されたした。 さお、レベルを通っお萜ちお穎を通り抜けるのではなく、Dampは単にわずかにひき぀りたした。 私たちは苊しみの原因を突き止め、「これをやる」こずをやめたした。 出版瀟はゞャンパヌテスタヌを解雇し、ゲヌムはリリヌスされたした。



぀たり、しばらくしおからリリヌスされたす。 「if A == bad then not a」アプロヌチの成功に觊発され、このツヌルを䜿甚しおさらにいく぀かのバグにパッチを圓おたした。 それらのほずんどすべおが衝突認識コヌドに関連付けられおいたした。 開発の終わりに向かっお、゚ラヌはたすたす具䜓的になり、修正は「any_this_this_actionを実行しない」ようになりたしたリスト3を参照これはゲヌムに残っおいる実際のコヌドです。



リスト3私ず私のパッチ



 if (damp_aliencoll != old_aliencoll && strcmpi("X4DOOR",damp_aliencoll->enemy->ename)==0 && StartArena == 6 && damp_loc.y<13370) { damp_loc.y = damp_old.y; //    damp'   . ( x  y) damp_loc.x = damp_old.x; damp_aliencoll = NULL; //    
      
      





このコヌドは䜕をしたすか 問題は、Dampが特定のレベルおよび特定の堎所で特定のタむプのドアに觊れたずきに発生し、根本原因を修正する代わりに、ドアに觊れたずきにDampがそこから離れお䜕も起こらなかったふりをするようにしたした。 問題は解決したした。



振り返っおみるず、このコヌドは非垞に恐ろしいものです。 圌ぱラヌを修正したしたが、修正したせんでした。 残念ながら、実際の゜リュヌションは、PS1蚈算の機胜を考慮しお、ゲヌム党䜓のゞオメトリず衝突認識システムを倉曎するこずです。 圓初から、スケゞュヌルは非垞にアグレッシブだったので、私たちには垞に終わりが近づいおいるように思えたした。 圓然のこずながら、このような状況では、問題に察する耇雑で費甚のかかる゜リュヌションよりも、クむックパッチの方が垞に有利でした。



しかし、すべおがそれほどスムヌズに行きたせんでした。 数癟のパッチが必芁でしたが、パッチ自䜓が問題の原因になり、非垞に特殊なケヌスでパッチの動䜜を倉曎するには、さらにパッチを远加する必芁がありたした。 新しい゚ラヌが発生し、再びパッチでそれらを打ち負かしたした。 結局、私は勝ちたしたが、代䟡は数か月間ゲヌムをリリヌスするのが遅れたこず、そしおこれらすべおの月の毎日の14時間の仕事でした。



この経隓により、パッチに立ち向かうこずができたした。 今では、簡単で䞀芋安党なパッチを䜿甚しおも、垞に゚ラヌの原因を突き止めようずしたす。 コヌドを健党にしたい。 あなたが医者に行き、「私がこれを奜きになるず私を傷぀けたす」ず蚀うずき、あなたは圌が痛みの原因を芋぀けおそれを治すこずを期埅したす。 痛みは、コヌド゚ラヌのように、もっず深刻な䜕かの症状になる可胜性がありたす。 道埳医垫があなたを扱うべきであるようにあなたのコヌドを扱いたす。



-ミック・りェスト



私は怒りに怒っおいたす



私はか぀おTHQ Relic Entertainmentのスタゞオ、 The Outfitで働いおいたしたが、これは最初のXbox 360ゲヌムの1぀ずしお思い出すこずができたす。PC゚ンゞンシングルスレッドから始めお、玄18か月で。 ゲヌムのリリヌスの玄3か月前、圌女は360床で玄5 FPSの速床で働いおいたした。 ゲヌムが深刻な最適化を必芁ずするこずは明らかでした。



パフォヌマンスを枬定するず、凊理速床ず「PCスタむル」のコヌドに加えお、コンテンツの問題も倚数あるこずがわかりたした。 䞀郚のモデルは詳现すぎ、シェヌダヌは高䟡すぎ、䞀郚のレベルではキャラクタヌが倚すぎたす。



プログラマが゚ンゞンのパフォヌマンスを単玔に「修正」するこずはできず、倚くの人が慣れおいる䜜業テンプレヌトを倉曎する必芁があるこずを100人のチヌムに玍埗させるこずは困難です。 圌らはゲヌムのパフォヌマンスが誰にずっおも問題であるこずを理解する必芁があり、私はこれを冗談ずしお瀺す最良の方法を思い぀きたした。



決定には玄1時間かかりたした。 仲間のプログラマヌが私の顔の写真を4枚撮りたした。私は幞せで、穏やかで、少し怒っお、髪を匕き裂きたした。 写真を画面の隅に配眮し、フレヌムレヌトに関連付けたした。 ゲヌムが30fpsを超えるずき、私は幞せでした。20歳未満のずき、私は怒っおいたした。



これらの倉曎の埌、FPS問題ぞのアプロヌチが完党に倉曎されたした。「ああ、これはプログラマヌの問題」ではなく「うヌん、このモデルを䜿甚するず、ニックは怒りたす 少し最適化する方が良いでしょう。」 人々はその倉化がフレヌムレヌトにどのように圱響するかを垞に芋おいたした。その結果、ゲヌムを30 fpsでリリヌスしたした。



-ニック・ワンダヌス



アンチヒヌロヌプログラミング



私は倧孊を卒業したばかりで、若くお玠朎でした。 私たちは、最初のプロフェッショナルプロゞェクトのベヌタ段階である90幎代埌半のPCゲヌムに移行したした。 倚くの堎合プロゞェクトでそうであるように、゚キサむティングなゞェットコヌスタヌでした。 すべおのコンテンツの準備が敎い、ゲヌムは芋栄えがよかった。 しかし、1぀の問題が芋぀かりたした。䜿甚可胜なメモリの量に収たらないずいうこずです。



ほずんどのメモリはモデルずテクスチャで占められおいたため、アヌティストず私は、圌らが占有するボリュヌムをできるだけ枛らすようにしたした。 画像を瞮小し、モデルを単玔化し、テクスチャを絞りたした。 時々アヌティストは私たちを助け、時には圌らは党力で抵抗したした。



メガバむト単䜍でメガバむトを削枛し、数日間の非垞識なストレスの埌、私たちはすでに䜕もするこずが䞍可胜になっおいたす。 重芁なコンテンツの䞀郚を削枛したしたが、メモリを解攟するこずはできたせんでした。 䜿い果たされ、珟圚䜿甚されおいるメモリ量を枬定したした。 最倧蚱容量より1.5メガバむト倚かった



この時点で、「叀き良き時代」の長幎の開発経隓を生き延びた、私たちのチヌムの最も経隓豊富なプログラマヌの䞀人は、問題を自分たちの手に委ねるこずに決めたした。 圌は私を圌のオフィスに呌び、私たちは仕事を始めたした。私は最初に、私の蚘憶を解攟するためのもう䞀぀の消耗マラ゜ンずしお発衚したした。



代わりに、圌は゜ヌスファむルを開き、次の行を衚瀺したした。



 static char buffer[1024*1024*2];
      
      





「芋お」圌は私に尋ねた。 そしお、圌はワンクリックでそれを削陀したした。 できた



圌は恐らく私の目に恐怖を感じたので、開発の初期にこれらの2メガバむトのメモリを割り圓おたず説明したした。 圌は自身の経隓から、必芁なメモリ量を維持するこずはほずんど䞍可胜であり、このために倚くのプロゞェクトが倱敗するこずを知っおいたした。 したがっお、必芁に応じお垞に適切なメモリブロックを割り圓おお解攟したす。



圌はオフィスを出お、必芁なメモリ量を枛らしたず発衚し、誰もがプロゞェクトのヒヌロヌずしお圌を称えたした。



そのような「野barな」アプロヌチで圓時どんなにショックを受けたずしおも、今では完党にサポヌトしおいるこずを認めなければなりたせん。 これたでのずころ、私はそれを䜿甚できるような考え方に達しおいたせんが、困難な状況にあるずき、「雚の日のために」少しの蚘憶を持぀こずは決しお無駄ではないこずがわかりたす。 時間ず経隓が私たちの芋解をどのように倉えるかは興味深いです。



-ノ゚ル・ロピス



All Articles