Node.jsのサマースクールのコード例とKPIのJavaScript

同志のエンジニア、私はキエフ工科大学コンピューター科学技術学部のソフトウェア工学の分野における科学技術者のトレーニングの成功について報告し、トレーニングコースのために書かれた興味深いコード例を公開していますが、実用的な観点からは興味深いことです。 JavaScriptとNode.jsを学習プロセスに導入するという考えは、私にとって数年熟成されてきました。 しかし、プログラミングの基本的なことを習得するために、私はCがもっと好きなので、人々は車を感じ、自分自身とコードを制御する方法を学びます。 しかし、抽象化レベルCがもはや十分な例示ではないアプリケーションでは、マルチパラダイムで柔軟なJavaScriptが定着しました。 強力でシンプルなNode.js APIを使用して、ペアで概念コードを直接記述できます。 さらに、JavaScriptの知識は、ITで働いているすべてのエンジニアにとって実際に役立つはずです。 コースの学生が開発したコードの一部はすでに深刻なオープンソースプロジェクトに陥っていますが、これは誰もが繰り返すことができる素晴らしいプラクティスです。これは実験結果をgithubに徐々にアップロードし、方法論的な指示を提供し、それを気にしないためこれはすべて自分自身のためにまず必要であるため、生徒はフォークから償却します。 これらの資料は、2015年から2016年の学年のために工科大学の約300人の学生の準備に使用されました。 もう一度、2016年8月9日から26日までキエフで開催されるサマースクールの棚に例を掲載します 。スケジュールについてはこちらをご覧ください 。 そのため、最もわかりやすいコード例を紹介します。







例1 ライブテーブル



GoogleギルドドキュメントのGoogleスプレッドシートのようなものを書くことは、麻薬を刺激することさえできます。 それを小さな6x5スプレッドシートとしますが、数人が入力でき、入力されたデータはネットワーク上でリアルタイムに同期されます。 明確で効果的であり、実際に適用できます。 さらに、このタスクは、WebSocketとEventEmitterを使用して追加のトピックを非表示にし、簡単な実装を自分で記述し、EventEmitterの機能を拡張してすべてのイベントをサブスクライブします。 1回の講義と2回の実践のために設計されたこの作業の主な目的は、ループを介してネットワーク経由でイベントをブロードキャストするのではなく、イベント駆動のコンピューティングのリアクティブモデルを習得することです。







最初から始めることができます。サーバーの基本コードは41行、クライアントは53行で、github内のタスクと一緒に記述およびレイアウトされますhttps : //github.com/HowProgrammingWorks/EventDrivenProgramming







例2 分散コンピューティング



分散コンピューティングで生徒を魅了する方法は? 私は彼らが1つまたは2つのペアで実現できる単純な何かを与えればよいと思います。 もちろん、Node.jsで大規模な計算問題を書く人は誰もいませんが、JavaScriptにはシングルスレッドの実行モデルがあるという意味で、非常に簡潔で示唆的なものです。 計算を視覚的に並列化し、非同期パラダイムに変換し、複数のプロセスに分散させることができます。 これを行うには、ループから反復子に切り替えることをお勧めします。 この場合、ループ変数と状態は消えます。 元のデータセットは既にカットされ、さまざまなプロセスに転送できます。 これは、データセットの要素を処理する順序が重要ではないタスクに適していますが、そのようなタスクは多数あります。 さらに、イテレータは再定義、インターセプト、または独自に作成できます。 プロセス間通信とネットワーク交換を実装して、イテレーターの抽象化の背後にこれを隠すことができます。 アプリケーションコードは変更されず、イテレータの実装のみがタスクを分割し、その中にパーツのインデックスを格納します。その後、結果が(異なる順序で)取得されると、目的の順序で貼り付けることができます。







また、ゼロから開始することもできます。githubhttps ://github.com/HowProgrammingWorks/InterProcessCommunicationには、プロセス間で交換するための2つのオプションを含むコードブランクがあります。IPC(オペレーティングシステムに組み込まれ、Node.js APIのラッパーを持つ)とTCPソケットを使用します。 後者は、単一サーバー内での並列化だけでなく、複数のマルチコアサーバーのクラスターの構築にも使用できます。







このタスクは、学生が小さく、より深く掘る能力と欲求を持っている場合、開発者は各コンピューティングプロセスの状態を維持し、コンピューティングタスクを自由なリソースに分散させるか、一般的に比例して、コンピューティングクラスタのリソースマネージャーを作成できます彼らのパフォーマンス。 さまざまなタスクのパフォーマンス統計を収集し、負荷分散を最適化できます。 サーバーに計算を実装し、多くのクライアントからリクエストを送信することができます。逆も同様です。多くのワーカーを持ち、同じウィザードからリクエストを送信できます。 リクエストブローカーを作成することもできます。そうすると、2つのタイプのクライアント(顧客とエグゼキューター)を持つ1つのTCPサーバーができます。 顧客はタスクを送信し、ブローカー(サーバー)はそれらをエグゼキュータに配布し、ソリューションの一部を収集して、顧客に結合されたソリューションを送信します。







例3 サンドボックス化、管理の反転、および依存性注入



もう1つの重要なトピックは、サンドボックス内のアプリケーションコードのスクリーニングです。 この意味で、Node.jsはV8仮想マシンAPIへのアクセスを提供し、これによりコード実行コンテキストを動的に作成できます。 サンドボックスには独自のグローバルコンテキストがあり、アプリケーション内の特定のオブジェクトへのリンクを明確に転送しない限り、アプリケーションのメイングローバルコンテキストには絶対にアクセスできません。 これにより、クラスだけでなく、モジュールの制御反転と依存性注入の原理を示すことができます。 あるサンドボックスからオブジェクトまたは関数へのリンクを取得し、別のサンドボックスに埋め込むことができます。 ロギング、速度測定、分散コンピューティング、セキュリティ機能などをその動作に追加することで、サンドボックスにAPIをラップできます。 サンドボックス、これはノードの最も強力な機能の1つですが、残念ながら、アプリケーションアプリケーションではまだほとんど使用されていません。







一般的に、ノードでの依存関係の管理はそのようなものであり、すべてがDL(依存関係検索)を介して行われ、その実装は悪名高い要求です。 これは、モジュール自体が他のモジュールをコンテキストにロードする方法で、ファイルへのフルパスまたはnpmリポジトリ内のモジュールの名前を示します。 同時に、ロード可能なモジュールはアプリケーションのグローバルコンテキストへのフルアクセスを取得し、setTimeoutの削除、Array.prototype.forEach()メソッドのオーバーライド、requireをその関数に置き換えるなど、アプリケーション内のすべてを変更できます。 一般に、JavaScriptライブラリは多くの場合、言語の基本クラスを変更するため、コードの競合が発生します。 サンドボックスで競合するコードを実行し、エスケープを実装し、メインアプリケーションから依存関係を実装し、サンドボックスのグローバルコンテキストでそれらへのリンクを作成することを除いて、これからのエスケープはありません。







package.jsonにあるものと同様に、依存関係の外部宣言的記述に進むのが最善です。 ただし、package.jsonに含まれる宣言型の記述である必須のスタイルでノードの複製を要求します。 大規模なプロジェクトでは、2つの異なるアプリケーションコンポーネントが同じライブラリの異なるバージョンに依存することがよくあり(もちろんこれはひどいですが、そのままです)、package.jsonでは1つしか記述できません。 もちろん、これらすべてのコンポーネントを個別のnpmパッケージとして設計し、npmサーバーを上げるか、プライベートリポジトリにアップロードできます。 しかし、サンドボックスと依存性注入の助けを借りて2つの問題を一度に解決する方がはるかに美しいです。 メインモジュールは依存関係記述ファイルを読み取り、コンテキストを保護しながら、必要なバージョンの依存関係を必要なサンドボックスにロードできます。







リポジトリhttps://github.com/HowProgrammingWorks/InterProcessCommunicationにリンクし、3つのフォルダーがあります。









参照資料





おわりに



次回は、ラボからのさらに多くのコード例を示します。たとえば、Webソケットを介したWebチャット、メタプログラミングの実用化、老朽化し​​たWeb用の拡張可能なHTTPサーバー、機能の非同期構成、コード抽象化レベルの向上、専用プロトコルの開発、シリアライザーおよびサーバーTCPおよびUDPデータベース、ネットワーク上のディレクトリ同期、DSL言語の構築、たとえば、RAM内のデータ構造のクエリ言語など。 ご清聴ありがとうございました。








All Articles