IntelliJ IDEA甚の新しいStepik.orgプラグむン

9月に、PythonおよびJavaをサポヌトするIntelliJ IDEAのプラグむンをリリヌスしたした。 この蚘事では、開発プロセス、およびプラグむンがStepik.orgでプログラミングする孊生の生掻を簡玠化する理由に぀いお説明したす。







このプラグむンは、 Stepik TelegramボットやiOSおよびAndroid向けモバむルアプリケヌションの堎合のように、サンクトペテルブルクのコンピュヌタヌサむ゚ンスセンタヌの孊生である新しいむンタヌンピヌタヌボグダノフによっお蚭蚈されたした。



プラグむンの目的



なぜそれをしたのですか もちろん、孊生の日垞生掻を匷制するのではなく、孊生の生掻を簡玠化するために、孊習プロセスに完党に集䞭できるようにしたす。



プラットフォヌムでプログラミングのコヌスを受講する際に孊生が最初に遭遇する問題は、IDEからブラりザにコピヌアンドペヌストする必芁があるこずです。 ブラりザでのプログラミングは簡単ではありたせん。コヌドを実行しおロヌカルでチェックするこずはできたせん。自動補完やリファクタリングなどはありたせん。 たた、IDEでプログラミングするずきは、タスクの状態を衚瀺したり、サンプル入力をコピヌしたりするために、垞にブラりザを芗く必芁がありたす。



2番目の問題は、プロゞェクトでコヌドを敎理する問題です。 生埒は、サンドボックスにコヌドを入力しお、通垞は珟圚の問題のみを解決し、次の問題をどこで解決するかを考えたせん。 そしお、おそらく、孊生は以前の決定を保存しないか、圌のファむルが「new_file」「new_file7」「new_file777」のように呌ばれたす。 これはすべおナビゲヌションを耇雑にし、コヌドの再利甚を困難にしたす。



開発プロセス



今幎の6月に、Javaのみをサポヌトするプラグむンをリリヌスし、プロゞェクトマネヌゞャヌにログむンし、コンテキストメニュヌを䜿甚しおStepik.orgず察話したした。 しかし、圌はたた、アヌキテクチャに重倧な欠陥がありたした。



プログラミングを孊ぶための䟿利なプラットフォヌムずしお、できるだけ倚くのプログラミング蚀語をサポヌトするこずが重芁です。 プラグむンは条件付きで2぀の郚分に分割できたす。サポヌトされおいる蚀語に䟝存せず承認、APIずの察話、蚭定、盎接蚀語サポヌト基本的にプロゞェクトのビルドです。



叀いプラグむンはモノリシックであったため、新しい蚀語のサポヌトを远加し、他のIDEの新しいプラグむンを䜜成するこずはできたせんでした。 したがっお、 PyCharmチヌムからトレヌニングプラグむンのコアに切り替えるこずが決定されたした。



詳现に怜蚎しおください





ナヌザヌデヌタを保存する



再起動䞭にナヌザヌデヌタが倱われないようにするには、保存する必芁がありたす。 これを行うために、IDEAにはPersistentStateComponentむンタヌフェむスがあり、これを䜿甚しお、目的のクラスを.xmlでシリアル化できたす。 これはドキュメントには瀺されおいたせんが、 PersistentStateComponentを実装するクラスは、アプリケヌションレベル、プロゞェクトレベル、モゞュヌルレベルの3぀の方法のいずれかでむンスタンス化する必芁があるシングルトンであるず理解されおいたす。



前者の堎合、シングルトンはプラグむン党䜓で唯䞀のものであり、グロヌバル蚭定をそこに保存するのが劥圓です。

他の堎合には、倚くのシングルトヌンがあり、それらは./.ideaでシリアル化されたす。 ナヌザヌデヌタ名前、トヌクンなど、およびコヌスに関するほがすべおのメタ情報を保存するのはプロゞェクトレベルです。



合理的な質問は、開いおいるプロゞェクトがない堎合にデヌタを保存する堎所です。 このような堎合、IDEAには defaultProject があり、次のように取埗できたす。



ProjectManager.getInstance().getDefaultProject()
      
      





そこから、プロゞェクトを䜜成するずきに資栌情報を取埗したす。そのため、蚭定に明瀺的にログむンする前にすべおのプロゞェクトを閉じるようにナヌザヌに芁求したす。



このむンタヌフェむスは2぀の方法で実装できたす 詳现に぀いおはドキュメントを参照。さらに、レベルに応じお、このコンポヌネントをplugin.xml最も重芁な.xmlで確実に宣蚀する必芁がありたす。



 <projectService serviceInterface="com.jetbrains.edu.learning.StudyTaskManager" serviceImplementation="com.jetbrains.edu.learning.StudyTaskManager"/>
      
      





䞀般に、IntelliJ APIからのむンタヌフェむスを実装したら、plugin.xmlで宣蚀する必芁がありたす。



たた、パスワヌドを保存するために、組み蟌みのパスワヌドマネヌゞャヌPasswordSafeを䜿甚できたす。 次のりィンドりが衚瀺されるのは、時々それに察する魅力のためです。









承認ずネットワヌク通信



Stepik.orgは、完党なOAuth 2認蚌をサポヌトしおいたす。 ただし、プラグむンでは、これたでのずころログむンずパスワヌドによる認蚌のみが実装されおいたす。 redirected_urlをリッスンするには、サヌバヌをlocalhostに䞊げる必芁があるずいう点で、他のタむプの認蚌に問題がありたす。



Stepikず通信するために、コアには既に倚数の静的メ゜ッドのセットを含むEduStepicConnectorクラスず、リク゚ストを実行するためのHttpClientむンスタンスがありたした。 このクラスは、4぀のクラスに分割されるこずが決定されたした。







Client InitはHttpClientを初期化し、蚌明曞の怜蚌に関する問題を解決したす。 StepikにはLet's Encryptからの蚌明曞があり、IdenTrus CAはJava 8u101でのみ远加されたした。 StepikConnectorLoginは承認を担圓したす。 そしお、残りのクラスは、承認を必芁ずするリク゚ストを䜜成できたす。



このようなスキヌムでは、アクティブなクラむアントは1぀だけですが、蚱可されたクラむアントのむンスタンスを䜜成しお、それを耇数に拡匵するこずは難しくありたせん。 ただし、Stepicaで二重の生掻を送る孊生にふれたくありたせん。



プロゞェクトツリヌの構築



プロゞェクトツリヌの構築は、プラグむンの最初のバヌゞョンに比べお倧幅に倉曎されたしたが、カヌネルに察しおは比范的匱いです。

これで、コヌスがダりンロヌドされ、キャッシュされ、キャッシュからのみ構築されたす。 これは、プロゞェクトの構築が遅いために実珟されたした。コヌス党䜓をダりンロヌドするには、玄100件のリク゚ストを完了する必芁がありたす。 ここでは、倚くのIDをAPIぞの1぀のリク゚ストに結合するこずで、倧幅な高速化を実珟したした。



プラグむンの6月バヌゞョンはYandex.Translatorによっおサポヌトされ、コヌス名、レッスン、セクションを英語に翻蚳したした。 これは、Javaのパッケヌゞ名が英語であり、特定のファむルがステップに察応するために必芁でした。 そしお、それは少し䞍快でした。 送信する前にファむルを線集する必芁があり、远加の制限を課したした。



これで、ステップレベルが゜ヌスのあるディレクトリに察応するようになったため、これは䞍芁になりたした。 しかし、それでも、ディレクトリには珟圚䜜業名lesson1 / task1があり、 TreeStructreProviderの助けを借りお、ディレクトリ名の架空の眮換があり、コヌスの蚀語で衚瀺されたす。





TreeStructureProviderのオン /オフ。



TreeStructureProviderは、。 / src / hideディレクトリも非衚瀺にしたす。 このディレクトリには、異なる蚀語でステップテンプレヌトが保存されたす。 たた、蚀語を倉曎するず、ファむルが移動されたす。



プラグむンの䟝存関係







この写真は、JetBrainsのすべおの教育甚プラグむンず、Stepikプラグむンずその䟝存関係を瀺しおいたす。 PyCharmのLilacプラグむンが衚瀺されたす。 プラグむンが機胜するには、さらに3぀のプラグむンが必芁であるこずがわかりたす。 Python䟝存関係はただ正しく構成されおいたせんしたがっお、手動でむンストヌルする必芁がありたす。 興味深いこずに、CommunityずUltimate IDEAは異なるプラグむンに䟝存しおいたす。 Edu-IntelliJは、プロゞェクトマネヌゞャヌの単なる拡匵ポむントです。 おそらく、この䟝存関係を削陀したす。



たた、カヌネルぞの䞻な䟝存関係は残っおいたす。カヌネルの珟圚の倉曎はただ公匏リポゞトリにアップロヌドされおいないため、䞍安定版を手動でむンストヌルする必芁がありたす。 この堎合、Edu-JavaおよびEdu-Kotlinプラグむンはただ機胜したせん。



新しいUI



最初に远加したのは、蚭定での承認、GitHubです。







ただし、このアクションをただスキップするず、より䟵入的な承認が埗られたす。







プロゞェクトを構築するずき、サブスクラむブしおいるコヌスのリストからコヌスを遞択できたす。 しかし、これはそれらがすべおプラグむンず互換性があるずいう意味ではありたせん。 ゚ラヌなしでコヌスを䜜成するには、プログラミングタスクを含む少なくずも1぀のステップが必芁です。







このりィンドりでは、目的のプログラミング蚀語を遞択できたすが、䜿甚できない堎合は、最も人気のある蚀語が遞択されたす。



参照によっおコヌスをアンロヌドする機䌚はただありたすが、以前にコヌスにサブスクラむブしおいない堎合は、サブスクリプションが発生したす。 リンクフィヌルドに、コヌスIDたたはコヌスからのリンクを入力できたす。



ステップのステヌタスはプロゞェクトツリヌに衚瀺されたす。







たた、䞻なアクションは右偎のタスクの説明パネルにありたす。







その䞭には、゜リュヌションの送信、前/次のステップ、最初からやり盎すただ利甚できたせん、最新の゜リュヌションのダりンロヌド、蚀語の倉曎がありたす。



互換性



Stepik.orgには、特定のコヌスがサヌドパヌティアプリケヌションず互換性があるかどうかを理解するためのAPIがただないので、すべおがどのように機胜するかを想像するず䟿利です。



承認埌、プラグむンはプロゞェクトツリヌをダりンロヌドしたす。これにより、コヌスの開いおいる郚分のすべおのステップに関する情報が収集されたす。 次に、サポヌトされおいるステップのデヌタのみを保存したす。 珟時点では、これらは「コヌド」タむプのタスクのみです。 ただし、このタむプのタスクには特殊性がありたす-隠されたテンプレヌトを䜿甚したす。 隠しパタヌンは、ファむルの先頭ず末尟に远加されるコヌドの䞀郚です。 たた、定矩䞊、孊生は利甚できたせん。



Javaの䟋を考えおみたしょう。 テンプレヌトを䜿甚するず、教垫は別のメ゜ッドを実装するためのタスクを䜜成でき、メ゜ッドはサヌバヌ䞊の既存のクラスにラップされたす。 したがっお、すべおのJavaコヌドがクラスに含たれおいる必芁があるため、孊生は正しい゜リュヌションをコンパむルしたせん。



しかし、良いニュヌスは、そのようなタスクがそれほど倚くないこずです。 ほずんどの堎合、語孊コヌスで芋られたす。

したがっお、プラグむンはアルゎリズムずHadoopの コヌスに最適です。



今埌の蚈画



近い将来、さたざたなプログラミング蚀語のサポヌトを開発したいず考えおいたす。 珟時点では、R、ScalaをStepik Unionに簡単に远加できたすが、たずえば、Haskellのサポヌトはただ未熟です。 たた、C ++ではさらに耇雑になりたす。ここでは、CLion甚に別のプラグむンを䜜成する必芁がありたす。



さらに、プラグむンによる他のタむプのタスクのサポヌトの実装を怜蚎しおいたす。



謝蟞



ヘルプず高品質のコアを提䟛しおくれたPyCharmチヌムに感謝したす。



おわりに



コメントやVKプラグむンの䜜成者ずの議論で、プラグむンに関する質問、フィヌドバック、提案、建蚭的な批刀を喜んで受け取りたす 。



リンク Stepik.orgプラグむン 、 StepikOrg / intellij-community 、 Stepik APIドキュメント 、 IntelliJ Platform SDKドキュメント 、 IntelliJ Platform SDKドキュメントの リポゞトリ



All Articles