本稿で解説する自動集計システムは、アマチュア無線のコンテストの効率的な運営を支援する、ウェブシステムである。 ALLJA1コンテストを対象に、参加者の集計と結果発表を迅速化する目的で整備された。2014年以来の運用実績がある。
ALLJA1コンテストは毎年6月の開催だが、2009年に部員が数名に減勢した我が無線部では、開催困難な状況に陥った。 運営業務は、以下の4段階に区分できるが、書類審査の負担が重く、恒常的に結果発表が年度末まで遅れる状況だった。
開催前の業務 | 規約策定と告知 |
開催中の業務 | 開催状況の把握 |
審査中の業務 | 書類受付 $\cdot$ 書類審査 |
審査後の業務 | 結果発表 $\cdot$ 賞状発送 |
2010年の増勢により、当面は開催を継続する方針に決着したが、外部に運営を委託する可能性も検討される状況だった。 駒場には委託に抵抗を感じる学生もおり、単独での運営を継続するために整備を始めたのが、下記のシステム群である。
ATS-1型 | 2012年 | 第25回 | 部分的なサマリーシートの自動処理の実現 |
ATS-2型 | 2013年 | 第26回 | 書類解析の厳密かとウェブ書類受付の実現 |
ATS-3型 | 2014年 | 第27回 | 書類解析と暫定結果発表のリアルタイム化 |
ATS-4型 | 2017年 | 第30回 | 自動集計システムとコンテスト規約の分離 |
2013年には、交信記録を完全に自動処理できるATS-2型を試作し、悲願だった、締切から2日での結果速報を達成した。 2021年には、従来のALLJA1コンテストに加え、JS2FVOらの発案でリアルタイムコンテストの運営業務にも対応した。
ATS-4型では、参加可能な部門や得点計算を汎用的なスクリプト言語で記述する。以下にRubyによる定義の例を示す。
require 'rules/ats'
RULE = ProgramATS.new('CQJA', 'JA1RL', 'cq@jarl.com', 'jarl.com', 4, 1, DayOfWeek::SUNDAY)
RULE.add(SectionATS.new('14MHz PH', [Band.new(14000)], [Mode.new('SSB'), Mode.new('FM')]))
RULE.add(SectionATS.new('21MHz PH', [Band.new(21000)], [Mode.new('SSB'), Mode.new('FM')]))
RULE.add(SectionATS.new('28MHz PH', [Band.new(28000)], [Mode.new('SSB'), Mode.new('FM')]))
RULE.add(SectionATS.new('50MHz PH', [Band.new(50000)], [Mode.new('SSB'), Mode.new('FM')]))
RULE
複雑な規約の場合は、LISPを使う例もある。なお、規約の移植の依頼や、ATS-4型の環境構築の質問は、Issuesで承る。
(setq RT (contest "REAL-TIME CONTEST"))
(SinOp cities (SinOp? band? time? area? MORSE?))
(SinOp cities (SinOp? band? time? area? PHONE?))
(SinOp cities (SinOp? band? time? area? CW/PH?))
(MulOp cities (MulOp? band? time? area? MORSE?))
(MulOp cities (MulOp? band? time? area? PHONE?))
(MulOp cities (MulOp? band? time? area? CW/PH?))
我が無線部では、開催後の書類受付の要領を抜本的に見直し、書類の曖昧性を排除して、自動処理する方法を模索した。 日本国内のコンテストでは、JARLが推奨するサマリーシートを、電子メールに添付して提出する方法が標準的である。
<SUMMARYSHEET VERSION=R2.0>
<CALLSIGN>JA1ZLO</CALLSIGN>
<TOTALSCORE>64</TOTALSCORE>
<CONTESTNAME>ALLJA1</CONTESTNAME>
<CATEGORYCODE>XMAH</CATEGORYCODE>
<LOGSHEET TYPE=ZLOG>
mon day time callsign sent rcvd multi MHz mode pts memo
6 1 0932 JA1YAD 100110 59100110 100110 14 SSB 1
6 1 0956 JA1YYE 100110 5913009 13009 28 SSB 1
6 1 1002 JA1YXP 100110 59134404 134404 50 AM 1
6 1 1027 JR1ZTT 100110 591420 1420 21 SSB 1
6 1 1629 JA1YCG 100110 59110109 110109 7 SSB 1
6 1 1637 JA1YDU 100110 5991216 1216 7 CW 1
6 1 1717 JA1ZGP 100110 5991009 1009 7 CW 1
6 1 1738 JA1YGX 100110 59100105 100105 7 SSB 1
</LOGSHEET>
</SUMMARYSHEET>
交信記録に加え、参加者の氏名や連絡先に、参加部門を記載する。しかし、曖昧性が高く、自動処理には不適切である。 例えば、ATS-1型の開発段階では、参加部門を確定する際に、その曖昧さ故に、稚拙な判別方法を採用する必要があった。
電信と電話の判別 | 要素CATEGORYNAMEの値に語「電話」があれば電信電話部門 |
運用エリアの検査 | 要素CATEGORYNAMEの値に語「内」があれば関東エリア部門 |
社団と個人の判別 | 要素CATEGORYNAMEの値に語「マルチ」があれば社団局部門 |
また、交信の日時や相手や周波数を記載したLOGSHEETの部分には、規格化された書式がなく、実質的には自由欄だった。 交信を記録するソフトウェア毎に独自の書式が乱立して、構造や属性の形式的な定義も提供されず、曖昧な状態である。
<LOGSHEET TYPE=JA1ZLO-ORIGINAL-FORMAT>
属性には、複数の解釈の余地があり、以下の2行は、規約次第で、同じ意味になる場合も、異なる意味になる場合もある。
2015-06-07 09:01 JA1YWX 100105
2015-06-07 09:01 JA1YWX 59100105
国際的なコンテストの場合は、交信記録の書式を厳格に規定した事例があり、CabrilloやADIFが代表的な書式である。 前者はコンテスト毎に詳細が異なり、交信を記録するソフトウェア側で個別のコンテストの書式に対応する必要がある。
START-OF-LOG: 3.0
CALLSIGN: JA1ZLO
QSO: 7000 CW 1919-08-10 0364 JA1ZLO 599 114514 JA1YWX 599 889464 0
QSO: 7000 CW 1919-08-10 0364 JA1ZLO 599 114514 JA1YWX 599 889464 0
後者は、規格が厳密で拡張性もあるが、名前空間の概念がなく、独自に定義された属性の名前が重複する可能性がある。 独自定義の属性を自動的に検証する仕組みも、参加部門の曖昧さを解決する仕組みもなく、運用次第では曖昧さが残る。
<CALL:6>QI1JDS<QSO_DATE:8>20170604<time_on:6>000000<MODE:2>CW<band:3>10m<RST_RCVD:3>599<SRX:4>1005<eor>
<CALL:6>QD2LVE<QSO_DATE:8>20170604<time_on:6>000100<MODE:2>CW<band:3>20m<RST_RCVD:3>599<SRX:4>1336<eor>
第2章で提起した問題意識から、我が無線部ではウェブ提出の仕組みを構築して、電子メールでの書類受付を廃止した。 ATS-3型の開発では、PCの操作が苦手な参加者に配慮して、無駄な画面遷移を排除し、ユーザビリティの確保に努めた。
参加者は交信記録を準備して、ATS-4型にアクセスする。書類提出のボタンを押すと、Fig. 3.1に示す画面が表示される。 呼出符号や連絡先を記入し、運用場所と部門を選ぶ。第3.2節に解説する手順で交信記録を添付し、提出のボタンを押す。
Fig. 3.1 entry sheet.
必要な情報が空欄の場合は、赤字で表示されるので、修正して提出する。この仕組みにより、書類の曖昧さが排除できる。 なお、JARLが推奨するサマリーシートとは異なり、宣誓欄や資格や署名などの記入欄を削除して、画面を簡素化した。
第3.1節で必要な情報を記入した後で、Fig. 3.2に示すファイル選択画面で、交信記録を添付して、提出のボタンを押す。 これで、種類提出は完了である。登録内容を確認する画面が表示され、誤りがあれば、締切までに何度でも再提出できる。
Fig. 3.2 upload form for the operational log.
ATS-4型は、交信記録の書式を自動的に判別する機能を備える。以下の書式に対応済みで、殆どの交信記録を網羅する。 自動判別の精度の都合で、CTESTWINの場合はLG8を、zLogの場合はZLOを、それ以外の場合はADIFを推奨する。
形式言語型 | qxml, ADIF |
バイナリ型 | CTESTWIN(LG8), zLog(ZLO) |
テキスト型 | CTESTWIN(TXT), zLog(TXT), zLog(ALL), Cabrillo(CQWW), JARL R2.0 |
参加者の便宜を図るため、JARLが推奨するサマリーシートの提出にも対応したが、LOGSHEET以外の内容は無視される。 また、確実に読み取れる保証がなく非推奨だが、各種のソフトウェアが出力するプレーンテキストの書式にも対応した。
(zLog DOS)
MM dd HHmm CCCCCCCCCC SSSSSSSSSSSS RRRRRRRRRRRR ****** BBBBB EEEE *** NNNN
6 4 0117 QV1DOK 599100110 599120103 14 CW 1
6 4 0151 QC2SOA 599100110 5991308 50 CW 1
(zLog ALL)
yyyy/MM/dd HH:mm CCCCCCCCCCCC sss SSSSSSS rrr RRRRRRR ***** ***** BBBB EEEE ** NNNN
2017/06/04 01:17 QV1DOK 599 100110 599 120103 120103- 14 CW 1
2017/06/04 01:51 QC2SOA 599 100110 599 1308 1308 - 50 CW 1
(CTESTWIN)
**** MM/dd HHmm CCCCCCCCCCC BBBBBBB EEEE SSSSSSSSSSSS RRRRRRRRRRRR
1 6/ 4 0117 QV1DOK 14MHz CW 599100110 599120103
2 6/ 4 0151 QC2SOA 50MHz CW 599100110 5991308
y | 年 |
M | 月 |
d | 日 |
H | 時 |
m | 分 |
C | 呼出符号 |
B | 周波数帯 |
F | 周波数 |
E | 変調方式 |
S | 送信符号 |
R | 受信符号 |
s | 送信RST |
r | 受信RST |
O | 運用者名 |
N | 備考 |
* | 無視 |
以上のプレーンテキストの書式は、固定長の書式か、備考欄のみ可変長の書式と見做しベストエフォートで処理される。 なお、JARLが2016年に改訂したサマリーシートR2.0のLOGSHEETの部分は、可変長とする。+は任意長の反復を表す。
(jarl)
yyyy-MM-dd HH:mm B+ E+ C+ s+ S+ r+ R+
書類提出が終わると、自動集計システムは、内容を簡単に検査して暫定の得点を計算し、参加者に確認画面を送り返す。
(1) general profile.
(2) temporary score.
(3) operational log.
Fig. 3.3 submission certificate.
参加者は、交信記録が適切に処理された旨を自分で確認する必要がある。必要なら、締切までに修正して再提出できる。
WindowsやUNIX系OSでDockerを導入し、bashで以下のコマンドを実行すると、ATS-4型がlocalhostで起動する。
cat << EOS > docker-compose.yaml
version: '3'
services:
ATS4:
image: ghcr.io/nextzlog/ats4:master
ports:
- 9000:9000
volumes:
- ./ats/data:/ats/data
- ./ats/logs:/ats/logs
- ./ats.conf:/ats/conf/ats.conf
- ./rules.rb:/ats/conf/rules.rb
command: /ats/bin/ats4
www:
image: nginx:latest
ports:
- 80:80
volumes:
- ./proxy.conf:/etc/nginx/conf.d/default.conf
EOS
echo -n 'enter mail hostname: '; read host
echo -n 'enter mail username: '; read user
echo -n 'enter mail password: '; read pass
echo -n 'enter server domain: '; read name
cat << EOS > ats.conf
play.mailer.host=$host
play.mailer.port=465
play.mailer.ssl=true
play.mailer.user="$user"
play.mailer.password="$pass"
play.mailer.mock=false
ats4.rules=/rules.rb
EOS
cat << EOS > rules.rb
require 'rules/ats'
RULE
EOS
cat << EOS > proxy.conf
server {
server_name $name;
location / {
proxy_pass http://ATS4:9000;
location ~ /admin {
allow 127.0.0.1;
deny all;
}
}
}
EOS
docker compose up -d