生徒の実習課題の提出を確認する、集める

目次

公開日 2023-10-25 更新日 -

生徒の実習課題の提出確認

生徒のユーザーホームディレクトリはサーバーにありますから、生徒は保存しただけで提出したことになります。教師は居ながらにして課題の出来具合をチェックできます。これがフロッピーであれば出し入れしなくてはならないし、ましてや各コンピュータのハードディスクにあったときにはすべてのコンピュータのスイッチを入れてまわって見なければなりません。サーバーに保存されていることは画期的なことでした。

それでもなお、ディレクトリを操作して見ることはなかなか面倒ですし、漢字を含むデータの場合は漢字コードの問題もあります。また、評価をしようと思えば、次の時間に生徒が書き足す前に見なければならないこともあります。そこで、授業後に実習ファイルをすべて一カ所にコピーし、Windowsのソフトを使ってチェックをすることにした。

また、課題ファイルの存在だけをチェックすれば良いこともありますし、内容まで吟味する場合もあります。PaintShopProの描画課題ではHRごとに集めてサムネイルを作り、ギャラリーを作って校内に公開することもよくやりました。これらのチェックとコピーにはやはりperlのスクリプトを使いました。

生徒のユーザー名がリストになったファイルが必要です。たとえば

names2A.txt ユーザー名リストの例
c8satomi
c8sayoko
c8kaori
c8yuuki
c8naoko
...

課題のファイル名は、指定したファイルとちょっと違うファイルも判定します。たとえば、当時流行したIloveYouウイルスの話題を入力練習に使ったときには、iloveyou.txtという名前で保存するよう指示しましたが、大文字小文字の違い、全角半角の違いでいろいろな間違いが出ます。正しいファイルがないときには書き込み日時などを頼りに調べ、ファイル名候補に加えます。次のような名前が発見されました。

iloveyoulist.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 は ユーザー名リスト, ファイル名リストの例です。

fck2 課題ファイルの存在をチェックするperlプログラム
#!/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 は ユーザー名リスト, ファイル名リスト, コピー先フォルダ名 の例です。

fck2 課題ファイルをコピーするperlプログラム
#!/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";
}

課題確認のスクリプトは、何度か改良を加えたり、特別バージョンを作ったりしていますが、ここにはバックアップからできるだけ初期のもの選んで掲載しました。