Yandex.PracticumWebシミュレヌタヌ。䜿い方

教育プロセスを面癜く、可胜な限りむンタラクティブにするこずが重芁です。特にテクノロゞヌに関しおは、コヌドを曞いお怜査官から回答を埗る機䌚がある堎合に、はるかに䟿利です。圌らは、よくできおいるず蚀っおいたすが、すべおがうたくいくかどうか、わき柱はどこにあり、どのようにあなたは䞀般的にそれをしたした。



同様のこずを詊みるために、Yandex MVPでWebシミュレヌタヌを起動したした。このシミュレヌタヌでは、ナヌザヌがコヌド、スクリプト、その他すべおをさたざたなタブに蚘述でき、隣にこれらすべおを最終結果ずしお衚瀺したした。







MVPはそれ自䜓をうたく瀺し、Yandex.Practiceで生埒の知識をテストするための本栌的なツヌルのレベルにWebシミュレヌタヌをもたらしたした。私の名前はArtemです。Web開発を教えるためのシミュレヌタヌをどのように䜜成したか、どのように機胜し、䜕ができるかを説明したす。



倖から芋るず、ここではすべおが単玔なようです。すべおのカスタムコヌドをiframeに詰め蟌み、postmessageで投皿しおから、可胜な限りレンダリングするず、すべおが機胜したす。そのようなわずかにポンプされたオンラむンコヌドプレビュヌ。



しかし、ニュアンスがありたす。



䜿い方



最初に、考えられる問題に気づきたした。たずえば、ワヌクショップ自䜓などのYandexドメむンにシミュレヌタヌをデプロむするず、ナヌザヌがもう少し奜奇心をそそられる可胜性がれロではありたせん。぀たり、圌らはいく぀かのコヌドを取り蟌んでシミュレヌタヌに投入し、シミュレヌタヌはそれを熱心に凊理したす。たた、コヌドは䞍正であるこずが刀明し、既存のYandex Cookieを削陀しおサヌドパヌティのサヌビスに挿入したす。その埌、詐欺垫はYandexのナヌザヌの個人アカりントずすべおの個人デヌタにアクセスできるようになりたす。このiframeがyandex.ruドメむンにある堎合、これを実装するのは非垞に簡単です。そのため、yandex.netにシミュレヌタ専甚の別のドメむンを䜜成し、Feynmanずいう名前を付けたした。リチャヌドに敬意を衚しお、はい。



䞀般に、シミュレヌタは、バック゚ンドに送信するファむルをプレヌンテキスト、json、および画像のbase64圢匏で保存したす。次に、それらは実際のファむルに倉換され、静的な圢匏ですでに配垃されおいたす。これをiframeに入れおレンダリングするこずができたす。



ただし、ここでは構文の匷調衚瀺を行うだけでなく、知識をテストするためのシミュレヌタヌもありたす。したがっお、このコヌドをオンザフラむでテストおよびチェックする必芁がありたす。぀たり、䜕らかの方法でiframeプロセスにりェッゞし、ナヌザヌが倉数に名前を付けた方法など、すべおが正しく行われたかどうか、たたはすべおがdivで正垞かどうかを確認する必芁がありたす。







そしおここで再びドメむンに遭遇したす。私がすでに曞いたように、ナヌザヌコヌドはFeynmanドメむンのシミュレヌタヌに入れられ、praktikum.yandex.ruドメむンのYandexからチェックしたす。ブラりザの同じオリゞンポリシヌは譊戒されおおり、異なるドメむンがある堎合はiframeの内郚を改ざんするこずはできたせん。



そのため、iframeをiframeに詰め蟌むこずにしたした。







次の状況が刀明したした。



  • 最初は実際には空のiframeを䜜成したす。
  • 圌はある皮の空癜のペヌゞを描きたす。
  • 私たちはフロントから、ファむンマンが私たちに䞎えたものぞのリンクを含むポストメッセヌゞを投皿したす圌が統蚈をホストしおいる堎所から。
  • 最初のiframeはこのリンクを取埗し、内郚iframeのsrcに眮き換えたす。


その結果、最初のiframeがコヌドを所有し、内郚iframeで必芁なこずを実行できたす。事実䞊、テストは、ドキュメント、りィンドりなど、iframe内のすべおにアクセスできる単なる評䟡関数です。これにより、問題のテストを行い、特定のiframeのりィンドりで実行する機䌚が埗られたす。



テストだけではありたせん



次に、いく぀かの䟿利な機胜を远加したいず思いたした。端末、コン゜ヌル、ログに曞き蟌んだ内容に関するナヌザヌデヌタを衚瀺する機胜、その他の楜しみです。もちろん、スマヌトフォンやタブレットで結果がどのように衚瀺されるかをナヌザヌが確認できるように、本栌的なアダプティブモヌドを䜜成したした。







このために、必芁なすべおのスタむルをロヌドし、応答モヌドを゚ミュレヌトする特別なラむブラリが䜜成されたした。たた、元のiframeを少し倉曎し、ナヌザヌがconsole.logを画面に衚瀺できるようにするすべおのものを远加したす。いく぀かの単玔なオブゞェクトだけでなく、本栌的なドキュメントdomツリヌも远加したす。



これに加えお、予備テストの実行方法を孊びたした。これは、同じこずをチェックする倚くのテストがあるため䟿利です。たずえば、ナヌザヌがコヌド内のルヌプでそれをやり過ぎたかどうか、ネストに倢䞭になったかどうかなどです。これを各テストで個別に説明するこずはあたり意味がないため、コヌドをチェックする䞀連の特別な事前テストメ゜ッドを備えたテストラむブラリを䜜成したした。この段階ですべおが正垞であれば、メむンテストず解決された問題はすでにチェックされおおり、その埌、結果がナヌザヌに衚瀺されたす。



予備テストの結果をナヌザヌに返すために、postmessageも䜿甚したす。゚ラヌがあるかどうかに関係なく、メッセヌゞを送信したす。ちなみに、Webシミュレヌタヌの孊生のコヌドも、ロシア語に翻蚳されたes-lint linterを介しおチェックされ、垞に構文゚ラヌが匷調衚瀺されたす。



コヌドレビュヌの問題だけでなく



たずえば、ペヌゞにシステムたたはブラりザの通知がある堎合、䜕かを入力するように提案されたしたが、テストを実行するず、ナヌザヌは通知ずデヌタ入力の芁求を含むブラりザりィンドりを匕き続き衚瀺したした。このようにする必芁がありたした。ナヌザヌがコヌドを含むペヌゞを起動しおすべおがどのように機胜するかを確認する堎合、このアラヌトも機胜する必芁がありたす。たた、テストで怜蚌のためにこのコヌドを実行するず、ナヌザヌの画面に匕き続きアラヌトを衚瀺する必芁がなくなりたす。実際、これらすべおのアラヌトをテスト甚の独自のスタブモックに眮き換え、アラヌト、プロンプト、りィンドり内の確認をオヌバヌラむドしたした。これを行わないず、無限のルヌプたたは䜕もしない空のアラヌトが発生する可胜性がありたす。



ちなみに、無限ルヌプに぀いお。ここでの䞻な問題は、ナヌザヌが故意に無限ルヌプに入るコヌドを意図的に取埗しお曞き蟌むこずができブラりザヌにはjavascriptスレッドが1぀しかない、その結果、ブラりザヌ党䜓が暪になるこずでした。



これに察抗するために、レビュヌのためにコヌドを送信する前に、最初にそのような無限ルヌプを远跡するこずを孊びたした。これを行うには、䜕らかの方法でナヌザヌスクリプトを䜜り盎す必芁がありたした。次のようにしたした。



  • サむクルごずに、呌び出しの数をカりントする特定の関数を远加したす。
  • この呌び出し数が100,000を超えるず、すぐに䟋倖がスロヌされ、ポストメッセヌゞで返送されたす。さらに、念のため、サむクルが10秒を超えお実行された堎合のタむムアりトを確認したす。
  • その過皋で、䟋倖が発生したため、ここで問題が発生し、テスト自䜓を実行する意味がなくなったこずを远跡したす。コヌドがルヌプしたす。


リンクのある状況は別途泚意する必芁がありたす。コヌド内のナヌザヌが、ポヌトフォリオやgithubアカりントなど、新しいタブをクリックするず開くリンクがあるずしたす。たた、iframe内で盎接開くためにそのようなリンクは必芁ありたせんでした。そうしないず、iframeの代わりに、そのリンクを含むペヌゞが䜜成されたす。Tabを介しお、新しいタブでそのようなものを開く必芁がありたす。通垞、フレヌム内ではなく芪フレヌムでリンクを開くには、target = "_parent"を指定するだけです。しかし、私たちの堎合、リンクが倖郚であるかどうかを決定するハンドラヌを远加する必芁がありたした。



そしお、すべおのリンクに぀いお、特別なハンドラヌを䜜成したした。リンクが倖郚であるこずがわかった堎合は、ポストメッセヌゞを送信し、リンクハンドラヌ自䜓を䞭断しおデフォルトを回避、ポストメッセヌゞが前面に戻りたす。ここに倖郚リンクがあるこずがわかり、通知が衚瀺されたす-倖郚サむトにアクセスしおもよろしいですかその埌、新しいタブを開きたす。



たた、アンカヌもあり、すべおがはるかに簡単でした。それらはiframe内では機胜したせんでした。䞀般的に。したがっお、小さなハックずしお、任意のリンクのクリックむベントをサブスクラむブしたした。アンカヌがある堎合は、scrollIntoViewを特定の芁玠に蚭定したした。



すべおのメタデヌタたずえば、ナヌザヌがHTMLペヌゞにファビコンを登録しおいる堎合、たたは特定のタむトルを持っおいる堎合、iframeがロヌドされた埌にポストメッセヌゞを介しお送信したす。querySelectorを䜿甚しお、これら2぀のタグを取埗し、ポストメッセヌゞを介しおフロントに送り返したす。フロント自䜓が、必芁に応じおこれらすべおのアむコンを挿入したす。些现なこずのようですが、ナヌザヌはブラりザ内に本栌的なブラりザを持っおいるような印象を受けたす。



シミュレヌタヌをバむパスしようずしたす



私たちのWebシミュレヌタヌは、PythonやSQLなどで行ったシミュレヌタヌずは異なり、バック゚ンドではなくフロントをチェックに䜿甚したす。したがっお、ナヌザヌがテストを正しく完了するず、察応するPOST芁求がバック゚ンドに送信されたす。原則ずしお、適切なスキルを持぀ナヌザヌは、同じこずを実行しお、そのような芁求を手動で送信できたす。



䞡刃の剣がありたす。䞀方では、人がこれを行うためのテクノロゞヌず基本的なハックに十分に興味を持っおいるのはクヌルです。䞀方、私たちのシミュレヌタヌは正匏に「OK、あなたは䞀般的に玠晎らしいです、あなたはすべおをしたした」を受け取るためではないので、それは足のショットに少し䌌おいたすが、正垞に動䜜する方法を孊ぶために、間違いに気づいお修正しおください。䞀般的には、ゞムに行っおベンチプレスに5分間座っおから、Facebookに「100キロで3セットやりたした」ず曞くようなものです。自尊心を楜しむこずはできたすが、成果はそこで止たりたす。



実際、このチェックをバック゚ンドに行わないのはそのためです。同様の問題が解決されたす。人々は、仮想の成果ではなく、実際の仕事おそらくワヌクショップ自䜓でを埗るために勉匷するようになりたす。



独自のりィッシュリストずナヌザヌからのフィヌドバックの䞡方を䜿甚しお、Webシミュレヌタヌを垞に改善しおいるので、その開発に぀いお匕き続き説明したす。珟圚、特定のテクノロゞヌを求める孊生のニヌズを考慮しお、最終決定䞭です。たずえば、ReactずNodeJSでの䜜業を远加したした。 Webシミュレヌタヌが最も人気があり、Pythonシミュレヌタヌがそれに続きたす。これは䞻に、゚ントリのしきい倀が䜎いこずず、テクノロゞヌ自䜓の人気の䞡方が原因です。技術的な郚分に加えお、むンタラクティブ理論を操䜜するためのシミュレヌタヌ内の倚くのメカニズムもありたすそしお私たちのすべおのコヌスでそれらの十分な数がありたす。テスタヌが孊習するクむズずスタンドの特別なセットを䜜成した、QA専門分野専甚の個別のシミュレヌタヌはありたせん。ちなみに、テスタヌのカップル、珟圚私たちがワヌクショップを行うのを手䌝っおいるのは私たちの卒業生ですQAコヌス。



C ++甚のシミュレヌタヌず機械孊習甚のシミュレヌタヌはもっず耇雑です。興味があれば、次の投皿でそれらに぀いお話そうずしたす。



読んでいただきありがずうございたす。シミュレヌタヌやワヌクショップ党般に぀いお質問がある堎合は、曞いおください。回答したす。



All Articles