JF1DIR業務日誌(はてなblog版)

アマチュア無線局JF1DIRのアクティビティをつづっています。

ハムフェア参加しました

しばらく更新をさぼってしまいました。スミマセン。ネタはいろいろあるので、そのうちアップしていきます。

さて、先日行われたハムフェアに参加してきました。今年は仕事の都合で初日のみ参加しました。異様に涼しく過ごしやすかったですね。
今年もアイボール中心で楽しみました。コンテストでいつもお世話になっている局、SNSなどで仲良くしていただいている局などなど、ご挨拶できて大変FBでした。

いつもやっていることの一つに「ハムフェア公開記念局の運用」です。今年は「8J1HAM」というコールでした。8時過ぎに記念局受付の列に並ぶと既に7MHzと430MHzは全部予約済み。なんとか14時に144MHzの枠をゲットしました。殆どが会場内からのコールでしたがたくさんQSO頂きありがとうございました。

夜はJK1JHU青木さんが開催している「コンテスターミーティング」に今年も参加させていただきました。総勢50人以上集まり、例年通り大いに盛り上がりましたね(^^) その後、夜中の1時まで新橋を呑み歩いていました・・・^^;

今年のメーカーブースの目玉はICOMのIC-9700でしょうか。IC-910の後継的な位置付けのようで、楽しみですね。

ゲットしたブツはこちら。GHDの小型パドルは移動運用で使ってみようかと思います。ON4UNのローバンド本は原著も持っているのですが思わず日本語版も買ってしましました。

各局ありがとうございました。

ALL JAと東京コンテスト参加

先日作った記念局の運営と運用が忙しくて、なかなか更新できていませんでした。スミマセン^^;
ALL JAコンテストは二日目の朝から夕方までのちょこっとパート運用。天気が良かったので近くの高いところに行ってみました。でも一応入賞を企んだので、50MHz電信電話のQRP部門X50Pにしてみましたが、どうでしょうか。
アンテナはいつものRadix2エレでFT-857 5W + 10Ahリチウムバッテリー運用です。結果は、7時半ごろから16時なので約8時間ちょっとの運用で約400QSOなので、まぁまぁ楽しめました。Esが出ることがなくマルチに苦しみましたが、過去の実績からエリア入賞はなんとかできそうです。CW:Phone = 179:227QSOでした。

ゴールデンウィークとくっついてしまったせいか、参加局が少なめのようでしたね。16時でもう呼ぶ局がいなくなってしまったし、苦行になりそうになったのでサクっとやめました。がんばらないで楽しむのが肝心かと^^;

***

5/3に行われる恒例の東京コンテストも近くの高いところでの移動運用です。朝9時からのスタートは移動局にとっては本当にうれしいですネ。参加部門をどうしようかいろいろ悩みましたが、condxに左右されず運用しやすい144MHz電信電話にしてみました。アンテナはRadixの3エレをアルミポールと一緒に担いでの運用です。
スタートは電話からスタートダッシュを狙うのが常套ですが、コンテスト開始直前、SSB帯があまりにもQRMMだったので、CW Runningからスタート。悪くない滑り出しでレートが落ちはじめたころにS/P行かずに電話でRunningしてレートをキープしたつもりです。13時頃からなかなかNewが見つからず苦労しますが、モノバンドでは工夫のしようがあまりないので、S/PとRunを繰り返すのみ。どちらかというと電話を多めに運用したつもりです。CW:Phone = 96:132QSOでした。

去年実績の2位のスコアに付けたので期待出ると思います。CWだけの運用よりはMixの方が楽しいですね!喉が疲れますが・・・
各局たくさんのQSOありがとうございました。

8J1C70Y 茅ヶ崎市制施行70周年記念局

コールサインが確定したようなので(まだ正式にはJARLから連絡きてませんが)、茅ヶ崎市制施行70周年の記念局(JARL特別局)を立ち上げました。5/1より開局です。
そのWebサイトも本日公開しました。自宅のラズパイをサーバーにしております。

https://jf1dir.info/~eventst/

まだ工事中のページがありますがご了承下さい。また近日中にSSL化します。
たくさんのQSOよろしくお願いします。

(追補:4/22の朝にSSL化いたしました)

Raspberry PiでWebサーバーの諸設定(その2)

まだ設定が終わってなかったので、前回の続きを書いておきます。環境はRPi3にRaspbian 8.0/jessie(kernel 4.4.50-v7)、apache/2.4.10です。

FTPサーバーの設定

自宅サーバーを地元のハムクラブのWebページの引越し先にするという話になり、以前のWebページの管理者がFTPでファイルを転送する必要がでてきました。

$sudo apt-get install vsftpd

/etc/vsftpd.confを編集します。

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

次にユーザー設定ファイル/etc/vsftpd.chroot_listにFTPユーザーのリストを記載。
さらに、ルーターの静的マスカレード設定でftpのポートtcp20と21番を開けて、ファイアウォールの設定を許可し、デーモンをリスタート。

$sudo ufw allow 20
$sudo ufw allow 21
$sudo service vsftpd restart

BASIC認証を設定

Webのとあるページを仲間うちだけアクセスできるよう、パスワードをかけておく基本的な認証方式。やり方はいろいろあるようで、その一つのうまく行った例を上げておきます。
まずはパスワードファイル.htpasswdを作る。IDはfoobarとする。

$sudo htpasswd -c /etc/apache2/.htpasswd foobar

保存先を/etc/apache2になっているが場所は任意。パスワード聞かれるので答えるとファイルが生成される。
/etc/apache2/apache2.confの末尾に、

<Directory "/home/xxxx/public_html/">
AuthType Basic
AuthName "Please enter your ID and password"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
#AuthGroupFile /dev/null
</Directory>

としapache2をrestart。/home/xxxx/public_html/にアクセスしようとするIDとパスワードを求められるようになります。

let's encryptによるSSL

let's encryptで無料でSSL化できるということなのでやっておきした。https://でないWebは怖がってアクセスされないようです。
まずはルーターの443番ポートを静的マスカレード設定で開けておき、

$sudo ufw allow 443

ファイアウォールでも443番ポートを開けておく。GitでCertbotをCloneする。

$sudo apt-get install git
$cd /usr/share
$sudo git clone https://github.com/certbot/certbot
$cd certbot
$./certbot-auto

この時点でいろいろ聞かるけど、Ctrl+Dで一旦終了。証明書をもらう手続きをコマンドでやってしまう。独自ドメインだとまず問題なくもらえるらしいです。

$./certbot-auto certonly --standalone -d jf1dir.info -m jf1dir@jarl.com --agree-tos

/etc/apache2/sites-available/default-ssl.confを編集。

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/jf1dir.info/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/jf1dir.info/privkey.pem

SSLの設定を有効にしておく。

$sudo a2ensite default-ssl
$sudo a2enmod ssl
$sudo service apache2 restart

これでjf1dir.infoがSSL化されます。
なお90日で更新せよとメールが来ますので、certbotをインストールしたディレクトリに移動して、

$sudo service apache2 stop
$sudo ./certbot-auto renew
$sudo service apache2 start

これで更新できます。

NTPサーバとRaspberry Piの時刻同期

NTPデーモンの設定ファイルである/etc/ntp.confファイルを編集。

$ sudo nano /etc/ntp.conf

server 0〜4から始まる行をコメントアウトまたは削除し、"pool ntp.nict.jp iburst"を加える。

$ sudo service ntp restart

NTPデーモンを再起動します。"ntpq -p"で同期状態を確認できます。

Raspberry PiでWebサーバーの諸設定

先日Raspberry Pi3を導入し電子工作のツールとして使おうと考えていたのですが、立派なLinuxマシンを遊ばせておくのはもったいないと思い、また、とある必要性からWebサーバーに仕立て上げようと思い立ちました。他にLinuxマシンがあるのですが、あえてRPiで、ということでしょうか(汗)。
ここ数日Webサーバーの設定を済ませた後にラズパイをいじっているときにmicroSDカードを機械的に破損させるなどの事故があり、OSのインストールを2度繰り返す羽目になりました(苦笑)。来るべき3度目のため(?)に備忘録として設定の一部始終をここに書いておきます。初めての方にも参考になるかもしれませんが、ちゃんと動くかどうかの保証は致しかねます(汗)。なお、OSのバージョンはRaspbian JESSIE LITE 2017.4.10版、WiFiを使わずEthernet接続です。

起動前に非HDMIモニタへの対応

HDMI-VGA変換アダプタを使って非HDMIモニタにつなげる場合の設定。DDでmicroSDカードへOSのイメージを書き込んだ後に、RPiを起動する前に/boot/config.txtを編集してしまう。

hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
hdmi_group=2
hdmi_mode=39

これでVGAモニタに1360x768ピクセルの画面解像度で表示される。microSDをRPiに挿して電源を入れる。

raspi-configでいろいろ設定

RPiを起動後、ユーザー名pi、パスワードraspberryでログイン。対話型設定ソフトraspi-configでパスワード変更、host名変更、ローカライゼーション(タイムゾーン、キーボード設定)、インターフェイス設定(SSH有効化)、カードの拡張などを済ませておく。

$ip route

でRPiのローカルIPを確認。他のPCからSSHでログインを確認。これ以降、他の端末からSSH接続するので、キーボードやディスプレイをはずしておく。

キーボードのCTRLとCAPSを入れ替え

好みにより、CTRLキーとCAPSキーを入れ替える。/etc/default/keyboardを編集。

XKBOPTIONS="ctrl:swapcaps"

Xの設定っぽいけどこれで大丈夫。Xは使わないに。その後リブートして有効になる。

rootのパスワード変更

rootが無防備なのでまずはなによりパスワードを設定する。

$sudo passwd root

piユーザーを他のユーザー名(yuji)に変更。piでログインした状態で、

$sudo useradd -M foo
$sudo gpasswd -a foo sudo
$sudo passwd foo
$exit

fooでログインし、

$sudo usermod -l yuji pi
$sudo usermod -d /home/yuji -m yuji
$sudo groupmod -n yuji pi
$exit

yujiでログインし、fooを削除。

$sudo userdel foo
$sudo pass yuji

IPを固定化(イーサーネット)しておく

ip routeで確認したローカルIPが192.168.1.10とする。/etc/dhcpcd.confを編集。末尾に、

inteface eth0
static ip_address=192.168.1.10/24
static routers=192.168.1.0
static domain_name_servers=192.168.1.0

その後リブート、他の端末からSSHでログインしてチェックする。

Sambaをインストール

Windowsとファイル共有するときに便利なのでいれておく。

$sudo apt-get install samba

/home/yuji/sambaにWindowsのファイルが見えるようにする。
/etc/samba/smb.confを編集、末尾に、

[share]
path=/home/yuji/share
read only=No
browsaeble=Yes
guest ok=Yes
force user=yuji
$mkdir /home/yuji/share
$sudo service samba restart

でsambaをrestart(エラーが出る場合は、smbdとnmbdをrestart)。
Windowsエクスプローラで\\192.168.1.10を開くとshareのフォルダが見えるようになる。

RSA公開鍵認証方式でSSHログイン

クライアント側(Teratermなど)で鍵を作成。パスフレーズを入力し、Public keyとPrivate Keyのファイルを保存。それぞれ、
id_rsa.pub, id_rsaとする。id_rsa.pubをRPiへコピー。samba共有したフォルダにコピーしておく。サーバのRPi上で、

$mkdir ~/.ssh
$chmod 700 ~/.ssh
$mv ~/share/id_rsa.pub ~/.ssh
$cd ~/.ssh
$ssh-keygen -i -f id_rsa.pub >> authorized_keys

"uudecode failed."とエラーが出る場合は、

$ cat id_rsa.pub >> authorized_keys

とする。
/etc/ssh/sshd_configを編集

PermitRootLogin no
PasswordAuthentication no
RSAAuthentication    yes
PubkeyAuthentication yes
AuthorizedKeysFile   %h/.ssh/authorized_keys

sshをrestart。これでrootでログインできなくし、パスワード入力によるログインも禁止になり、セキュリティレベルが上がる。
クライアント(Teratermなど)でアクセスするとき、秘密鍵のファイルid_rsaを指定してログイン。鍵ファイルはRPi上には置かない。id_rsaなどのファイルはパーミッションを600に設定しておくこと。

Apache2インストール

$sudo apt-get install apache2

ブラウザでhttp://192.168.1.10をアクセスして"Work It!"の表示を確認。

$sudo a2enmod userdir

これで~/public_htmlの下にアクセスできるようになる。ブラウザでhttp://192.168.1.10/~yuji/public_html/test.htmlなどで表示させてチェック。

CGIの設定

~/public_html/cgi-binの下にあるPerlPythonプログラムを起動させるとする。

$sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load

/etc/apache2/sites-aviailable/000-default.confを編集。

Include conf-available/serve-cgi-bin.conf

/etc/apache2/mods-available/mime.confを編集し、CGIプログラムの拡張子を設定。

AddHandler cgi-script .cgi .py .pl

/etc/apache2/conf-available/serve-cgi-bin.confを編集。

ScriptAlias /cgi-bin/ /home/*/public_html/cgi-bin
                <Directory "/home/*/public_html/cgi-bin">

これで~/public_html/cgi-binの下のCGIプログラムが有効になる。
/etc/apache2/mods-available/userdir.confを編集

<Directory /home/*/public_html>
                AllowOverride FileInfo AuthConfig Limit
                Options MultiViews SymLinksIfOwnerMatch IncludesNoExec

OptionsにIndexesを取り去ると、ブラウザ上に(index.htmlがないディレクトリとかで)ディレクトリ構造が見えなくなる。
apache2をrestartすると反映されるので、~/public_html/cgi-bin/のプログラムをブラウザから起動させて確認。プログラムにはchmodしておく。

ポートの開放

光ルータにアクセス。ブラウザからhttp://192.168.1.1/を開く。
静的IPマスカレード設定で、ポート番号80と22を開いておく。この瞬間から世界中からSSHログイン攻撃が始まる。sudo lastbで確認できる。rootやpiのパスワードは絶対に設定しておくこと。
自宅IPのグローバルIPを把握する。

$curl httpbin.org/ip

このIPを別のネットワーク上の端末のブラウザで開いてみる。Apache2の設定のときの"Work It"の画面が出ることを確認。

ファイアーウォールの設定

SSH, WWW, Sambaのポートを許可する。それ以外を禁止。

$sudo apt-get install ufw
$sudo ufw disable
$sudo ufw default deny
$sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22
$sudo ufw allow 8080
$sudo ufw allow 80
$sudo ufw allow 137/udp
$sudo ufw allow 138/udp
$sudo ufw allow 139/tcp
$sudo ufw allow 445/tcp
$sudo ufw enable

SSHのポート22番はLAN内のアクセスに制限しているが、外からのログインもやりたい場合はufw allow 22とする(ただし外からのSSH攻撃に会うので、セキュリティ対策をしっかりしておくこと)。
ファイアーオールの設定は$sudo ufw statusで確認。

MyDNS.jpのDDNS更新をcronで行う

独自ドメインを取得し、MyDNSを利用しているのでDDNSの更新の設定をしておく。

$crontab -e
(以下の1行を追加して保存)
*/10 * * * * wget -q -O /dev/null http://(mydns.jp のマスターID):(mydns.jp のパスワード)@www.mydns.jp/login.html

Gmail経由でmailを出せるようにする

Gmailのアドレスはxxxx@gmail.com
Googleのログイン名をxxxx、パスワードをfoobarとする

$sudo apt-get install mailutils
$sudo apt-get install ssmtp

/etc/ssmtp/ssmtp.confを編集

root=xxxx@gmail.com
mailhub=smtp.gmail.com:587
hostname=xxxx@gmail.com
AuthUser=xxxx
AuthPass=foobar
USESTARTTLS=YES

$mail xxxx@gmail.comでメールが送られてくるか確認。セキュリティの低いクライアントからのアクセスが有りましたとGoogleから知らせが来るのでGmailの設定で許可しておく。

Python関連をインストールする。

Pipではなぜか失敗するので、すべてapt-getでインストールする。

$sudo apt-get install python-pip
$sudo apt-get install python-numpy
$sudo apt-get install ipython
$sudo apt-get install python3
$sudo apt-get install ipython3
$sudo apt-get install python3-pip
$sudo apt-get install python3-numpy

など。Python3も入れておくがデフォルトはPython2しておく(そのほうがトラブルが少ない?)。

Pyboardを動かす

引き続きマイコンネタです。前回はラズパイで動くLinux上のPythonでラズパイのハードウエア(GPIO)を制御したのですが、Pythonでそのまま動くマイコンがあるというので早速Amazonで入手してみました。Pyboardです。

どういうことかと言うと、例えば、Arduinoなどでは、PCで開発環境などを使ってソースコード(C言語)を書きビルドしてマイコンと通信してプログラムを送り込むということをするのですが、Pyboardの場合はマイコン上にMicro PythonというPythonが実装されているので、Pythonコードだけで動きます。これは簡単です。しかもPyboardをPCにUSBでつなぐとストレージとして認識するので、その中に入っている"main.py"を書くだけです。
例えば、

# main.py -- put your code here!
import time
from pyb import Pin
pin_out = Pin('X12', Pin.OUT_PP)
while True:
	pin_out.high()
	time.sleep(1)
	pin_out.low()
	time.sleep(1)

をmain.pyに書き込んで、X12端子とGNDにLEDを付けてPyboardをリセットするだけでLチカが動きます。ついこの間はmbedで感動したのですが、これは更に簡単になってますね。
ピン配置は、

これを見るとわかるように、SPI, I2Cや各種ペリフェラルに対応しています。スペックは、STM32F405RGマイクロコントローラ、1024KiBフラッシュROMと192KiB RAM、Micro SDカードスロット対応などなど。
さてこれで何をするかですね。悩みます^^;

Raspberry Pi 3を動かす

いまさらながらRaspberry Piを入手してみました。実は以前Raspberry Pi 1(modelA)を持っていたのですが、使い道が分からずすぐに手放してしまったのでした。最新の3はWiFiBluetoothが内蔵されているということで少し食指が動かされました。先日秋葉原に行ったときにマルツで買ってきました。
しかし、こんな小さいボードでちょっと昔のワークステーション以上のスペックなのですから、TK-80やPC-8001でコンピュータを始めたオジサンには信じられない世界です(苦笑)。

RSコンポーネンツ版とelement14版があるのですが、中身は変わらないとのこと。若干安い後者を買いました。
Piで何をやりたいかというと測定器をシリアル制御し測定結果をロギングしたりその結果をクラウド上で管理したりとかです。Wifiが内蔵なので簡単にできそう。使う言語はもちろんPythonですよね。Linuxベースで動くからPythonでGPIOやシリアルを制御することができるでしょう。
まずはOSのインストールからLチカまでを備忘録代わりに書いておきます。

●OSのインストール
DD for WindowsというイメージをmicroSDメモリに書き込むツールを用意しておきます。メモリは16GBあれば余裕です。
OSはRaspbianにしました。以前持っていたRaspberryPi1はFedoraでした。いろいろ選べるようです。ココにイメージが落ちているのでダウンロードしておきます。zipを展開するとイメージファイルができるので、これを先のDDを使って書き込みます。

●起動
イメージを書き込んだmicroSDをPiに差し込んで、HDMIをモニタに接続。キーボードやマウスをUSBで繋いで、USB micro-Bを差し込むと電源が入ります(電源SWはなし)。最大2.5Aくらい流れるようなので大電流に対応したUSBケーブルと電源アダプタが必要になります。
Xの画面まで進むので、あとはメニューからPiの設定やWiFiの設定などを行います。その後、再起動するとそれらの設定が反映されます。
RAMが1GBしかないので、ブラウザを動かしたりするのはちょっとツライです。

●Lチカ
ピン配置はこちら。

GPIO21(40pin)を制御してLチカさせてみましょう。40pinと6pinのグランドを330Ωの抵抗を介してLEDに接続します。
ターミナルを起動させ、viなどのエディタで以下のスプクリトledblink.pyを作ります。

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(40, GPIO.OUT)
while True:
  GPIO.output(40, GPIO.HIGH)
  time.sleep(1)
  GPIO.output(40, GPIO.LOW)
  time.sleep(1)

これをシェルから起動

pi@raspberrypi:~ $ python ./ledblink.py


プログラム通り1秒間隔でLEDが点滅します。うーむ簡単過ぎる^^;
まずはDMMを制御してロギングするのを作ってみます。