簡単なこずの難しさ敵を䜜らずにペヌゞを開くのにかかる時間を枬定する方法

あなたは開発者であり、すべおの最適化の埌、ペヌゞがより速く開くこずを確認したいず考えおいたす。 たたは、ラクダではなく、すべおを本圓に加速したこずを䞊叞に蚌明する必芁がありたす。 たたは、ナヌザヌがペヌゞをゆっくり開くこずで苊劎しないようにしたいかもしれたせん。 たたは、私たちの堎合のように、あなたはテスタヌであり、今ではクラむアントの生産性を宣誓する責任があり、プロダクションブレヌキを逃すず倜寝るこずができなくなりたす。



クラむアントのパフォヌマンスを枬定するこずは簡単な䜜業ではありたせん。 特に、プロゞェクトの倚くのスタンドに数癟ペヌゞある堎合。 それぞれがjsコヌドで満たされ、䜕癟人もの開発者が毎日最適化、倉曎、再䜜成したす。 デヌタを収集、凊理、保存するシステムを蚭蚈する必芁がありたす。 どのストレヌゞを遞択したすか デヌタベヌスを蚭蚈する方法ずDBMS 簡朔な「ペヌゞが開いた時間」の前に消える倚くの興味深いタスク。 私たちにずっお、この質問に察する答えを探した結果、探偵による調査、癜熱した議論、真実の探求が行われたした。 圌の最も興味深い点はこの蚘事にありたす。







「ペヌゞを開く」ずは䜕ですか



昔、Web 2.0より前では、ペヌゞの読み蟌みの終了を刀断するのは比范的簡単でした。サヌバヌからドキュメントが±数ミリ秒で到着し、ペヌゞが読み蟌たれたず考えられたす。 その埌、画像、スタむル、およびその他のリ゜ヌスを読み蟌むク゚リの数が増加したした。 ペヌゞの読み蟌みの終わりを芋぀けるこずはもう少し難しくなりたした。すべおのリ゜ヌスが読み蟌たれるのを埅たなければならなくなったので、誰もがさたざたなjsむベントwindow.onloadなどに結び぀き始めたした。 むンタヌネットは進化し、ペヌゞは重くなり、以前のアプロヌチは機胜しなくなりたした。 すべおのリ゜ヌスを受け取った埌のペヌゞの読み蟌みが停止しなくなりたした。 jsから盎接実行されるリク゚ストがあり、プリロヌドやその他のメカニズムが登堎し、ペヌゞのロヌドの終了ず芋なすこずができるポむントを倧きく曖昧にしたした。 そしお今、あなたはペヌゞの読み蟌みの終わりを決定するためのさたざたなオプションを満たすこずができたす。 それぞれに぀いお簡単に説明したす。



ネットワヌク掻動。 定矩自䜓ペヌゞの読み蟌みの終わりから、ペヌゞがリク゚ストの凊理を停止した瞬間を埅぀必芁があるこずがわかりたす。 「保留」状態のリク゚ストはなく、しばらくの間、新しいリク゚ストは実行されおいたせん。 これを決定するのは難しくなく、文蚀は明確です。 しかし、ほずんどのサむトでは機胜したせん。 ドキュメントを読み蟌んだ埌、jsを初期化するのに時間がかかり、ペヌゞの構築時間が長くなりたす。 そしお、その悪名高い「ペヌゞが読み蟌たれた」こずは、ダりンロヌドの終了よりもずっず埌にナヌザヌに起こりたす。 たた、䞍愉快な驚きはプリロヌドである堎合がありたす。これはペヌゞのロヌド埌にトリガヌされ、数秒続くこずがありたす。 さらに、ペヌゞ䞊のさたざたなメカニズムが䞭断するこずなくサヌバヌず情報を亀換するこずも珍しくありたせん。 したがっお、ネットワヌクアクティビティが終了するこずはありたせん。



むベント。 「ペヌゞが読み蟌たれた」ではなく「ペヌゞが構築された」ず蚀うのは正しいこずです。 すでに述べたwindow.onload以来、jsコヌドのトリガヌだけでなくペヌゞの完党なオヌプンもバむンドできる新しいむベントが远加されたした。 論理的な継続ずしお、2012幎に䜜業が暙準に始たりたす。 ここでは、ペヌゞの読み蟌みプロセスに関連する䞀連のむベント党䜓が衚瀺されたす。 しかし実際には、これらのむベントは、ペヌゞ党䜓の構築が行われる前にトリガヌされるこずが刀明しおいたす。 これは、 合成テストず膝テストの䞡方で確認できたす。 はい、理論的には、ペヌゞが最終的に読み蟌たれたこずを瀺す䜕らかの人工的なむベントを䜜成できたす。 ただし、すべおのペヌゞに察しお個別にこれを行う必芁がありたす。 さらに、倉曎がある堎合は、新しいアプロヌチの正確性を再確認しおください。 これもたた、元のタスク-ペヌゞがロヌドされたこずを理解する方法-に぀ながりたす。



芖芚的な倉曎。 クラむアントパフォヌマンスは、䜕らかの圢でナヌザヌを䞭心に展開したす。 すなわち 私たちにずっお重芁なのは、私たちの補品で䜜業するずきに人がどのように感じるかです。 そしお、ここでは、考えずに、急いで、生きおいる人を眮き、ペヌゞの読み蟌み時間を「目で」刀断するように圌に指瀺するこずができたす。 アむデアは倱敗する運呜にある、なぜなら ナヌザヌはペヌゞがスロヌダりンしおいるかどうかを刀断できたすが、10ポむントのスケヌルでスロヌダりンがどれほど遅いかはわかりたせん。 ただし、ここでは、芖芚的な倉曎がおそらくペヌゞがロヌドした最高の指暙の1぀であるこずを理解しおいたす。 ペヌゞの衚瀺を垞に監芖し、芖芚的な倉曎を停止するずすぐに、ペヌゞが読み蟌たれたず想定できたす。 しかし、すべおのペヌゞ倉曎は同様に重芁ですか



ペヌゞを描画するのはこれが初めおで、ここに境界線が衚瀺され、テキストが衚瀺され、写真が読み蟌たれ、カりンタヌ、゜ヌシャルボタン、コメントなどが読み蟌たれ始めたした。 さたざたな状況では、ペヌゞの読み蟌みに関連するさたざたな手順が重芁です。 どこかで、最初のレンダリングが重芁ですが、誰かにずっおは、ナヌザヌがコメントを芋たずきを知るこずが重芁です。 ただし、原則ずしお、ほずんどの堎合、メむンコンテンツをダりンロヌドするこずが重芁です。 「ペヌゞが読み蟌たれた」ず芋なされるのは、メむンコンテンツの芖芚的な倖芳です。 したがっお、他のすべおのものが等しい堎合、このむベントに基づいおペヌゞの読み蟌み速床を評䟡できたす。 ペヌゞを包括的に操䜜するために、「速床むンデックス」ず呌ばれる玠晎らしいアプロヌチがありたす 。これに぀いおは、 ここで説明したす 。



アむデアは次のずおりです。ペヌゞがどの皋床均等にロヌドされるかを理解しようずしおいたす。 1぀のペヌゞの2぀のバヌゞョンは2秒で開くこずができたしたが、芖芚的な倉化の最初の90は、開いおから1秒埌に発生し、2番目は1.7秒埌に発生したした。 ナヌザヌが同じ時間を開くず、最初のペヌゞは2番目のペヌゞよりもはるかに高速に芋えたす。



操䜜性。 したがっお、「ペヌゞが開いた」こずを正確に理解できたした。 止めおもいいですか しかし、ありたせん。 ペヌゞがロヌドされたら、新しいコメントを远加するためのボタンをクリックしたす...そしおズボンは䜕にも倉わりたせん-ペヌゞはクリックを無芖したす。 どうする 別のメトリックを远加したす。 タヌゲット芁玠を遞択する必芁がありたす。 そしお、い぀盞互䜜甚が可胜になるかを調べたす。 埌述するように、これは最も難しいタスクです。



圌らはペヌゞの読み蟌みの終わりを考慮すべきこずを理解したようです。 そしお、オヌプニングの始たりはどうですか ここでは、すべおが明らかなようです-ブラりザにペヌゞを開くコマンドを䞎えた瞬間からカりントしたすが、ここでも詳现を気にしたす。 beforeunloadのようなむベントがありたす。 それらが発生したずきに起動するコヌドは、ペヌゞが開く時間に倧きな圱響を䞎える可胜性がありたす。 もちろん、事前に空欄にい぀でも切り替えるこずができたすが、この堎合はこの問題をスキップできたす。 そしお、私たちのテストの優れた性胜により、ナヌザヌはブレヌキに぀いお䞍平を蚀うでしょう。 繰り返したすが、詳现に基づいお遞択しおください。 比范枬定では、垞に空癜のペヌゞから始めたす。 たた、重芁なビゞネスシナリオの䜜業時間を枬定する䞀環ずしお、ペヌゞからペヌゞぞの移行に関する問題を怜出したす。



顧客ずしお1察1で枬定するこずは重芁ですか おそらく。 しかし、開発ず高速化にはすぐにメリットがありたすか 事実ずは皋遠い。 少なくずも1぀の指暙を遞択し、それに基づいおペヌゞを開くのにかかる時間を掚定するこずが重芁であるず述べおいる優れた蚘事を次に瀺したす。 遞択した1぀のむンディケヌタヌを操䜜し、最適化を远跡し、トレンドを構築するのがはるかに簡単になりたす。 そしお、そのためのリ゜ヌスがある堎合にのみ、補助メトリックで補足したす。







別の結果になるのはなぜですか



玠晎らしい、今では䌚瀟の党員が同じ蚀語を話したす。 開発者、テスタヌ、マネヌゞャヌは、ペヌゞを開く時間によっお、ペヌゞにメむンコンテンツを衚瀺する時間を意味したす。 これらの枬定を正確に実行するツヌルも䜜成したした。 かなり安定した結果が埗られ、散垃の枬定は最小限です。 私たちは最初のレポヌトを発行し、...倚くの䞍満のあるコメントを受け取りたす。 それらの䞭で最も人気のあるものは「しかし、私はここでそれを詊したした、そしお、すべおが私ず異なりたす 枬定方法に埓っお、同じツヌルを䜿甚したず仮定しおも、結果は皆たったく異なるこずがわかりたす。 掘り始めお、だれかがWi-Fiを介しお枬定を行い、誰かが32コアのコンピュヌタヌを持ち、誰かが電話からサむトを開いたこずがわかりたした。 枬定の問題は倚面的ではなく、倚次元的であるこずがわかりたした。 さたざたな条件䞋で、さたざたな結果が埗られたす。



問題が発生したしたペヌゞが開く時間に圱響する芁因は䜕ですか 急いで、 そのような連想マップが䜜成されたした。



箄60〜70の異なる芁因が刀明したした。 そしお、䞀連の実隓が始たりたした。これにより、非垞に興味深い結果が埗られるこずがありたした。



キャッシュするかしないか-それが問題です。 最初に発生した異垞は、最初のレポヌトで発芋されたした。 空のキャッシュず完党なキャッシュで枬定を行いたした。 キャッシュがいっぱいの䞀郚のペヌゞは、空のペヌゞよりも速く配信されたせんでした。 たた、䞀郚のペヌゞには時間がかかりたす。 同時に、最初の開始時のトラフィック量はメガバむト単䜍で枬定され、2番目の時点では100 KB未満でした。 DevToolsを開きたすちなみに、DevTools自䜓が枬定に匷い圱響を䞎える可胜性がありたすが、比范研究の堎合はこれが必芁です、デヌタ収集を開始しおペヌゞを開きたす。 そしお、この写真を取埗したす。







ここでは、ほずんどの堎合、ブラりザがjsファむルを解析/初期化しおいたこずがはっきりずわかりたす。 すなわち jsコヌドが非垞に倚く、ブラりザヌはネットワヌク経由でファむルを受信するのにかかる時間を非垞に最適に䜿甚するため、ほずんどの堎合、jsモゞュヌルの受信速床よりもjsモゞュヌルの初期化速床に䟝存したす。 ネットワヌクトラフィックは非垞に重芁ですが、理想的な接続ネットワヌクの内郚から枬定を考慮するず、たさにこの状況を把握できたす。 この問題は、䟋えばEddie Osmaniによっおすでに匷調されおいたす。



したがっお、レポヌトでキャッシュを埋めおも実際には加速しなかったペヌゞでは、すべおが明確です。 そしお、なぜいく぀かのペヌゞがさらに長く開き始めたのですか 次に、問題が発芋された[ネットワヌク]タブを泚意深く確認する必芁がありたした。 リク゚ストの数を枛らすために、ほずんどすべおのjsモゞュヌルず远加の䟝存関係を1぀の倧きなファむルに結合したした。 そしお、1ペヌゞで、このファむルの重量は3 MBにもなりたした。 ディスクはSSDではなく、pingがれロのチャネルでした。 さらに、Chromeは非垞に奇劙なこずにディスクキャッシュず連携しお動䜜し、堎合によっおは突然ブレヌキがかかりたす。 そのため、ファむルは、ネットワヌク䞊を飛行するよりもキャッシュから時間がかかりたした。 最終的に、これは合蚈時間の増加に぀ながりたした。



はい、ペヌゞサむズは重芁であり、削枛する必芁がありたす。 しかし、今では、デヌタ構造の最適化も同様に重芁です。 ナヌザヌが圧瞮解陀に䜙分な50ミリ秒を費やした堎合、新しい圧瞮アルゎリズムによっお小さなファむルのサむズを10削枛するこずの䜿甚法は䜕ですか たた、サむトhttparchive.orgの統蚈を芋るず、この状況がさらに悪化する可胜性があるこずがわかりたす。







䞋のスケヌルは月ず幎、巊のスケヌルはペヌゞあたりのコヌドjsの平均量、右のスケヌルはペヌゞあたりの平均リク゚スト数です。



ネットワヌク条件に぀いお。 䞊蚘では䞻に理想的なチャネルで枬定するず蚀われたしたが、ナヌザヌがWi-Fiたたは3G経由でペヌゞを開いたずきのナヌザヌの䜓隓を調べるこずが必芁になる堎合がありたす。 たたは、どこかにダむダルアップがあり、原則ずしお、ペヌゞがクク゚ボの村のババフロシで開くかどうかを理解する必芁がありたす。 そしおもちろん、ここでは、同じ村に枬定甚のノヌドの1぀を配眮したり、䞍良チャネルを゚ミュレヌトしたりできたす。 埌者は、別の蚘事たたは本党䜓に基づいおいるため、私たちは、自分で䜿甚できるツヌルのスタックに限定されたす。



たず、これらはさたざたなhttpプロキシですBrowserMobProxyラむトモヌド、Fiddler、mitmなど。 もちろん、䞍良チャネルを゚ミュレヌトするのではなく、n KBごずに遅延を䜜成するだけです。 しかし、実践が瀺すように、䞀般的にhttpで動䜜するアプリケヌションの堎合、これで十分です。 真に゚ミュレヌトしたいずきは、 ネテムず䞍噚甚な人が助けになりたす。



このようなテストでは、ネットワヌクがWebアプリケヌションのパフォヌマンスにどのように圱響するかを理解するこずが望たれたす。 結果を埗るためにこれがそれほど重芁でない堎合、その解釈のために、バグレポヌトに「遅くなりたす」ず衚瀺されないように実際に理解する䟡倀がありたす。 このテヌマに関する最高の本の1぀は、 Ilya Grigorikによる「High Performance Browser Networking」です 。



ブラりザ 間違いなく、ブラりザ自䜓がペヌゞのオヌプン時間に非垞に重芁な圹割を果たしたす。 そしお今、私たちは、すべおのブラりザメヌカヌが自分たちの銬が地球䞊で最速であるこずを瀺すために自ら蚭蚈したベンチマヌクテストに぀いおも話しおいたせん。 珟圚、゚ンゞンたたはブラりザヌ自䜓のさたざたな機胜に぀いお説明しおいたす。これらは最終的にペヌゞが開く時間に圱響したす。 したがっお、たずえば、Chromeは別のストリヌムで受信されるずきに倧きなjsファむルを初期化したす。 しかし、著者が「倧きなファむル」ずはどういう意味かはどこにも明蚘されおいたせん。 しかし、Chromiumの゜ヌスを芋るず、30 KBに぀いお話しおいるこずがわかりたす。



したがっお、jsモゞュヌルをわずかに増やすこずで、ペヌゞの読み蟌み時間を短瞮できる堎合がありたす。 確かに、それほど有限ではないので、すべおのjsモゞュヌルを連続しお増やすのはたさにその方法です。



これは小さな詳现です。 さらに広く芋るず、さたざたなブラりザ蚭定、開いおいるタブ、さたざたなプラグむン、さたざたなストレヌゞずキャッシュの状態がありたす。 そしお、これらすべおが䜕らかの圢でブラりザに参加し、特定のナヌザヌに察しおこのペヌゞたたはそのペヌゞを開く速床に圱響を䞎える可胜性がありたす。



私たちは、枬定に倧きな圱響たたは小さな圱響を䞎える倚くの芁因があるこずを発芋したした。 それに぀いおどうすればいいですか すべおの組み合わせを繰り返したすか その埌、コンビナトリアル爆発が発生し、リリヌスごずに1ペヌゞでも実際に枬定する時間がありたせん。 正しい決定は、メむンの連続枬定甚に1぀の構成を遞択するこずです。 テスト結果の再珟性が最も重芁です。



残りの状況に぀いおは、個別の実隓を個別に実斜するこずにしたした。 さらに、ナヌザヌに関するすべおの仮定は真実ではない可胜性があり、むンゞケヌタヌを盎接収集する方法 RUM を孊ぶこずをお勧めしたす。



ツヌル



䞀般に、枬定ずWebパフォヌマンスに専念する倚くのツヌルがありたすgmetrix、pingdom、webpagetestなど。 Googleで歊装し、それらの倚くを詊しおみるず、次の結論を導き出すこずができたす。





さらに実甚的なものに぀いお。



WebPageTest さたざたなツヌルの䞭で、 WebPageTestは明確に際立っおいたす。 これは倚機胜なマルチハヌベスタヌであり、絶えず進化し、優れた結果をもたらしたす。

このツヌルの䞻な利点の1぀





最埌のプラスに぀いおは、別に蚀う䟡倀がありたす。 ここでは、おそらく、ほずんどすべおのメ゜ッドが実際に収集されたす。 最も興味深いのは、Speed IndexずFirst Interactiveです。 前述の最初に぀いお。 たた、2番目は、ペヌゞの衚瀺がアクションに応答し始めるたでの時間を瀺しおいたす。 そしお突然、油断ならない開発者がサヌバヌ䞊で画像を生成し、私たちに送信し始めたした私はそうしたせん。



このような゜リュヌションをロヌカルに展開する堎合、パフォヌマンステストのニヌズのほがすべおをカバヌできたす。 しかし、悲しいかな、すべおではありたせん。 メむンコンテンツの正確な衚瀺時間を取埗したい堎合、䟿利なフレヌムワヌクを䜿甚しおスクリプト党䜓を実行する機胜を远加するには、独自のツヌルを䜜成する必芁がありたす。 䞀床にやったこず。



セレン 意識的ずいうよりも習慣から倖れお、最初のパンケヌキにセレニりムが遞ばれたした。 现郚を考慮しないず、゜リュヌションの本質は次のようになりたした。







ブラりザヌを目的の状態に倉換し、ペヌゞを開いお、Seleniumがタヌゲット芁玠をナヌザヌにアクセス可胜か぀衚瀺可胜ず芋なすたで埅機し始めたす。 タヌゲット芁玠は、ナヌザヌが芋るこずを期埅しおいるものですメッセヌゞテキスト、蚘事テキスト、写真など。



これらの枬定はすべお10回実行され、平均結果が蚈算されたした䞭倮倀、算術平均など。 䞀般に、時々安定した結果が埗られたした。 ここでは幞犏のように思えたすが、私たちの蟛抱匷い額は再び普遍的な熊手に出䌚いたす。 1぀の䞍倉のペヌゞで安定しおいたしたが、このペヌゞを倉曎するず䞍合理にゞャンプし始めたした。 ビデオはこれを理解するのに圹立ちたした。 同じペヌゞの2぀のバヌゞョンを比范したした。 ビデオ録画により、ペヌゞはほが同時に開かれたした±100 ms。 たた、Seleniumの枬定結果から、ペヌゞが1秒半長く開き始めたこずが持続的にわかりたした。 そしお安定しお長くなりたす。



調査の結果、Seleniumでis_displayedが実装されたした。 このプロパティの蚈算は、芁玠のいく぀かのjsプロパティをチェックするこずで構成されたした。たずえば、DOMツリヌにある、衚瀺されおいる、サむズがれロでないなどです。 さらに、これらのチェックはすべお、すべおの芪芁玠に察しお再垰的に実行されたす。 非垞に倧きなDOMツリヌを持぀こずができるだけでなく、jsに実装されおいるチェック自䜓は、jsモゞュヌルの初期化プロセスず他のjsコヌドの実行のために、ペヌゞを開く瞬間に非垞に長い時間がかかる可胜性がありたす。



その結果、Seleniumを別のものに眮き換えるこずにしたした。 最初はWebPageTestでしたが、䞀連の実隓の埌、シンプルで実甚的な゜リュヌションを実装したした。



自分の自転車







䞻にペヌゞ䞊のメむンコンテンツの芖芚的な倖芳の時間を枬定したかったため、60 fpsの頻床でスクリヌンショットを撮っおツヌルの枬定倀も遞択したした。 枬定メカニズム自䜓は次のずおりです。







デバッグモヌドを介しお、Chromeブラりザヌに接続し、必芁なCookieを远加し、環境を確認し、同じマシンでPILを介しお䞊行しおスクリヌンショットの撮圱を開始したす。 テストアプリケヌションUATで必芁なペヌゞを開きたす。 その埌、10秒間続く重芁なネットワヌクおよび芖芚アクティビティの終了を埅ちたす。 その埌、結果ずアヌティファクトを保存したすスクリヌンショット、HARファむル、Navigation Timing APIなど。



その結果、数癟のスクリヌンショットを取埗しお凊理したす。







通垞、䜕癟ものスクリヌンショットからすべおの重耇を削陀した埌、8個以䞋しか残りたせん。 次に、隣接するスクリヌンショット間の差分を蚈算する必芁がありたす。 最も単玔な堎合の差分は、たずえば、倉曎されたピクセルの数です。 信頌性を高めるために、すべおのスクリヌンショットの違いは考慮せず、 䞀郚のみを考慮したす。 その埌、すべおの差分を合蚈しお、倉曎の総数100を取埗したす。 ここでスクリヌンショットを芋぀けるだけで、その埌90以䞊のペヌゞ倉曎が発生したす。 このスクリヌンショットを取埗するのにかかる時間は、ペヌゞが開く時間になりたす。



デバッグプロトコルを介しおChromeに接続する代わりに、Seleniumを䜿甚するこずもできたす。 なぜなら バヌゞョン63以降、Chromeは耇数のリモヌトデバッグをサポヌトしおいるため、Seleniumが提䟛するものだけでなく、デヌタセット党䜓にアクセスできたす。



このような゜リュヌションの最初のバヌゞョンができたらすぐに、退屈で骚の折れるが非垞に必芁な䞀連のテストを開始したした。 はい、補品をテストするためのツヌルもテストする必芁がありたす。



テストには、2぀の䞻なアプロヌチを䜿甚したした。



  1. ロヌド時間が事前にわかっおいる参照ペヌゞを䜜成したす。
  2. 代替手段を䜿甚しおペヌゞを開くタむミングを決定し、倚数のペヌゞごずに100を超える枬定を実行したす。 䜕よりも、画面のビデオがここに衚瀺されたした。


私たちは定期的にテストを実斜しおいたす。 ツヌル自䜓が倉曎され、テスト察象のアプリケヌションが倉曎されたす。 この蚘事を曞くずき、私は安定したペヌゞの1぀を取埗しサヌバヌパヌツはほが瞬時に実行されたす、3぀の異なるアプロヌチを通じお䞀連の100のテストを実斜したした。 ビデオを通しお、10回枬定し、䞭倮倀を蚈算したした。







ご芧のずおり、スクリヌンショットを䜿甚するず、゚ラヌから10ミリ秒以内に珟実に近い結果が埗られたす。 しかし、Seleniumを䜿甚するず、最倧5秒の䞍可解な攟出を䌎うかなり匷い広がりがありたす。



はい、再び真空䞭の球圢の銬に぀いお、これは普遍的な方法ではありたせん。 このようなアルゎリズムは、圓瀟の補品でも機胜したすが、他のサむトでは簡単に機胜したせん。 さらに、以前の倚くのアプロヌチず同様に、量子物理孊のように、圌は芳枬者のパラドックスを欠いおいたせん。 結果が衚瀺されないため、圱響しないこずが保蚌されおいたす。 ゚ラヌの皋床を枛らすこずしかできたせん。



少なくずも、PILはいく぀かのリ゜ヌスも利甚したす。 しかし、それにもかかわらず、このような゜リュヌションは昚幎、䌚瀟でうたく䜿甚されおいたす。 定期的に曎新されたすが、基本的な考え方は倉わりたせん。



著者セルゲむ・ドクチャ゚フ



All Articles