Skip to content
logging and tabulation library for amateur radio operations
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore logging and tabulation library for amateur radio operations Apr 2, 2017
LICENSE logging and tabulation library for amateur radio operations Apr 2, 2017

qxsl: Hamradio Logging Library

image image

qxsl is a Java Library for Logging & Scoring & Regulation for Amateur-Radio Contests. qxsl is a vital component of Automatic Acceptance & Tabulation System (ATS)-4 for ALLJA1 contest.


  • qxsl provides log encoders/decoders for zLog, qxml, Cabrillo, etc.
  • qxsl provides tabulation & scoring framework for contests and awards.
  • qxsl provides a LISP engine named Elva, and contest rules can be described in modern S-expression styles.

Sample Codes

Because we are Scalalians, please be patient to read Scala codes!

Decoding & Encoding

If you don't know the log format in advance, write a program as follows:

import java.nio.file.Files
import java.nio.file.Paths
import java.util.List
import qxsl.model.Item
import qxsl.table.Tables

val path = Paths.get("Users", "foo", "allja1.ZLO")
val elog: List[Item] = new Tables().decode(Files.newInputStream(path))

import scala.collection.JavaConverters._

To specify the format, write as follows:

val elog = new Tables().getFormat("zbin").decode(Files.newInputStream(path))

To output the log into a file, write as follows:

new Tables().getFormat("qxml").encode(Files.newOutputStream(path), elog)

You can obtain a list of formats implemented by qxsl as follows:

val fmts = new Tables().asScala.toList

It should be noted that qxsl can detect format implementations automatically, via Java ServiceLoader mechanism.

Scoring for Awards & Contests

qxsl provides the script engine Elva and a rulemaking framework. qxsl contains the definition of ALLJA1 contest as a sample inside the JAR file. To use the predefined definition, write a program as follows:

import qxsl.ruler.Contest // contest
import qxsl.ruler.Section // section provided by contest

val contest: Contest = Contest.defined("allja1.lisp") // src/main/resources/qxsl/ruler/allja1.lisp
val section: Section = contest.getSection("1エリア内 社団 電信電話 オールバンド部門")

Then, you may summarize an operation list into a Summary object, which involves scores, accepted and rejected items:

import qxsl.ruler.Summary

val summary: Summary = section.summarize(elog) // List[Item]
println(summary.score) // sum of scores for accepted items
println(summary.mults) // multiplication of multipliers
println( // is score * mults


To define a new contest, utilize RuleKit class as follows:

import qxsl.ruler.RuleKit

val contest: Contest = new RuleKit().eval("""(contest "Scalalian Contest")""")



$ gradle build


Feel free to contact @nextzlog on Twitter.





  • This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License(LGPL) as published by the Free Software Foundation (FSF), either version 3 of the License, or (at your option) any later version.

  • This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See the GNU Lesser General Public License for more details.

  • You should have received a copy of the GNU General Public License and GNU Lesser General Public License along with this program. If not, see

You can’t perform that action at this time.