ブログトップ 記事一覧 ログイン 無料ブログ開設

JF1DIR業務日誌 このページをアンテナに追加 RSSフィード

電子工作・オーディオクラフト・アマチュア無線・コンテスト・BCL
プロフィールはこちら

2016-11-23 東京UHFコンテスト参加

東京UHFコンテスト参加

| 東京UHFコンテスト参加を含むブックマーク 東京UHFコンテスト参加のブックマークコメント

本日も例年通り東京UHFコンテストに参加しました。

毎年ぼやいているかもしれませんが、祝日に開催しているせいで、違法モービル局からの妨害に参りました。特に高台からやっているとほぼ全ての周波数(430.000から439.980までほとんど)で聞こえてくるので、困ったものです。特に今年はひどい妨害を受けました。

去年は都外430MHz部門で2位を頂いたので、そろそろマルチバンドへ進出しようと、430と1200MHzだけですが、アンテナとリグを持参して高台に登って運用しました。430MHzはRadixの5エレ、1200MHzは改造7エレ八木、リグはそれぞれFT-857(10W)とDJ-G7(1W)です。1200MHzはFMのみの運用となりました。

f:id:WideR:20161123192532p:image

開始早々、Running周波数の確保に失敗。メインからだいぶ離れたところなのかレートが悪くスタートダッシュに失敗します。早々にS/Pに回りなんとかレートを60Q/h台に載せましたが不本意。次に1200MHzへQSYしますが、設備が貧弱なためかS/Pではパイルに負けてしまってイマイチ。適当なところでRunningすると、設備の割りと呼ばれました。1200MHzでTK UHFに参加するのは初めてなので新鮮です。次に430MHz CWへQSYするとこれも結構呼ばれます。このコンテストは電信部門がないので(全て電信電話部門)CWをやるひとはあまり居ないはずなのですが・・・。すぐに呼ばれなくなるので430MHz FMへ行くのですが、相変わらず周波数の空きがなく満足に運用できない状態が続きました。1200MHz FMと430MHz SSBやCWへ行ったり来たりがしばらく続きました。

ラスト1時間になって433.080MHzという絶好の周波数を確保することができ(違法モービルから執拗な妨害を受けたけど)ラストスパートをかけなんとかスコアメイクできたようです。やはりRunning周波数は大事ですね。最終的には、313QSO(473pts)(マルチ内緒)となりました。


ハイライト

  • 雨が振りそうなWXだったけど、なんとか(運用中は)持ってくれた。
  • 1200MHzのコンテスト運用は久々なのでちょっと新鮮。DJ-G7大活躍。
  • CWが意外に呼ばれて楽しかった。もちろん昼ごはんタイムCW叩きながら。
  • ノートPCの電源がいつもは持たないので超節約モードで動作したら余裕で6時間持った。

●ローライト

  • DJ-G7の電源ケーブルを忘れた。内蔵バッテリーだけでなんとか持ってくれた。
  • リュックからFT-857を取り出すと、なんとセレクトつまみの軸が折れている。リグのファンクションを変えるのが極めて困難。FT-817もそうだけどこの機種の最大の弱点がこの軸(汗)。過去に3度ほど折っている。
  • 突如CTestWinが動かなくなる。なにか文字を入力すると強制終了に。再起動しても直らない。仕方ないので、4G接続が不安定な移動先でテザリング接続し最新バージョンのCTestWinをダウンロードし、古いのをアンイストールし、別のフォルダに再インストールするとなんとか直った。ダウンロードと再設定やらなにやらで30分以上ロスし、12時台は30Q/hしかできなかった。
  • 撤収時に雨が降ってきた(下山したらすぐに止んだ)。

f:id:WideR:20161123192547p:image

といつもながらトラブル多発でしたが(汗)、去年実績の2位のスコアになりました。各局QSOありがとうございました。

JA1UOA/1JA1UOA/1 2016/11/24 23:11 今回も大山からQRVしましたが、スタートの遅れと430MHzの不法局が昨年より多く全くQSO数を稼げませんでした。(弱い局が全てつぶされてしまう) 残念! 430MHz帯の不法局は何とかならないですかね・・・? 430MHz帯のFMは今後コンテスト利用から外すべきかも???

7K3DIW7K3DIW 2016/11/25 08:55 11県の山岳移動2局が都外430に出てなかった?とは。今年は豪雪で「関東U」にも山から参加出来ないか。

WideR(JF1DIR)WideR(JF1DIR) 2016/11/25 20:19 >UOAさん
いつもお世話になっております。大山山頂からでしたか、お疲れ様でした。祝日ではなく日曜日開催にしてくれれば良いのですがね。またよろしくお願いします。
>DIWさん
今回はマルチバンドに出てみました。さてどうなることやら。DIW今回はお休みだったんですね。お大事に。

JA1OTPJA1OTP 2016/11/25 20:41 交信ありがとうございました。
私も開始早々から無変調をかけられましたが、30分ほどでいなくなりました。
日曜日以外の祝日は不法局が多く、コンテストも非常にやりにくいですよね。
主催者には開催日の変更も視野に入れていただきたいと思います。

JG1SNX/1JG1SNX/1 2016/11/26 10:24 東京UHFではお世話になりました。
当方2.5Wハンディだったので、違法局の被りにはお相手さんのほうが苦労されたようです。
とはいえ、それを理由にコンテストの日取りを変えるのは、結果的に違法局を蔓延させることになってしまいますよね。我々は免許あるので正々堂々と運用して、違法局を締め出しましょう。

WideR(JF1DIR)WideR(JF1DIR) 2016/11/29 05:00 >OTPさん
いつも交信ありがとうございます。とくにロケの良いところからだと不法局との戦いがコンテストの勝敗を決めると言ってもよいでしょう(苦笑)。困ったものですね。
>SNXさん
QSOありがとうございました。その辺が難しいですね。
SSB帯の活用も一考に値すると思います。今回は常に数局出ていました。

2016-11-22 泉州サバイバルマラソンコンテスト参加

泉州サバイバルマラソンコンテスト参加

| 泉州サバイバルマラソンコンテスト参加を含むブックマーク 泉州サバイバルマラソンコンテスト参加のブックマークコメント

数ある国内コンテストの中でもかなり異色な雰囲気がある泉州サバイバルマラソンコンテストに今年も参加しました。11/10〜20と11日間あるマラソンコンテストなのですが、平日はあまり乗り気がせずほとんど運用しませんでした。代わりに会期中に2回ある日曜日に高台へ移動して固めて運用してきました。従って、日数マルチはさっぱりなわけです。

ばっさばっさと捌いていくコンテストスタイルではなく、ちょっと雑談を挟みながらのんびりとやるのがこのコンテストのスタイル。なので、日曜日に固めて数多くQSOするというのは、ちょっと難しかったです。それでも約300QSOは日曜日だけで稼ぎました。

といはいえ、いつもはとは違った雰囲気が楽しめました。今年は1st QSOの方も多くいらしゃって(多くは復活再開局のようです)とてもFBでした。また2m各局来年(?)よろしくお願いします。

f:id:WideR:20161123185135p:image

以前から気になっていたのですが、LRT局が指摘しているとおり、EMEや非TEST局とのQRMを避けるため、このコンテストもJARLコンテスト周波数に従ったほうが良いのではと思いました。意見箱に書いておきます。

2016-11-12 Pandasでログ統計処理スクリプト

Pandasでログ統計処理スクリプト(その1)

| Pandasでログ統計処理スクリプト(その1)を含むブックマーク Pandasでログ統計処理スクリプト(その1)のブックマークコメント

特にブログに書くことがなくネタ切れであります。今回はコンテストでもなく移動運用でもなく自作ネタでもない、ソフトウエアの話題にしましょうか。

長年無線運用をやっていて交信ログがある程度の量になってくると、交信統計というのをやってみたくなるものです。例えば、バンドモードごとやDX/国内エリア別の交信数の統計は運用スタイルやアクティビティを反映するものなので分析するとなかなか興味深いものです。

Turbo HAMLOGやCTestWinなどのログソフトでも統計分析が可能ですが、細かいところには手が届いていません。例えば、移動局と固定局の割合を調べたり、記念局の交信数を調べること(簡単には)できないようになっています。ログデータを解析するのはさほど難しくないので、PerlRuby, Pythonなどの文字列解析が得意なスクリプト言語に親和性のある方は、自分で解析スクリプトを作るのが良いかと思いますし、当局もRubyPythonの勉強がてら分析スクリプトを自分で作っています。

実際にプログラミングしたり開発環境を調べているとデータ分析用のライブラリとして有名なPandasを使うとなかなか便利だということに気が付きました。PandasはPythonで動作するデータ解析支援ライブラリで、科学技術数値データを扱うときに便利です。今回は交信ログの解析に使うので、かなりもったいない使い方ではありますが、後に述べるようにメソッドが充実しているので、こちらのプログラミングが非常に楽になります。せっかくですから最新プログラミングツールを無線活動に活用してみましょう。では例を少しお見せしたいと思います。

データはTurbo HAMLOGのCSV形式とします。CTestWinが出力するHAMLOG形式でもOKです。ご自分の交信ログからCSV形式でログを変換してみてください。他のログソフトでも少しカスタマイズすれば使えます。

次にPythonの開発環境を手に入れてください。WindowsMacでも良いですが、Unix(Linux)のほうがいろいろと便利です。Pythonバージョン2と3があるのですが、2でもOKですが、できれば3を選んでください。

次に、IPythonを用意してください。Pythonのインタラクティブツールで、これがあると割と便利です。IPythonも(できれば)バージョン3を選んでください。次にライブラリのPandasも必要となります。これらツールとライブラリはPIPで入手できます。すでにインストールされているライブラリシェル上でこのようにして確認できます。

~$ pip3 list

pandasがこのリストに含まれていなかったら、

~$ pip3 install pandas

としてお使いの環境にPandasをPython3用にインストールしてください。

次に、以下のスクリプトをlogstat.pyという名前のファイルセーブします。そのスクリプトと同ディレクトリにHAMLOGのcsvファイルを置いておきます。

# logstat.py
import sys
import re
import pandas as pd
from datetime import datetime, timedelta

columns_list = ['call', 'datetime', 'time', 'urrst', 'myrst', 'freq',
                'mode', 'jcc', 'gl', 'qsl', 'name', 'qth', 'urnr', 'mynr', 'rem3']
log = pd.read_csv(sys.argv[1], names=columns_list)

シェル上で、ipython3を実行します。

~$ ipython3
Python 3.5.2 (default, Sep 10 2016, 08:21:44) 
Type "copyright", "credits" or "license" for more information.

IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: 

となるので、先のスクリプトCSVログファイル(2012WPXCW.csv)を指定して実行します。

In [1]: run logstat.py 2012WPXCW.csv

In [2]: 

となると成功。次にインタラクティブモードログデータをいろいろ見てみましょう。log.head()はログデータ(2次元データフレーム)の先頭5行を表示するメソッド

In [2]: log.head()
Out[2]: 
     call  datetime    time  urrst  myrst  freq mode  jcc  gl qsl  name  qth  \
0   HS7AT  12/05/26  04:04U    599    599  21.0   CW  NaN NaN   J   NaN  NaN   
1    R9UT  12/05/26  04:13U    599    599  21.0   CW  NaN NaN   J   NaN  NaN   
2  E21EIC  12/05/26  04:14U    599    599  21.0   CW  NaN NaN   J   NaN  NaN   
3    NH2T  12/05/26  04:15U    599    599  21.0   CW  NaN NaN   J   NaN  NaN   
4    PT5T  12/05/26  04:16U    599    599  21.0   CW  NaN NaN   J   NaN  NaN   

   urnr  mynr  rem3  
0     1   137     8  
1     2    96     8  
2     3   236     8  
3     4   559     8  
4     5   471     8  

In [3]: 

このように正しくCSVファイルを読み込んでpandasのデータフレームにおさめられていることがわかります。なお、これはCTestWinから出力させたCSVファイルの例で、HAMLOGから直接出力したものだとちょっと異なるかもしれませんので、カラム名などを適当にアレンジしてみてください。

・・・つづく・・・

Pandasでログ統計処理スクリプト(その2)

| Pandasでログ統計処理スクリプト(その2)を含むブックマーク Pandasでログ統計処理スクリプト(その2)のブックマークコメント

pandasを使うとたった一行でCSV形式のログファイルをデータフレームに収めることができます。データフレームは行と列のインデックスで管理するExcelファイルのようなものです。まずはQSO数を確かめてみましょう。これはデータフレームの行数を調べれば良いので、

In [3]: len(log)
Out[3]: 500

などとします。他にもやり方がありますので調べてみてください。

さて、HAMLOG形式の文字列を取り込んでいるので不都合なことがあります。それは時刻です。'datetime'と'time'という列インデックスにとりあえず日付と時刻を当てはめてみましたが、このままでは文字列データに過ぎないので、大小の比較などができません。またJSTとUTCが混在している場合もあります。そこで、以下のようなスクリプトUTCへ変換しかつdatetime形式にして'datetime'列に上書きしてしまいましょう。

date_list = log.datetime
time_list = log.time
datetime_list = []
for i, s in enumerate(date_list):
	date_str = s + '-' + time_list[i]
	logdate = datetime.strptime(date_str.rstrip('JZU'), '%y/%m/%d-%H:%M')
	if time_list[i].find('J') == 5:
		logdate = logdate - timedelta(hours = 9)
	datetime_list.append(logdate)
log.datetime = datetime_list
del log['time']; del log['jcc']; del log['gl']; del log['qsl']
del log['name']; del log['qth']; del log['rem3']

元のスクリプトlogstat.pyの後ろに上記スクリプトを書き加えてもう一度ipythonでrunさせます。log.head()でログデータの一部を見てみると、datetime列が若干変わっているはずです。GLやQTHなどの列もこの場合不要なのでdelコマンドで削除してしまいました。

In [5]: log.head()
Out[5]: 
     call            datetime  urrst  myrst  freq mode  urnr  mynr
0   HS7AT 2012-05-26 04:04:00    599    599  21.0   CW     1   137
1    R9UT 2012-05-26 04:13:00    599    599  21.0   CW     2    96
2  E21EIC 2012-05-26 04:14:00    599    599  21.0   CW     3   236
3    NH2T 2012-05-26 04:15:00    599    599  21.0   CW     4   559
4    PT5T 2012-05-26 04:16:00    599    599  21.0   CW     5   471

datetime列がpythonで時刻として扱える型になっています。確認したい場合は、列だけをリスト表示させます。長いのでやはり先頭の5つだけ表示させたいので、.head()をつけます。

In [7]: log.datetime.head()
Out[7]: 
0   2012-05-26 04:04:00
1   2012-05-26 04:13:00
2   2012-05-26 04:14:00
3   2012-05-26 04:15:00
4   2012-05-26 04:16:00
Name: datetime, dtype: datetime64[ns]

のようにリストの要素データの型がdatetime64となっているのを確認できます。

次に、コールサインからエリアを判別する関数call_area()を作っておいて(後述)、ログにあるコールを一つ一つその関数を呼び出してエリアの文字列リストを作って、データフレームに'area'という列を新しく作って、加えるということをします。

callarea_list = []
for c in log.call:
	callarea_list.append(call_area(c))
log['area'] = callarea_list
In [11]: log.tail(30).head()
Out[11]: 
       call            datetime  urrst  myrst  freq mode  urnr  mynr area
470    P40H 2012-05-27 09:33:00    599    599  14.0   CW   473  1742   DX
471  JA2VHO 2012-05-27 11:19:00    599    599   7.0   CW   474   706  JA2
472    K7RF 2012-05-27 11:20:00    599    599   7.0   CW   475   849   DX
473   N6WIN 2012-05-27 11:23:00    599    591   7.0   CW   476   440   DX
474    KT5J 2012-05-27 11:27:00    599    599   7.0   CW   477  1353   DX

のように、area列に日本のコールにはエリア、日本以外のコールにはDXと識別されたデータを付与しておきます。以上で、データの加工は終わりました。次からログデータの統計処理です。

・・・つづく・・・

Pandasでログ統計処理スクリプト(その3)

| Pandasでログ統計処理スクリプト(その3)を含むブックマーク Pandasでログ統計処理スクリプト(その3)のブックマークコメント

コールサイン文字列から国内エリアと日本以外の局を判別する関数です。あまり厳密な方法ではないです(例えば/MMゲストオペレータのコールなど)。python正規表現のマッチングがシンプルに書けないし、後方参照が仕方がまどろっこしいので困ったものです。

def call_area(callsign):
	jacall_re = re.compile('(^J[AD-S]\d)|(^[78][J-N]\d)')
	area_ja_re = re.compile('^J[AD-S](\d)')
	area_7_re = re.compile('^7[K-N][1-4]')
	area_7j_re = re.compile('^7J(\d)')
	area_8_re = re.compile('^8[J-N](\d)')
	area_jd1_re = re.compile('^JD1')
	call_sp = callsign.split('/')
	if len(call_sp) >= 2:
		if jacall_re.search(call_sp[0]):
			m_areanum = re.match('(\d)', call_sp[1])
			if m_areanum:
				area = 'JA' + m_areanum.group(1)
			else:
				area = 'DX'
		else:
			area = 'DX'
	else:
		if jacall_re.search(callsign):
			m_ja = area_ja_re.search(callsign)
			m_7 = area_7_re.search(callsign)
			m_7j = area_7j_re.search(callsign)
			m_8 = area_8_re.search(callsign)
			if m_ja:
				area = 'JA' + m_ja.group(1)
			elif m_7:
				area = 'JA1'
			elif m_7j:
				area = 'JA' + m_7j.group(1)
			elif m_8:
				area = 'JA' + m_8.group(1)
		else:
			area = 'DX'
		m_jd1 = area_jd1_re.search(callsign)
		if m_jd1:
			area = 'DX'
	return area

この関数を使って例えば、

In [12]: call_area('JF1DIR')
Out[12]: 'JA1'

In [13]: call_area('JF1DIR/9')
Out[13]: 'JA9'

In [14]: call_area('KH0/JF1DIR')
Out[14]: 'DX'

とエリアに対応する文字列を返します。前回の(その2)でこの関数を使って新たに'area'列にエリア文字列の列を作っておきました。

さて、ここからが本番です。

まずはこのログからどのバンドの運用があったのかを調べるのは、

In [15]: set(log.freq)
Out[15]: {3.5, 7.0, 14.0, 21.0, 28.0}

とします。log.freqでfreq列のリストが得られ、そのset(重複を除いたリスト)を表示させればよいのです。

次に、ログのすべてのデータから、エリア別の統計を取りたい場合は、

In [16]: log.area.value_counts()
Out[16]: 
DX     419
JA1     29
JA3     12
JA2     11
JA0      9
JA7      7
JA6      6
JA4      4
JA8      2
JA5      1
Name: area, dtype: int64

で得られます。python/pandasの偉いところはIPythonのインタラクティブ表示やスクリプト内のprint()文で表示させるとちゃんと整形されて表示されるということです。ちなみに、このメソッドの返り値はSeries型になっているので、

In [17]: a = log.area.value_counts()

In [18]: a[0]
Out[18]: 419

In [19]: a.index[0]
Out[19]: 'DX'

で個々の値に参照することができます。

例えば7MHzの運用分だけでエリア別統計を取りたい場合は、freq列にフィルターをかけてカウントします。

In [20]: log[log.freq==7].area.value_counts()
Out[20]: 
DX     59
JA1    16
JA2     7
JA3     6
JA0     5
JA7     5
JA4     1
JA6     1
JA5     1
Name: area, dtype: int64

QSO数だけならば、

In [21]: log[log.freq==7].area.count()
Out[21]: 101

でよいです。

QSO時間でログを切り取る、例えば、2012年5月26日18時〜24時までのデータだけを切り出す場合は、

In [22]: log[(log.datetime>=datetime(2012,5,26,18,0,0,0))&(log.datetime<datetime
    ...: (2012,5,27,0,0,0,0))]
Out[22]: 
     call            datetime  urrst  myrst  freq mode  urnr  mynr area
317  OL8R 2012-05-26 18:02:00    599    599  14.0   CW   319   645   DX
318  YT4W 2012-05-26 18:05:00    599    599  14.0   CW   320   970   DX
319  YL8M 2012-05-26 18:07:00    599    599  14.0   CW   321  1271   DX
320  HG7T 2012-05-26 18:09:00    599    599  14.0   CW   322   594   DX

のようにします。

call列をキーにログ全体をソートするには、

In [23]: log.sort('call').head()
Out[23]: 
       call            datetime  urrst  myrst  freq mode  urnr  mynr area
66    3V8BB 2012-05-26 06:25:00    599    599  21.0   CW    67   503   DX
33     3Z2X 2012-05-26 05:20:00    599    599  21.0   CW    34    68   DX
41    6M0NR 2012-05-26 05:32:00    599    599  21.0   CW    42   172   DX
165   6M0NR 2012-05-26 11:38:00    599    599   7.0   CW   167   192   DX
141  7J1YAJ 2012-05-26 10:55:00    599    599   7.0   CW   143  3039  JA1

ただし元のlogデータフレームには影響しない非破壊のメソッドです。

以上のようなデータフレームに対するメソッドを駆使すればやりたいことは大体出来てしまいます。位置から自分でプログラミングすると結構面倒ですが、上記メソッドスクリプト内に組み込んであげれば各種統計解析が可能となります。いかがでしょう?pythonの概念がわかってしまうと意外と簡単ですよね。

2016-09-19 10万QSO到達

10万QSO到達

| 10万QSO到達を含むブックマーク 10万QSO到達のブックマークコメント

本日でようやく開局以来通算10万QSOに到達しました。

今朝、仕事のある日なのですが、XPOコンテストが早朝から開催されていたので、出社時間まで少しだけ参加して50QSOほどログを積み上げました。なお、エリア別の内訳は、

  MHz   JA1     2     3     4     5     6     7     8     9     0    DX   S.T.
------------------------------------------------------------------------------
  1.9   115    28    29    17     3     2    20     3     4    11     0    232
  3.5  2158   858   887   472   162   212   440   131   130   426   134   6010
    7 15252  5993  7315  3018  1437  1824  3163   956  1029  1929  1349  43265
   10  3005  1269  1511   860   458   981   920   716   241   388   357  10706
   14   811   189   266   215   121   359   103   203    37    41  2283   4628
   18   501   153   262   145    69   147   101   103    24    40   489   2034
   21  1065   198   317   179    71   285   120   251    26    55  4077   6644
   24   257    70    77    59    32    76    27    37     4    20   117    776
   28   853    84    87    57    25    65    20    49     7    23   627   1897
   50  4926   224    57    28    13    65    74    63     4    15    17   5486
  144  5593   357    91    12     6     1    23   123     2    19     1   6228
  430 10338   389    71     7     7    13    29    12     2    17     0  10885
 1200   272    25     3     0     0     1     1     2     0     0     0    304
  SAT   384    99   208    49     7    27    41    38    20    15    18    906
Total 45530  9936 11181  5118  2411  4058  5082  2687  1530  2999  9469 100001
Number of unique callsign: 17573

と国内コンテストがメインになってきたので7MHzが特に多いようです。開局が2007年6月なので一日に平均すると約30QSOになりますね^^;

これからもQSOよろしくお願いします。

JG3JLC/NN1XJG3JLC/NN1X 2016/09/29 23:45 ぼくの10倍!

JH6RRRJH6RRR 2016/10/04 21:53  広瀬さん
10万QSOおめでとうございます
私も目指していますが、後何年かかるやら
ところで、過去多くの交信をしていただいていますが、少なくない数のカードが
迷子になってます

データをjarl.com宛は送れませんでた
再発行をお願いしたいので私宛に、メールを頂けませんか
折り返しそのアドレスにデータをお送りします

WideR(JF1DIR)WideR(JF1DIR) 2016/10/05 18:38 >JLCさん
いつもお世話になっております。最近はめっきりコンテスト中心ですが、またよろしくです。
>RRRさん
いつも交信ありがとうございます。カードの件、申し訳ありません。後ほどメールいたします。