P.1 情報通信システム論b P.2 ネットワークプログラミング1 プログラミング開発環境  - プロジェクト管理  - バージョン管理  - ソースコードの文書管理 P.3 バージョン管理 CVS (Concurrent Versions System) Subversion Git …. ソースコードなどの更新の記録が残せる.(何時,誰が,何処を) 元のバージョンに簡単に戻れる. ソースコードなどを平行開発(ブランチ)して,後で結合(マージ)できる. P.4 Subversion svn co http://localhost/svn/test/trumk test(チェックアウト) svn update (アップデート) svn ci ?m “…” (コミット) 利点 お手軽.構築は簡単(Webサーバがあれば簡単に構築できる). 欠点  一度コミットしたものを取り消すのが面倒.  中途半端なコードがリポジトリに存在する可能性が(結構)ある. Ex.) https://www.nsl.tuis.ac.jp/svn/linux/JunkBox_Lib/trunk P.5 Git (分散型) git clone http://localhost/git/test test (クローン) git pull (プル) git commit ?a ?m “…” (コミット) git push (プッシュ) 利点 ネットワーク環境が無くても使用できる(ローカルリポジトリ) 間違えたものを極力リモートリポジトリにあげない様にすることができる. 欠点  操作が面倒.システム構築が難しい. Ex.) https://gitlab.nsl.tuis.ac.jp , https://github.com/jupyterhub/jupyterhub P.6 ソースコードのドキュメント管理 プログラマはドキュメント書かないよね…. ソースの説明(ドキュメント)と実際のコードの内容が乖離. そしてだいたいコードの内容を忘れる…. ソースコードの中にドキュメントを書こう! P.7 ソースコードのドキュメント管理 Java - JavaDoc Svn: http://www.nsl.tuis.ac.jp/svn/Java/JunkBox_Java_Lib/trunk/ JavaDoc: http://www.nsl.tuis.ac.jp/javadoc/JunkBox_Java_Lib/ C/C++ - 古い言語なので,システムとしては存在しない - OSS: Doxygen Svn: http://www.nsl.tuis.ac.jp/svn/Java/JunkBox_Java_Lib/trunk/ DoxyGen: http://www.nsl.tuis.ac.jp/doxygen/JunkBox_Lib/ P.8 Deployer ソースコードなどから実行環境を作り出す Java - Ant - Maven - Gradle C/C++ - Makefile -- automake (configue), cmake P.9 Makefile 汎用デプロイヤー 基本的なファイル構造 目的物: 材料1 材料2 材料3 …. (ソフト)タブ 作り方 ・ automake(configure), cmake - 様々な情報から Makefile を作り出す. P.10 Berkeley Socket 通信はソケットを介して行われる. ソケット作成(オープン). ソケットにポート番号などを割り当てる(bind). サーバの場合は接続待ち   クライアントの場合は,サーバへ接続(connect) 4. 通信(ファイルの読み書きと同様*) 5. ソケットのクローズ *ファイルと違うところは,読み込み時に全てのデータが揃っているとは限らないこと. P.11 Socket の状態 図の資料は別途用意します.ただし覚えなくても良い. P.12 Sample 本文無し P.13 一般的なサーバの挙動 クライアントからサーバのソケットへ connect サーバはクライアントのソケットへの接続を accept サーバは fork または new Thread でクライアントのリクエストを処理 サーバは,もとのソケットで次のリクエストを待つ P.14 fork() と Thread()の違い fork() : チャイルドプロセスを生成する. new Thread(): チャイルドスレッドを生成する. プロセス: 全てのリソースを共有しない スレッド : CPU以外のリソースを共有する http://www.nsl.tuis.ac.jp/svn/linux/feserver/trunk/fesvr.c http://www.nsl.tuis.ac.jp/svn/vc++/NetProtocol/trunk/NetProtocol.cpp https://github.com/fumihax/feserver/blob/main/fesvr.c https://github.com/fumihax/NetProtocol/blob/main/NetProtocol.cpp P.15 プロセス(タスク)とスレッドの違い マルチタスク   プロセスは完全に独立している.   プロセスの生成・削除にリソースを消費する. マルチスレッド   スレッドの生成・削除に使用するリソースが比較的少ない.   スレッド間でのリソースの使用を管理する必要がある.   注) スレッドセーフな処理(関数)     その処理(関数)が実行されている間,他のスレッドに     よって変数等が書き換えられないことを保証する. P.16 MMORPGのデータサーバの場合 大量の接続に対してデータを転送する場合は一々チャイルドプロセスやチャイルドスレッドを生成せず,その場で力の限りデータの転送を行う. 何千とか何万のプロセス・スレッドを起動していたらそれだけで,物凄い量のリソースを消費してしまう. P.17 複数ソケットの制御 複数のソケットを制御する場合は,通常ソケットの状態を順にポーリングする. ソケットにデータが到達した時点で,イベントドリブンにすることも可能