SDAPSのstampオプションで、回収時にバラバラになっても大丈夫な質問票を作成する

# はじめに

SDAPSは普通紙とドキュメントスキャナを利用するお手軽アンケート作成・集計ツールです。
数百人規模のアンケートを行なうため、いままでとは少し違う要件が加わりました。

これまで使ってこなかったstampオプションを利用したので、その時のメモを残します

## 今回の新規要件

『質問票が複数枚になる』点は、いままでと同じですが、これに加えて、次のような考慮点が指摘されました。

* 質問票を回収する時に、落したものを拾ったり、想定外の状況で、数名の質問票がまざる可能性がある
* 質問の相関をみるものがあるので、別人の質問票と入れ替わるのは問題がある

stampオプションは各質問票に固有の数字を割り振ります。ランダムな数字をわりあてることもできますし、席順のような連番を割り当てることも可能です。

その結果、生成される質問票は、**人数 X 質問票の枚数** 分のページを含むPDFファイルとなるので、数百人規模、複数枚という今回の要件では、最大で数千ページのPDFファイルになるのですが、それも避けたいところです。

ここでは現実的な枚数のPDFファイルに分割するなどの方法についても、メモを残していく予定です。

# 基本的な利用方法

SDAPS自体は日本語化したDockerコンテナをDockerHubに公開しているので、使い方は下記のQiita記事を参照してください。

* [日本語対応版SDAPSのDockerイメージを作ってみた](https://qiita.com/YasuhiroABE/items/005da98fc6dc9b3070f2)

## stampオプション固有のポイント

stampオプションを利用するためには、次のように質問票のLaTeXファイルを変更します。

* 先頭のdocumentclassのオプションで、"print_questionnaire_id,"を有効にします
* まず、``sdaps setup``を実行します ("print_questionnaire_id"オプションを指定した場合、この時点で生成されるquestionnaire.pdfには、"draft" watermarkが加えられています)
* 次に、``sdaps stamp``を実行して、使用する質問票を生成する。(ファイル名は、"stamped_N.pdf")

成功すると、次のように左下にQRコードが追加された質問票が生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78296/0bccbbb9-9d9e-03fc-8631-30ef9d8f9fd7.png)

## SDAPSを取り扱う上での重要な前提

### sdaps setup

* sdaps setupコマンドで、Survey IDが生成され、各ページ右下のQRコードに反映される
* チェック欄の位置が変更される変更を行なうと、sdaps setupコマンドで生成されるSurvey IDは前回とは異なる数値が設定される
  * (単純な文言の軽微な修正であれば、ほとんどのケースで問題ないはず)
* Survey IDが異なる質問票を処理することはできない

### sdaps add

* 大量の質問票を回収した場合には、複数のTIFFファイルに分割&分散して問題ない
* sdaps addコマンドで、引数に渡すTIFFファイルのページ数は、質問票1部のページ数の整数倍である必要がある。
  * (3ページの質問票であれば、3ページ、6ページなど3の倍数であることが必要)
* 後述する質問票ID(Questionnaire ID)が違うものがまざっていても、とにかく質問票1部分のページ数の整数倍でないとコマンドが失敗する
  * (つまり、ページ数しかみていない)

複数のTIFFファイルがある場合には、まず全てを繰り返し sdaps add によってDBに追加してから、次に進みます。

## sdaps recognize & reorder

* TIFFファイルの各ページが順番どおりでなくても問題ないよう、sdaps reorderが準備されている。
* addの次に、まずsdaps recognizeを実行し、エラーを出させることが必要
  * (順番でないことが分かっていても、まず sdaps recognize でエラーを表示させること)
* sdaps reorderを実行してから、また sdaps recognize を実行する
  * (2回目のrecognizeではエラーは表示されないはず)



# 具体的な作業ステップ

サンプルとして、githubに登録している [YasuhiroABE/sdaps-ja-example](https://github.com/YasuhiroABE/sdaps-ja-example) を利用します。

まずリポジトリをcloneします。

```bash:
$ git clone https://github.com/YasuhiroABE/sdaps-ja-example.git
$ cd sdaps-ja-example/
```

質問票のdocumentclassを変更し、**print_questionnaire_id,** を加えます。

```diff:vol.proj/questionnaire.texを編集しています
diff --git a/vol.proj/questionnaire.tex b/vol.proj/questionnaire.tex
index b85ff3b..77e9759 100644
--- a/vol.proj/questionnaire.tex
+++ b/vol.proj/questionnaire.tex
@@ -2,6 +2,7 @@
   english,
   a4paper, 
   checkmode=check,
+  print_questionnaire_id,
   pagemark,
   stamp]{sdapsclassic}
 \usepackage[utf8]{inputenc}
```

## 質問票PDFファイルの生成

この後で、一度、questionnaire.pdf を生成し、固有のIDを生成します。
この時点のsqliteの状態を固定するために、gitリポジトリに登録しておきます。

```bash:質問票PDFファイルの生成とファイルの固定
$ make init
$ rm .gitignore
$ git add . 
$ git commit -m 'Generated the survey ID.'
```

gitコマンドの実行は任意ですが、この状態を保存しておくと、やり直しなどが簡単にできるのでお勧めです。

## 各シートを識別するためのquestaionnaire IDの生成

例として、5名に質問票(1枚)を配布する場合を考えます。
各調査票にランダムな固有IDを割り当てるには次のようなコマンドを実行します。

```bash:stampオプションの実行
$ sudo docker run --rm -v $(pwd)/vol.proj:/proj \
    --name sdaps-ja yasuhiroabe/sdaps-ja:ub2004-3 stamp work/ -r 5
```
最後の``-r 5``の部分で、5部(5名分)の質問票を生成しています。
コマンドが終わると次のような状態になっているはずです。

```bash:statusの確認
$ git checkout -b 20220311_stamp_test
...
$ git status
On branch 20220311_stamp_test
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   vol.proj/work/log
        modified:   vol.proj/work/survey.sqlite

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        vol.proj/work/info~
        vol.proj/work/stamped_1.pdf

no changes added to commit (use "git add" and/or "git commit -a")
```

成功すると、vol.proj/work/stamped_1.pdf に5ページ分のPDFファイルが生成されています。

## -fオプションによてる質問票固有IDの指定

-rオプションは必要部数を手軽に準備できる点と、匿名性を保持することができる点で優れています。
一方、後述するように、連番にすることや、IDのコントロールが必要になる場面も想定されます。

固有IDを指定する場合には、次のようなファイルを準備することで、各行の数字を固有IDとして質問票を生成することが必要です。

```bash:vol.proj/id.txtファイルの概要
$ cat id.txt
202203110001
202203110002
202203110003
```

これにより、3名分の質問票が生成できますが、1度状態をリセットしてから、再度質問票を生成します。

```bash:stampオプションの実行(id.txtを消さないようにvol.proj/work/以下だけをリセットしています)
$ git checkout vol.proj/work/
$ sudo docker run --rm -v $(pwd)/vol.proj:/proj \
    --name sdaps-ja yasuhiroabe/sdaps-ja:ub2004-3 stamp work/ -f id.txt
```

この後でstatusを確認すると、**vol.proj/work/stamped_2.pdf** が生成されていることが分かります。

```bash:
$ git status
On branch 20220311_stamp_test
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   vol.proj/work/log
        modified:   vol.proj/work/survey.sqlite

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        vol.proj/id.txt
        vol.proj/work/info~
        vol.proj/work/stamped_1.pdf
        vol.proj/work/stamped_2.pdf

no changes added to commit (use "git add" and/or "git commit -a")
```

この stamped_2.pdf は3ページで、左下のQRコードをスマホのタブレットなどで人気させると、1ページから順番に、202203110001～202203110003のコードが並んでいることが分かります。

ここまでの作業結果を含むブランチをgithub.comに追加しています。

* https://github.com/YasuhiroABE/sdaps-ja-example/tree/20220311_stamp_test

このブランチをcheckoutして、stamped_2.pdfを印刷して、チェックしてから、適当にシャッフルしてスキャン、作成したTIFFファイルを、vol.proj/sheet01.tiff にコピーすれば、``$ make add & make recognize & make reorder & make recognize & make reportex & make csv`` で結果は取り出せるはずです。

# stampを使用する際のQuestionnaire IDをコントロールしたい場合

今回は質問票の匿名性は確保した上で、作業効率や間違いを可能な限り防止するために各質問票を識別して処理できるようにstampコマンドを利用しました。

通常は配布したい枚数があればランダムな番号を利用すれば問題ないと思います。
ただ、ランダムな数字では印刷が途切れた時、トナーの交換や、給紙のタイミングで質問票が順番に並んでいるか確認するような時には、少しストレスがかかる気もします。

そうするとid.txtファイルを効率的に生成するために、次のようなスクリプトを作成しました。

* https://gist.github.com/YasuhiroABE/767583f87d52524a942756c8a1babded ([RAW](https://gist.githubusercontent.com/YasuhiroABE/767583f87d52524a942756c8a1babded/raw/6a9255434ae11dd22a03ef1b14dc6555acee3828/sdaps-gen-stamp-ids.rb))

sdaps-gen-stamp-ids.rb の名前で保存して、実行許可を出しておきます。

```bash:sdaps-gen-stamp-ids.rbファイルの配置例
$ wget -O sdaps-gen-stamp-ids.rb https://gist.githubusercontent.com/YasuhiroABE/767583f87d52524a942756c8a1babded/raw/6a9255434ae11dd22a03ef1b14dc6555acee3828/sdaps-gen-stamp-ids.rb
```

## スクリプトの実行例

例えば、1000名分の質問票を印刷したいが、質問票が6ページになり、6000枚を一度に印刷するのはちょっと大変そうだ。複数のプリンターで並行作業をしたいので、現実的な1ファイル500枚までの単位に分けたいような場合には、次のようにコマンドを実行します。(500 / 6 == 83)

```bash:
$ ruby sdaps-gen-stamp-ids.rb -n 83 1000
$ ls id*.txt
id001.txt  id003.txt  id005.txt  id007.txt  id009.txt  id011.txt  id013.txt
id002.txt  id004.txt  id006.txt  id008.txt  id010.txt  id012.txt
```

各IDはコマンド実行日の日付をprefixとして、次のような内容になっています。

```bash:id013.txtファイルの先頭部分(末尾は0000番から始まるので0999で1000枚目になります)
$ cat id013.txt
202203110996
202203110997
202203110998
202203110999
```

これらのテキストファイルを繰り返し、vol.proj/id.txt にコピーし、``$ make stamp``を実行していけば必要なsamped_N.pdfファイルが生成できます。

以上
(※ QRコードの商標はデンソーウェーブの登録商標です。)