わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

TCPを用いたプロセス間通信の課題

「本日の授業で,何を学んでほしいかというと,大きく分けて2つあります.
 一つは,『TCPを用いたプロセス間通信』です.
 『ソケットプログラミング』とも呼ばれます.また『クライアントサーバモデル』と密接な関係があります.サーバが起動して待ち受け,そこにクライアントが接続します.接続が成功すれば,互いにメッセージをやりとりします.
 接続の詳細を調査し答案を作るのは,来週の予定ですが,ファイルを開いて読み,自習するといいでしょう.
 何を学んでほしいかのもう一つは,『さまざまなプログラミング言語で,通信ができること』です.
 こちらで用意したプログラムの言語は,C,C++PerlPythonRubyの5つです.
 言語ごとに,クライアントとサーバのファイルがありますので,実行ファイルは,2×5で10個あります.
 クライアントとサーバの実行の組み合わせは,言語を問いません.例えばCで書いたサーバプログラムに,Rubyで書いたクライアントプログラムが接続して,相互に通信することもできます.
 なので実行の組み合わせは,5×5あるいは5^2で,25通りとなります」

なにこれ

 昨日の授業の動画に入れたナレーションです.スライドは昨年度に作成したものを手直ししました.プログラムの言語について,昨年度までは「C,PerlPython 2,Python 3,Ruby」だったのを,今回は「C,C++PerlPython 3*1Ruby」に変更しました.
 CとC++のソースファイルをコンパイルでき,PerlPython 3,Rubyは各言語のスクリプトファイルを実行できるよう,いくつかのパッケージを,Debian 11のVirtualBox仮想アプライアンス*2に入れていました.
 C++は新規作成です*3.教員間のミーティングで,学生はC++に馴染みがないというのを聞き,今回の課題で入れてみようと思ったのでした.クライアントもサーバも,Cのファイルをもとにし,例えばCの

fprintf(stderr, "Fail: getaddrinfo\n");

cerr << "Fail: getaddrinfo" << endl;

に書き換えました(「using namespace std;」も書いています).C++では文字列リテラルがconst char *であることや,strchr関数は,第1引数のconst修飾の有無に応じて戻り値の型も変わる*4のを知るのに,手間を要しました.

2×5なの? 5×2でもいいのでは?

 「言語ごとに,クライアントとサーバのファイルがありますので,実行ファイルは,2×5で10個あります.」の文について,ファイル総数を表すかけ算の式は,5×2と表しても,差し支えありません.
 というのも,「プログラミング言語(5通り)」と,「プログラムの種類(クライアントとサーバの2通り)」の直積(デカルト積)だからです.
 直積については,本日のツイートで言及していました.

  • https://twitter.com/takehikom/status/1447685396779835401(リンク切れ)

「2つの場面がそれぞれa×bとb×aで表される」と「1つの場面を表す式としてa×bもb×aも認められる」は共存します。後者の例(アレイや直積に基づくもの)を示しても前者は駆逐されない、ということでもあります

 この次のツイートで,『小学校学習指導要領(平成29年告示)解説算数編』p.128の記述をいくつか抜き出しました.実際の文章は次の通りです(全角数字は半角に換えています).

 例えば,映像を見て,そこに表されたものの数をブロックで並べる活動を行う。左のような映像を見て全部で幾つあるかを考える際,「同じ数ずつ」あることに気付くことができれば,それが幾つあるのか,まとまりの個数を数える必要性が生まれる。串が3本あること,団子が4個ずつ並んでいることを見いだせば,同じようにブロックを並べることができる。全部の数も,並べた後で数えることができる。
 この団子の数は,数えると12個である。式で表現すれば,4+4+4と表現できる。しかし,その式では3本と見いだした数を直接表現できていない。そのことを表すために乗法を使って4×3という式に表すことを知る。
 また,右のような場面では,「同じ数ずつ」縦横に並んでいることが共有できれば,何をみればよいかが焦点化できる。「縦は何段か。」「横は何列あったか。」などである。それらが分かれば,ブロックを並べることができる。縦に3段あること,横に4列あることが見いだせれば,3×4,又は4×3と式で表すことができる。答えは,3+3+3+3として求めることもできるし,並べたブロックを数えて求めることもできる。

 このうち串に刺した団子の総数を求めるのは「2つの場面がそれぞれa×bとb×aで表される」に該当し,「また,右のような場面」から始まる,4行3列の掲示物は,「1つの場面を表す式としてa×bもb×aも認められる」になります.
 プログラミングで「1つの場面を表す式として2×5も5×2も認められる」ものは,上に示した通りです.「2つの場面がそれぞれ2×5と5×2で表される」ようなシチュエーションは,写経型学習をもとに例示できます.プログラムを「毎日2つずつ,5日間写経する」のと,「5つずつ,2日間写経する」のとで,写経の総数は同じですが,1つ分の数といくつ分が違っています.

*1:スライドには「Python」と書きましたが,コマンド実行時のPythonコマンドは「python3」です.

*2:https://takehikom.hateblo.jp/entry/2021/10/05/234304, https://takehikom.hateblo.jp/entry/2021/10/07/234916

*3:なお,授業で,(TCPを用いたプロセス間)通信をするプログラムの作成は,課題としていません.Cならhttps://linuxjm.osdn.jp/html/LDP_man-pages/man3/getaddrinfo.3.htmlで読めますし,他言語でも労せず見つかります.といったこともあって「こちらで用意した」のでした.

*4:https://runebook.dev/ja/docs/cpp/string/byte/strchr