公開日 2023-10-25 更新日 -
生徒のユーザーホームディレクトリはサーバーにありますから、生徒は保存しただけで提出したことになります。教師は居ながらにして課題の出来具合をチェックできます。これがフロッピーであれば出し入れしなくてはならないし、ましてや各コンピュータのハードディスクにあったときにはすべてのコンピュータのスイッチを入れてまわって見なければなりません。サーバーに保存されていることは画期的なことでした。
それでもなお、ディレクトリを操作して見ることはなかなか面倒ですし、漢字を含むデータの場合は漢字コードの問題もあります。また、評価をしようと思えば、次の時間に生徒が書き足す前に見なければならないこともあります。そこで、授業後に実習ファイルをすべて一カ所にコピーし、Windowsのソフトを使ってチェックをすることにした。
また、課題ファイルの存在だけをチェックすれば良いこともありますし、内容まで吟味する場合もあります。PaintShopProの描画課題ではHRごとに集めてサムネイルを作り、ギャラリーを作って校内に公開することもよくやりました。これらのチェックとコピーにはやはりperlのスクリプトを使いました。
生徒のユーザー名がリストになったファイルが必要です。たとえば
c8satomi c8sayoko c8kaori c8yuuki c8naoko ...
課題のファイル名は、指定したファイルとちょっと違うファイルも判定します。たとえば、当時流行したIloveYouウイルスの話題を入力練習に使ったときには、iloveyou.txtという名前で保存するよう指示しましたが、大文字小文字の違い、全角半角の違いでいろいろな間違いが出ます。正しいファイルがないときには書き込み日時などを頼りに調べ、ファイル名候補に加えます。次のような名前が発見されました。
iloveyou.txt i love you.txt Iloveyou.txt ILOVEYOU.txt I LOVE YOU.txt :82:89loveyou.txt iloveyou:81:40.txt i:81:40:82:8c:82:8f:82:96:82:85:81:40:82:99:82:8f:82:95.txt :82:89:82:8c:82:8f:82:96:82:85:82:99:82:8f:82:95.txt
1年目のsambaの設定ではASCII以外のファイル名はHEXコードで保存します。:82:89 は Shift_JISの 8289 つまり全角の「i」です。このリストを使って存在をチェックしたりコピーしたりします。
プログラムは以下のとおり。"not exist xxxxx..." と出たユーザーについて /home/<username> を調べて、間違いファイル名があればファイル名リストに加えます。授業ごとなので、次第にリストが充実して楽になっていきます。
プログラムの使用法は、
# fck2 names2A.txt iloveyoulist.txt
#はここではプロンプト。全生徒のファイルを読む関係で管理者になって実行します。本当は生徒ファイルを読めるユーザーを管理者より低い権限で作る方が安心。
names2A.txt, iloveyoulist.txt は ユーザー名リスト, ファイル名リストの例です。
#!/usr/bin/perl
print "fcp2\n";
$cto=0;
$ctb=0;
$ctx=0;
($unamesf,$fnamesf)=@ARGV; #(ユーザー名リスト,ファイル名リスト)
print "$unamesf user name list\n";
open(UNAMES,$unamesf) || die "cannot open $unamesf";
print "$fnamesf file name list\n";
open(FNAMES,$fnamesf) || die "cannot open $fnamesf";
@filename = <FNAMES>;
close(FNAMES);
print "@filename\n";
chop(@filename);
chop(@filename); #Windowsで作るので改行2バイト
$rightname=$filename[0]; #最初の名前が正しいファイル名
print "\nbegin ------------------\n";
while(<UNAMES>){
chop;
chop;
$user=$_;
$ex=0;
foreach(@filename){
if (-e "/home/$user/$_"){
if ($_ eq $rightname) {
print "ok $_ $user\n";
$cto=$cto+1;
}else{
print "exist but $_ $user\n";
$ctb=$ctb+1;
}
$ex=1;
last; #該当ファイルがあればforeachをぬける
}#該当ファイルがなければここ
}
if ($ex==0){
print "not exist xxxxxxxxxxxxxxxxxxxx $user \n";
$ctx=$ctx+1;
}
}
$total=$cto+$ctb+$ctx;
print "o:$cto b:$ctb x:$ctx t:$total'\n";
#ファイル名リストの :NNを文字にする
$kirokufile="sjis_";
open(KNAMES,">$kirokufile$fnamesf") || die "cannot open $kirokufile";
foreach(@filename){
s/:(.{2})/chr hex($1)/ge ;
print KNAMES $_ ;
print KNAMES "\n";
}
PaintShopProで描かせた絵は、コピーして集めます。最初の課題は山と空と木が書いてあるもので、ファイル名はyama.pspでマイドキュメントに保存する指定です。
集め方は、
/home/c8satomi/yama.psp → ./kadai/2A/yama/c8satomi.psp /home/c8sayoko/yama.psp → ./kadai/2A/yama/c8sayoko.psp /home/c8kaori/山.psp → ./kadai/2A/yama/c8kaori.psp ...
というようにしました。2Aの部分は授業のクラスごとということです。
プログラムの使用法は、./kadai/2A/をカレントディレクトリにしてyama/を作ってから、
# fcp2 names2A.txt yama.txt yama
#はここではプロンプト。全生徒のファイルを読む関係で管理者になって実行します。
names2A.txt, yama.txt, yama は ユーザー名リスト, ファイル名リスト, コピー先フォルダ名 の例です。
#!/usr/bin/perl
print "fcp2\n";
$kirokufile="_kiroku.txt";
$cto=0;
$ctb=0;
$ctx=0;
($unamesf,$fnamesf,$dirnam)=@ARGV;
mkdir $dirnam,0750 || die "cannot make directory $dirnam";
open(KIROKU,">$dirnam/$kirokufile") || die "cannot open $kirokufile";
print "$dirnam directory\n";
print KIROKU "$dirnam directory\n";
open(UNAMES,$unamesf) || die "cannot open $unamesf";
print "$unamesf user name list\n";
print KIROKU "$unamesf user name list\n";
open(FNAMES,$fnamesf) || die "cannot open $fnamesf";
print "$fnamesf file name list\n";
print KIROKU "$fnamesf file name list\n";
@filename = <FNAMES>;
close(FNAMES);
chop(@filename);
chop(@filename);
$"="\n";
print "@filename\n";
print KIROKU "@filename\n";
$"=" ";
$rightname=$filename[0];
if ( $rightname =~ m/\.\w*$/ ){ $exp = $& }
print "\nbigin -------------------\n";
print KIROKU "\nbigin -------------------\n";
while(<UNAMES>){
chop;
chop;
$user=$_;
$ex=0;
$id=0;
foreach(@filename){
$id=$id+1;
if (-e "/home/$user/$_"){
$newfilename=$user . $exp;
`cp -fp "/home/$user/$_" ./$dirnam/$newfilename`;
`chown adachi:adachi ./$dirnam -R`;
#`chmod 0700 /home/profiles/$uname -R`;
if ($_ eq $rightname) {
print "ok $_ $user\n";
print KIROKU "ok $_ $user\n";
$cto=$cto+1;
}else{
print "exist but xxx $_($id) $user\n";
print KIROKU "exist but xxx $_($id) $user\n";
$ctb=$ctb+1;
}
$ex=1;
last;
}
}
if ($ex==1){
#$ctb=$ctb+1;
} else {
print "no exist xxxxxxxxxxxxxxxxxxxx $user \n";
print KIROKU "no exist xxxxxxxxxxxxxxxxxxxx $user \n";
$ctx=$ctx+1;
}
}
$total=$cto+$ctb+$ctx;
print "o:$cto b:$ctb x:$ctx t:$total'\n";
print KIROKU "o:$cto b:$ctb x:$ctx t:$total'\n";
print KIROKU "-------------sjis---------------\n";
$id=0;
foreach(@filename){
$id=$id+1;
s/:(.{2})/chr hex($1)/ge ;
print KIROKU "$_($id)\n";
}
課題確認のスクリプトは、何度か改良を加えたり、特別バージョンを作ったりしていますが、ここにはバックアップからできるだけ初期のもの選んで掲載しました。