qxsl 規格がバラバラで使いにくいアマチュア無線の電子

アマチュア無線の電子ログのライブラリ
the logging library for hamradio operations and contests
無線部開発班
2015 年 12 月 27 日改訂
無線部
アマチュア無線の電子ログのライブラリ
開発班
はじめに
1
qxsl はフォーマットが乱立するアマチュア無線の電子ログを相互に運用するためのライブラリです。
入手方法
2
qxsl は下記のリポジトリにて LGPL*1 のもと頒布されています。
$ git clone git://git.pafelog.net/qxsl
qxsl.jar が本体ですが、利用には Java SE8 が必要です。仕様書は gradle*2 を利用して入手します。
$ gradle build javadoc
基本構成
3
qxsl には、Table 1 に示すパッケージが内蔵されています。この他にも、内部実装が含まれています。
Table 1 外部に公開されたパッケージ
名前
説明
qxsl.field
デフォルトで対応する属性を提供します。
qxsl.graph
交信記録文書のデータ構造を実装します。
qxsl.model
交信記録文書のモデル構造を実装します。
qxsl.sheet
交信記録を永続化する機構を提供します。
このうち、直接扱う機会が多いパッケージは model と sheet でしょう。graph は文書構造や属性値の
仕組みを提供するパッケージで、model や sheet の土台です。field は call や time などの汎用的な
属性を提供します。ただし、ここで定義された属性以外にも利用者が定義した任意の属性を扱うことが
できます。sheet は交信記録を読み取ったり書き出したりするためのインターフェースを定義します。
読み書き
4
以下に掲載したコードは Scala*3 で記述していますが、JVM 上で動く言語であれば、何でも構いません。
4.1
読み取り
下記のプログラムは、qxsl.sheet.LogSheetManager を用いて交信記録をファイルから読み込みます。
val format = new qxsl.sheet.LogSheetManager().getFormat("zlog.bin")
val document = format.decode(new java.io.FileInputStream("foo.zlo"))
このサンプルは、zLog バイナリファイル foo.zlo を読み込んで、変数 document に代入します。
*1
*2
*3
http://www.gnu.org/licenses/lgpl-3.0.html
http://gradle.org
http://www.scala-lang.org
2
無線部
4.2
アマチュア無線の電子ログのライブラリ
開発班
書き出し
下記のプログラムは、qxsl.sheet.LogSheetManager を用いて交信記録をファイルに書き出します。
val format = new qxsl.sheet.LogSheetManager().getFormat("rtcl")
format.encode(new java.io.FileOutputStream("bar.txt"), document)
このサンプルは、第 4.1 節で読み込んだ交信記録を RTCL テキストファイル bar.txt に出力します。
5
文書の構造
qxsl 内部では、交信記録を XML に似たツリー構造で表現します。構成要素を Table 2 に示します。
Table 2 交信記録の構成要素
名前
説明
qxsl.model.Record
単独の交信を記録します。
qxsl.model.Domain
交信をグループ化します。
Record は 1 回の交信を記録し、Domain は複数の Record 及び Domain を隷下に配置します。従って、
交信記録はツリー構造で保持することができます。Record は Table 3 に示す要素を隷下に配置します。
Table 3 相手局と交換した要素
名前
説明
qxsl.model.Rcvd
相手局が送信した情報です。
qxsl.model.Sent
相手局に送信した情報です。
Record・Domain・Rcvd・Sent は、何れも Tuple の派生クラスです。属性は Field の派生クラスです。
Table 4 属性と要素の実装クラス
名前
説明
qxsl.graph.Field
属性とその値を定義します。
qxsl.graph.Tuple
属性を定義可能な要素です。
上位・下位要素の取得や追加・削除の方法は、第 2 節の方法で入手した API 仕様書を参照してください。
6
属性の設定
Tuple 派生クラスのインスタンスには、属性を設定することができます。
val record = new Record
record.setField[Call,String](classOf[Call], new Call("JA1ZLO"))
record.setField[City,String](classOf[City], new City("100110"))
Console.println(record.getFieldValue(classOf[Call]))
Console.println(record.getFieldValue(classOf[City]))
3
無線部
アマチュア無線の電子ログのライブラリ
開発班
なお、qxsl.field パッケージで提供されている属性向けに専用のメソッド群も用意されています。
record.setCall(new Call("JA1ZLO"))
record.setTime(new Time(new Date))
Console.println(record.getCall)
Console.println(record.getTime)
7
機能の拡張
qxsl は、サービスプロバイダ機構を利用して、新たなフォーマットや属性に対応することができます。
7.1
フォーマットの追加
qxsl.sheet.LogSheetManager は、qxsl.sheet.LogSheetFormat を自動的に検出・登録します。
val manager = new LogSheetManager
for(format <- manager.getFormats) {
println(format.getName)
println(format.getDescription)
}
新たなフォーマットを追加するには、フォーマットの実装を jar ファイルに格納します。META-INF に
services ディレクトリを作成し、qxsl.sheet.LogSheetFormat ファイルを配置します。
qxsl.formats.zlog.all.ZLogRawFormat
qxsl.formats.zlog.txt.ZLogRawFormat
qxsl.sheet.LogSheetFormat ファイルには、フォーマットの実装クラスを上のように列挙します。
7.2
属性の追加
qxsl.field.FieldManager は qxsl.field.FieldFormat を自動的に検出します。qxsl が推奨する
qxsl 文書での利用に適しています。qxsl 文書は XML 文書であり、デコーダは属性名と属性値の対を
検出すると、FieldManager を用いて FieldFormat を検索します。FieldFormat は文字列を解析して
Field インスタンスを生成します。以上の処理は概ね下記のプログラムで実現します。
val name = new QName("qxsl.org", "mode", "qxsl"))
val mode = new FieldManager().getFormat(name).decode("SSB")
これは下記のプログラムと同等の結果をもたらします。
val mode = new Mode("SSB")
新たな属性を追加するには、第 7.1 節と同様に qxsl.graph.FieldFormat ファイルを記述します。
qxsl.support.field.BandFormat
qxsl.support.field.CallFormat
qxsl.support.field.ModeFormat
qxsl.support.field.TimeFormat
4