ATS-4は、QXSLに基づくアマチュアラジオコンテストの自動受容および集計システムです。 AllJa1 ATS-4に自由にアクセスしてください。
Docker画像が利用可能です。次のスクリプト全体を端末に貼り付けて実行します。
echo -n ' enter mail hostname: '
read host
echo -n ' enter mail username: '
read user
echo -n ' enter mail password: '
read pass
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
command: /ats/bin/ats4
environment:
TZ: Asia/Tokyo
ATS4_MAIL_HOST: $host
ATS4_MAIL_USER: $user
ATS4_MAIL_PASS: $pass
ATS4_MAIL_MOCK: false
ATS4_RULE_FILE: /rules/ats.rb
www:
image: nginx:latest
ports:
- 80:80
volumes:
- ./proxy.conf:/etc/nginx/conf.d/default.conf
EOS
echo -n ' enter server domain: '
read name
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次に、ブラウザにhttp:// localhostに向け、ATS-4が実行されていることを確認します。
まず、次のように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
command : /ats/bin/ats4
environment :
TZ : Asia/Tokyo
ATS4_MAIL_HOST : $host
ATS4_MAIL_USER : $user
ATS4_MAIL_PASS : $pass
ATS4_MAIL_MOCK : false
ATS4_RULE_FILE : /rules/ats.rb
www :
image : nginx:latest
ports :
- 80:80
volumes :
- ./proxy.conf:/etc/nginx/conf.d/default.conf次に、以下の指示に従ってください。
次のようにproxy.confを作成します。
server {
server_name localhost;
location / {
proxy_pass http://ATS4:9000;
location ~ /admin {
allow 127.0.0.1 ;
deny all ;
}
}
}許可されていないクライアントが/admin下の管理ページにアクセスできないことを確認してください。コンテナのポート80をインターネットに公開して、管理ページにアクセスできないようにします。
docker-compose.yamlで環境変数を次のように構成します。
environment :
ATS4_MAIL_HOST : $host
ATS4_MAIL_USER : $user
ATS4_MAIL_PASS : $pass
ATS4_MAIL_MOCK : false設定を適切に変更します。
docker-compose.yamlで環境変数を次のように構成します。
environment :
ATS4_RULE_FILE : /rules/ats.rb
# ATS4_RULE_FILE: /rules/1am.rb
# ATS4_RULE_FILE: /rules/ja1.rb
# ATS4_RULE_FILE: /rules/uec.rbもちろん、外部Rubyファイルをコンテナに取り付けることで、さまざまなルールを指定できます。たとえば、 ats.rbを参照してください。
最後に、次のようにコンテナを作成します。
$ docker compose up -dコンテナの80ポートにアクセスします。
コンテナを停止して削除します。
$ docker compose down次のように最新の画像を引き出します。
$ docker pull ghcr.io/nextzlog/ats4:master次のように、開発モードでATS-4を開始することで再起動せずにSCALAコードと構成を変更できます。
$ sbt run次に、http:// localhost:9000/admin/shellにアクセスして、コンテストルールをインタラクティブに開発します。 QSOデータをWebフォームに添付して、スコアリングアルゴリズムをテストできます。
ATS-4は、リアルタイムコンテストにストリーミングAPIを提供します。
コンテスト参加者は、事前にアカウント情報をATS-4に登録します。 ATS-4はhttp://localhost:8873?id=<UUID>にGETリクエストを送信することにより、セキュリティキー(UUID)を返します。クライアントは、8873ポートとアクセス/agent/<UUID>でリッスンしてキーを取得できます。
コンテストが開始されると、クライアントは常にWebSocketを介してサーバーに接続します。参加者が別の参加者に空中に連絡するたびに、クライアントはQSOレコードの違いをサーバーに送信します。クライアントからサーバーへのメッセージは、以下の形式に従う必要があります。
| 位置 | 分野 |
|---|---|
| 1番目のバイト | 削除されたQSOの数 |
| 順序 | QSOデータのヘッダー |
| 順序 | 削除するQSOエンティティ |
| 順序 | 追加するQSOエンティティ |
メッセージの2番目と後続のバイトは、単一の電子ログファイルとしてフォーマットされます。この形式は、QXSLライブラリで正式にサポートする必要があります。
サーバーはQSOレコードを受信し、スコアを付け、数秒待ってから、スコアアップデートのすべてのクライアントに通知します。サーバーからクライアントへのJSONメッセージは、次のようにフォーマットされます。
{
"14MHz" : [
{ "call" : " JA1ZLO " , "score" : 200 , "total" : 2200 },
{ "call" : " JA1YWX " , "score" : 100 , "total" : 2100 }
]
}ATS-4の単純なWebSocketクライアントは、次のように記述できます。
<!DOCTYPE html >
< html lang =' ja ' >
< head >
< title > ATS-4 </ title >
< script type =" application/javascript " src =" client.js " > </ script >
</ head >
< body >
< h1 > Streaming Demo </ h1 >
< textarea cols =' 160 ' rows =' 30 ' id =' QSOs ' > </ textarea >
< p >
< label > Delete < input type =' number ' id =' trim ' min =' 0 ' max =' 255 ' value =' 0 ' > QSOs, </ label >
< label > Submission Key: < input type =' text ' id =' UUID ' placeholder =' /agent/UUID ' > </ label >
< button type =' button ' onclick =' access(); ' > Access </ button >
< button type =' button ' onclick =' submit(); ' > Submit </ button >
</ p >
< div id =' messages ' > </ div >
</ body >
</ html >参照されるJavaScriptプログラムは、次のように記述できます。
let sock ;
function access ( ) {
const uuid = document . getElementById ( 'UUID' ) . value ;
sock = new WebSocket ( 'ws://localhost:9000' + uuid ) ;
sock . binaryType = 'arraybuffer' ;
sock . onmessage = function ( msg ) {
const decoder = new TextDecoder ( ) ;
const data = decoder . decode ( new Uint8Array ( msg . data ) ) ;
const text = document . createTextNode ( data ) ;
const node = document . createElement ( 'div' ) ;
document . getElementById ( 'messages' ) . appendChild ( node ) ;
node . appendChild ( text ) ;
} ;
}
function submit ( ) {
const encoder = new TextEncoder ( ) ;
const QSOs = document . getElementById ( 'QSOs' ) . value ;
const trim = document . getElementById ( 'trim' ) . value ;
const data = new TextEncoder ( ) . encode ( QSOs ) ;
const full = new ( data . constructor ) ( data . length + 1 ) ;
full [ 0 ] = parseInt ( trim ) ;
full . set ( data , 1 ) ;
sock . send ( full ) ;
} Nextzlog/Todoでお気軽に問題を抱えてください。 Twitterで@nextzlogをフォローしてください。
無線部開発班
このプログラムはフリーソフトウェアです。FreeSoftware Foundationが公開しているGNU General Publicライセンスの条件、ライセンスのバージョン3、または(オプションで)後のバージョンのいずれかで公開されているように、それを再配布したり、変更したりできます。
このプログラムは、それが有用であることを期待して配布されますが、保証はありません。商品性や特定の目的に対するフィットネスの暗黙の保証さえありません。詳細については、GNU一般公開ライセンスを参照してください。
このプログラムとともに、GNU一般公開ライセンスのコピーを受け取る必要があります。そうでない場合は、http://www.gnu.org/licenses/を参照してください。