UNIX-wayおよびコンピューターネットワークアーキテクチャジョブジェネレーター

昨年の冬、私たちの最愛の部署で素晴らしいイベントが起こりました。コンピューターネットワーク設計コースが再編成され、その結果、実習1学期ではなく、実験室2学期が形成されました。 一方では、両方の変化-定性的および定量的-は、学生が主題を習得するためのより多くの時間を獲得し、クラスはグループではなく個人であることを意味しました- 5人。 一方、これは、これらの非常に個別のタスクを開発する必要があったことを意味し、それらはすべて互いに異なっていました。



その後、自動タスクジェネレータを作成するというアイデアが生まれました。 以下に説明するタスクの1つのジェネレーターについて。





タスクは、Cisco Packet Tracerで必要なネットワーク構成を構築および構成することでした。 したがって、次の要件がタスクビルダーに課されました。



少し退屈な技術的詳細



ジェネレーター自体は、ネットワークグラフ自体のジェネレーター、独立したアドレス範囲のジェネレーター、および視覚化ジェネレーターで構成されます。



ネットワークグラフと範囲ジェネレーターを作成するために、Tcl言語を使用することが決定されました。Tcl言語は現在、あまり人気がありません。 Graphvizを使用して視覚化を行い、LaTeXを使用して最終ドキュメントを作成しました。



わかりやすいように、ネットワークグラフは、各ネットワークノードを複数回言及できるツリー構造として簡単に表すことができます。 疑問が生じました:ツリー構造自体を効果的に保存する方法は? さまざまなアプローチを使用しようと何度か試みた後、ネストされた辞書を優先して選択が行われました。



ご存じのとおり、Tclでは、ほとんどすべてのオブジェクトをテキスト文字列として表すことができます。 辞書も例外ではありません。 Tclのディクショナリはキーと値のペアを含むリストであり、任意のリストはリストアイテムがスペースで区切られた文字列として記述できます。 この構造はJSONに少し似ていますが、少し単純な構造です。



したがって、辞書はネットワークノード間の接続のリストとして使用します。キーはノードの番号で、値はこのノードが関連付けられているノードのリストです。 同様に、各要素はディクショナリでもあり、デフォルトでは1つの要素を含みます。キーはノード番号で、値は空です。 上記は次のように説明できます。



ネットワークグラフとネストされた辞書



対応する辞書は次のようになります。
  0 {
     1 2
     3 4
     5 6
     7 {
         8 2
         3 {}
     }
 } 




この構造の利点は、要素への途中で選択できることです:call
[dict get $tree 0 7 8]
      
      



ノード8のリンクのリストを「覗く」ことができます。



実際、ネットワーク構造を保存する手段を持ち、ネットワーク自体を構築することはもはや問題ではありませんでした-乱数ジェネレーターの証言によると、条件がチェックされている間に新しいノードが追加されました。



ところで、発電機について。 最初の近似では、スクリプトは非常に奇妙な結果を出しました。その後、乱数ジェネレーターのいくつかの呼び出しの結果を調べることにしました。 2 9 0 1 5 7 7 7 4 7 7 7...



になったら、 getrandom



プロシージャを少し変更して、同じ値が連続して返されないgetrandom



ばなりませんでした。 おそらく乱数発生器の専門家が私に何かを投げるでしょうが、このアプリケーションのこのアプローチは報われました。



選択したグラフの保存方法のもう1つの利点は、ネットワーク内のすべてのノードの存在を簡単に確認できることでした。グラフのテキスト表現からすべてのブラケット[lsort -uniq]



されたため、グラフがフラットリストになり、その後、重複する要素( [lsort -uniq]



)を簡単に削除できますグラフ内のすべてのノードのリストを取得します。



ネットワークが生成されると、同じTclスクリプトがグラフをGraphvizドット形式で保存します。これは、LaTeXの供給に適したEPSに変換されます。 グラフがドットで表示されると、フォントCMR12が明示的に設定され、最終ドキュメントにさまざまなフォントヘッドセットが含まれなくなります。 ただし、ここで迷惑な驚きが1つあります。もちろん、この方法で作成されたフォントはフォントに埋め込まれませんが、ドキュメントの最終アセンブリ中に、LaTeXが使用する文字のみが出力ファイルに含まれます。 したがって、ラベルを正しく表示するには、このLaTeXソースに用紙の余白の後ろにある文字「N」を追加する必要がありました。



LaTeX、dvips、ps2pdfの従来の「コンベヤ」を使用してドキュメントを組み立てます。



オーケストラは、スクリプトと上記のツールを呼び出す小さなMakefileを実行します。



結果として何が起こったのか



数分操作した後、ジェネレーターは1000ページのジョブを含む2メガバイトのPDFを作成しました。ページごとに1つのジョブがあります。 タスクは次のようになりました。



タスクページ



タスク番号は、グループ番号の最後の桁とグループ内の学生番号に対応すると想定されていました。 実際には、数百のタスクに比べて半分以上のグループがあり、各グループの学生は100人にはほど遠いため、学生は今後数年間でタスクが不足することはありません。



さらに、割り当てページが割り当てに添付され、動的ルーティングが必要な理由を理解したいという要望もありました:)



千ページのPDFに対する学生の反応はおよそ「えっ?!」でした。学生の提案の1つは私を楽しませました。



上記のジェネレーターは、さまざまなプログラムを相互に接続することにより、自転車の苦痛を伴う発明をせずに、望ましい結果を得る方法の一例として非常に役立ちます。 もちろん、少しサイクルする必要がありましたが、TeXLive、Graphviz、お気に入りのスクリプト言語などのすばらしいツールを自由に利用できなければ、さらに悪化していました。



一般に、これが私が伝えたかったことのすべてです。 ご清聴ありがとうございました。



PS興味のある方は、プロジェクトのソースコードをhttp://bitbucket.org/andrew_shadoura/netgenで見つけることができます。



All Articles