memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

演習室パソコン監視プログラム

■背景

前期の授業も大詰めを迎えています。

演習系の授業でも理解度を確認するために基本的なプログラムを書かせるなどの試験を課しています(学生さんには嫌がられるのですが。。。)。

毎年、プログラムコードを目でチェックして採点していたのですが、それはそれで大変で。。。なんとかならないかな。。。と思っていました。

1つの試みとしてパソコンでプログラム作成して検証結果を添えて提出してもらう方法を取ろうと考えています。

解答中にはインターネットを参照したり過去の自作プログラムを参照することを許可します。

プロでもクラスやメソッドをすべて覚えていることはないでしょうし(繰り返すうちに自然と覚えることはあっても)、そもそもそんな記憶力を要求されることはないはずです。必要な情報を自分で探して参照しながら要求に対して自力で答えを出すことができればいいと考えています。

ただ、そうはいっても不正しようと思えばいろいろなやり方が考えられます。すべてに対処することは現実的ではありません。そこでまず考えたのは監視員の配置です。見られていれば変なことはできないでしょう。でも。。。演習室内の70人近い人を監視するには人がたくさん必要です。それは難しい。。。

で、考えたのが監視プログラムです。一番最初に思い出したのがどこかの研究会で拝見したNAISTで開発されたtaskpitでした。でも、プライバシー保護の観点からどんなアプリが使われているかはわかっても内容まではわかりません。

次に考えたのが演習中のモニターの監視です。スクリーンキャストプログラムを探したのですが、どうも目ぼしいものがありません。しかたがないので作ろうと。小一時間くらいあれこれ調べて作ったのが以下です。Windows(7)で動作することを確認しています。JavaですのでBATファイルを除けばプラットフォームには依存しないでしょう。

とりあえず長い前置きはこのくらいにして以下、プログラムです。もし、同じ問題を抱えていらっしゃる方がいれば自由にお使いください(以下のプログラムもあちこちのサイトからプログラムを借用しています。メモるのを忘れましたが。。。ごめんなさい)。

f:id:ke_takahashi:20150715201431j:plain

■プログラム

package swken;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ScreenShot {
    private String id = "";
    private int c = 0;
    public ScreenShot(String id) {
        this.id = id;
    }
    public void capture() throws AWTException, IOException {
        int thumb_w = 480, thumb_h = 270; //★縮小後の画面サイズ
        Robot robot = new Robot();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        BufferedImage image = robot.createScreenCapture(new Rectangle(0, 0, screenSize.width, screenSize.height));
        BufferedImage thumb = new BufferedImage(thumb_w, thumb_h, image.getType());
        thumb.getGraphics().drawImage(image.getScaledInstance(thumb_w, thumb_h, java.awt.Image.SCALE_AREA_AVERAGING), 0, 0, thumb_w, thumb_h, null);
	String number = "0000" + (c++);
	number = number.substring(number.length() - 4);
	ImageIO.write(thumb, "PNG", new File("★" + id + "_" + number + ".png")); //共有フォルダのパス名を指定してください
    }
    public void run() {
        while (true) {
            try {
                capture();
                Thread.sleep(★); //監視間隔(ミリ秒で指定してください)
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
    	System.out.println("監視を開始します。不正行為はくれぐれもしないように :-)");
        (new ScreenShot(args[0])).run();
    }
}
  • capture.bat
@echo off
SET /P INP="学籍番号を入力してください(131114xxxx)"
java -jar Z:\教員\takahashi\capture.jar %INP%

■使い方

(1)上記のScreenShot.javaコンパイルして実行可能なjarとしてcapture.jarを作成します。
(2)capture.jarは学生さんのパソコンからも参照できる位置に置きます(上記ではZ:\教員\takahashi\capture.jarです)
(3)capture.batを学生さんのパソコンから参照できる位置に置きます。このbatファイルを学生さんに実行してもらいます。実行するとコマンドプロンプトが開かれ学籍番号を尋ねてきます。番号を入力すると、ScreenShot.java内で指定した共有フォルダ内に監視間隔毎にファイルが作成されます。

ちょっと嫌らしいですが。。。監視間隔や監視画像の保存場所は学生さんには公開しないのがいいと思います。何を監視されているのか?周期は何かはわからない。。。そもそも不正をさせないための仕組みなので。

さて、どうなりますやら。。。