わさっきhb

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

patchを使った課題

 月曜日の演習科目は前半の第4回を終えました.
 クォーター科目で全8回です.初回はゲストOSの整備,第2回から3回分でソケットプログラミングでした.第5回以降はゲストOSに一般ユーザ権限でApacheをインストールし,HTTPについて学習してもらいます.
 「ソケットプログラミング」といっても,何もない状態からプログラムを作成するというものではありません.Man page of GETADDRINFOの後ろについているコードを手直しして,クライアントとサーバとで1行ずつメッセージを送り合うプログラムを作成し,C++Pythonなど他言語版も用意してzipファイルに入れ,第2回授業で提供しています*1
 第4回は,getaddrinfo関数の呼び出しで得られるaddrinfo構造体の内容について,構造体の各メンバの内容を分かりやすく出力するプログラムを完成してもらいました.昨年度はこの課題の提示で失敗をしてしまったので,今回はやり方を変更しました.
 プログラム完成のもとになるファイルは,第2回授業でダウンロードしてもらった(zipファイルの中に入れた)client.cです.課題提出のファイル名は,addrinfo.cとします.client.cに,addrinfo.patchというファイル(第4回授業でダウンロードしてもらいました)を適用することで,addrinfo.cの最初の内容を作ります.このプログラムでは,構造体のメンバのうちいくつか,そしてリンクリストの最初の要素しか出力しません.入れ子の構造体の参照や,char配列の16進2桁による出力,そしてリンクリストのアクセスなどを記述して,動作確認を行い,期限までに提出してもらいました.
 上記のうちaddrinfo.patchについて,サフィックスから分かるようにpatchコマンドを使用します.このファイルとclient.cがカレントディレクトリにある状態で,patch -o addrinfo.c addrinfo.patchのコマンドを実行することで,ファイルが作られます(-o addrinfo.cを指定せずに実行すると,client.cが書き換えられてしまいます).
 提出期限後に答案を回収し,一つのテキストファイルにして,上から順に見ていきました.答案(ソースコード)全体も見ますが,この課題にはいくつかチェックポイントがあって,そこは間違いなく点検し,okの意味の「o」,十分でないという意味の「?」といった記録を,つけていきました.
 パッチ適用後のファイルを提出しているものを見かけました.点数を低くせざるを得ません.
 さらに読み進めると,ファイル名はaddrinfo.cなのに,Cのソースコードでない答案を見つけました.addrinfo.patchかな,これは0点だなあと思いながら,その答案の後ろを読んで,チェックポイントで「o」にしてきた処理が含まれているのに気づきました.
 その答案は,パッチ適用直後のファイルと,本人の最終状態のaddrinfo.cとの差分を求めて,patchが適用できる形式の内容だったのでした.
 面白いことしてくれるなと思った直後に,別のチェックポイントに基づき「?」にするコードを見つけました.