ATS-4 เป็นระบบการยอมรับและการจัดตารางอัตโนมัติสำหรับการแข่งขันสมัครเล่นสมัครเล่นโดยใช้ QXSL อย่าลังเลที่จะเยี่ยมชม Allja1 ATS-4
มีภาพนักเทียบท่า วางสคริปต์ทั้งหมดต่อไปนี้ลงในเทอร์มินัลแล้วเรียกใช้
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 แน่นอนคุณสามารถระบุกฎที่แตกต่างกันได้โดยการติดตั้งไฟล์ทับทิมภายนอกลงในคอนเทนเนอร์ ดู ats.rb ตัวอย่าง
สุดท้ายสร้างคอนเทนเนอร์ดังนี้:
$ docker compose up -dเข้าถึง 80 พอร์ตของคอนเทนเนอร์
หยุดและถอดคอนเทนเนอร์ดังนี้:
$ docker compose downดึงภาพล่าสุดดังนี้:
$ docker pull ghcr.io/nextzlog/ats4:masterคุณสามารถเปลี่ยนรหัส Scala และการกำหนดค่าโดยไม่ต้องเริ่มต้นใหม่โดยเริ่มต้น ATS-4 ในโหมดการพัฒนาดังนี้:
$ sbt runจากนั้นเข้าถึง http: // localhost: 9000/admin/shell เพื่อพัฒนากฎการประกวดแบบโต้ตอบ คุณสามารถทดสอบอัลกอริทึมการให้คะแนนได้โดยการแนบข้อมูล QSO กับแบบฟอร์มเว็บ
ATS-4 ให้บริการสตรีมมิ่ง API สำหรับการแข่งขันแบบเรียลไทม์
ผู้เข้าร่วมการประกวดจะลงทะเบียนข้อมูลบัญชีของพวกเขาด้วย ATS-4 ล่วงหน้า ATS-4 ส่งคืนคีย์ความปลอดภัย (UUID) โดยส่งคำขอ GET ไปที่ http://localhost:8873?id=<UUID> ลูกค้าอาจดึงคีย์โดยการฟังในพอร์ต 8873 และการเข้าถึง /agent/<UUID>
เมื่อการแข่งขันเริ่มต้นไคลเอนต์จะเชื่อมต่อกับเซิร์ฟเวอร์ผ่าน WebSocket เสมอ ทุกครั้งที่ผู้เข้าร่วมติดต่อผู้เข้าร่วมรายอื่นในอากาศไคลเอนต์จะส่งความแตกต่างในบันทึก QSO ไปยังเซิร์ฟเวอร์ ข้อความจากไคลเอนต์ไปยังเซิร์ฟเวอร์จะต้องทำตามรูปแบบด้านล่าง
| ตำแหน่ง | สนาม |
|---|---|
| ไบต์ที่ 1 | จำนวนการลบ QSOS |
| ลำดับ | ส่วนหัวของข้อมูล QSO |
| ลำดับ | qso เอนทิตีในการลบ |
| ลำดับ | qso เอนทิตีที่จะต่อท้าย |
ไบต์ที่สองและที่ตามมาของข้อความจะถูกจัดรูปแบบเป็นไฟล์บันทึกอิเล็กทรอนิกส์เดียว รูปแบบจะต้องได้รับการสนับสนุนอย่างเป็นทางการโดยไลบรารี QXSL
เซิร์ฟเวอร์ได้รับบันทึก QSO ทำคะแนนรอสักครู่จากนั้นจะแจ้งลูกค้าทั้งหมดของการอัปเดตคะแนน ข้อความ JSON จากเซิร์ฟเวอร์ไปยังไคลเอนต์มีการจัดรูปแบบดังนี้:
{
"14MHz" : [
{ "call" : " JA1ZLO " , "score" : 200 , "total" : 2200 },
{ "call" : " JA1YWX " , "score" : 100 , "total" : 2100 }
]
}ไคลเอนต์ WebSocket แบบง่ายสำหรับ ATS-4 อาจเขียนได้ดังนี้:
<!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 ติดตาม @nextzlog บน Twitter
無線部開発班
โปรแกรมนี้เป็นซอฟต์แวร์ฟรี: คุณสามารถแจกจ่ายใหม่และ/หรือแก้ไขภายใต้ข้อกำหนดของใบอนุญาตสาธารณะ GNU ทั่วไปที่เผยแพร่โดย Free Software Foundation ไม่ว่าจะเป็นเวอร์ชัน 3 ของใบอนุญาตหรือ (ตามตัวเลือกของคุณ) รุ่นใหม่ ๆ
โปรแกรมนี้มีการแจกจ่ายด้วยความหวังว่าจะมีประโยชน์ แต่ ไม่มีการรับประกันใด ๆ โดยไม่มีการรับประกันโดยนัยเกี่ยวกับ ความสามารถในการค้าหรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดูใบอนุญาตสาธารณะ GNU ทั่วไปสำหรับรายละเอียดเพิ่มเติม
คุณควรได้รับสำเนาใบอนุญาตสาธารณะ GNU ทั่วไปพร้อมกับโปรแกรมนี้ ถ้าไม่ดู http://www.gnu.org/licenses/