2019年08月14日

iPad第6世代 Wi-Fi 32GB購入

仕事の都合でやむを得ずiPadを買った。早朝から深夜まで電話があれば直ちに対応する必要があり,たいしたことをするわけではないけれど,休日であっても出先に常にMacBookPro15インチを持ち歩いていた。

さすがにこれでは大変なので,一番安いiPad(第6世代,9.7インチ,Wi-Fi,32GBモデル)を購入した次第。

せっかく自腹で買うのだからと,面白そうなアップルペンシル(第1世代)も合わせて買ってみた。

とりあえず仕事で使うアプリだけ最低限セットアップして,早速持ち歩いている。当たり前だけどMacBookPro15インチの2kgに対して,iPadは469gなので四分の一。この差は大きい。

気がつけばMacBookPro,iPhone,iPadとすっかりアップル製品に染まってしまった。仕事はWindows,プライベートはMacと分けていたんだけどなぁ。ちょっと崩れた。

ペンシルはちょっと使ってみたところ,結構良いフィーリング。いわゆる従来のタッチペン(スタイラスペン)なんかとは別格の精度で書(描)ける。まあ絵描きではないので,活用法はこれから考えていきたい。



タグ:iPad
posted by ソウヘイ at 22:13| Comment(0) | パソコン・インターネット

2018年12月31日

2018年総括

東日本大震災から7年9ヶ月。今年は年明け早々に緊急地震速報が鳴ったけれど,あとは震度3規模が4〜5回で比較的落ち着いていた。

地元のプロバイダと契約してホームページを開設したのが1998年なので,今年で20年ということになる。ホームページの方はXHTMLに対応させて以降はメンテもせず,コンテンツも古いまま放置している。当初は50MBしかサイトの割り当て容量がなかったので,写真データなどは100kB以下に縮小し,さらに一部はgeocitiesに置いている。そのgeocitiesも2019年3月にはサービスを終了することが決まった。これを機にリンク切れなどを少しメンテナンスした方が良いかもしれない。ただ,古いコンテンツはそれはそれで貴重かもしれないので,消したりするつもりはない。(20年前のハイオクガソリン価格とか,安すぎてびっくりする)

この20年でネット上にいろいろな情報がアップされ,わからないことは検索すればたいていのことが載っている便利な時代になった。20年間その過程を見てきて思うのは,デジタイズされる以前の古い情報の少なさと,20年の間にサイトの閉鎖などで喪失してしまったデータのこと。最近は「ネットに情報をアップすると拡散してしまって削除することが実質不可能」というのが常識になったけれど,一方でデータの永続性という面ではまだまだ課題が大きいように思う。

7年使ったMacBookPro(Mid2010)は,今年初めにMid2015に更新して,この記事は新しい方のMacを外に持ち出してフリーWiFiに接続して書いている。性能にまったく不足はなく,快適。

IMG_6260_w560.JPG

■アマチュア無線活動
アマチュア無線は開局して7年。2021年頃から始まるらしい太陽活動のサイクル25まではHF(短波帯)の活動はほとんどお休みの状態。少し高いところに移動してのV/UHF帯のコンテスト参加(CWのみ)が主な活動。

自宅固定機のFT-100D(100W)の局免許が今年更新になるけれど,新スプリアス規制に非対応の機械らしく,どうしたものか悩んでいる。現行のオールバンド・オールモードの100W機はFT-991,FT-857,IC-7100,IC-9100あたりになると思うけれど,けっこう高いし,上述したように自宅からのHFハイバンドはコンディションが悪い状態が当分続くことを考えると,このまま局面を更新して2022年11月の使用期限までに後継機を選ぶ感じかな。その頃にはコンディションが上向くことを期待して。

■資格取得活動
今年は方針を転換して,難関資格は見送って優しい資格を取ってささやかな達成感を得る作戦。その一環で危険物乙3類を取得した。他にも進行中のプロジェクトがあるけれど,記事にできるのはもう少し先になりそう。転勤で職場環境が変わり,難関資格にチャレンジする心の余裕はちょっとなさそう。

■アコースティックギター弾き語り
昨年は新しい曲を練習できなかった反省もあり,今年は春には課題曲を決めて,秋にはなんとか一曲仕上げることができた。久しぶりに屋外で演奏を録音もできたし,まずます。来年はかんなさんとのデュオと,ソロでも一曲...という気持ちだけはあるものの,適当な課題曲がまだ思い浮かばない。

DSC_3753_w560.JPG

■猫
猫のピートは13歳,デルタは11歳になった。ピートはますます元気で食欲旺盛なのだが,デルタは今年ちょっと体調を崩してしまい心配した。その後体調は安定しているものの,ストレスなのかお腹や後脚の毛づくろいをしすぎてしまって,毛が薄くなってしまった。こちらも心配だけど,様子を見ているところ。Twitterでは猫たち写真を相変わらず呟いているけれど,これも猫たちが元気なうちまでかなと考えている。

■車
自分用の車を中古のNCロードスターに乗り換えて2年目になる。転勤で通勤に使わなくなってしまったので乗る頻度は減ったけれど,休日にオープンドライブを楽しんでいる。気になっていたタイヤも更新した。サンバーの便利さ,楽しさが懐かしくなることもあるけれど,もうしばらくロードスターと付き合っていきたい。今は車自体よりも整備したりする「男の隠れ家」的なガレージライフに憧れている。

10年目に突入したかんなさんの9Nポロもスタッドレスを更新したので,次回の車検も通すことになるかも。それまでに良いクルマとの出会いがあれば入れ替えもあり得る。納得いくクルマを柔軟に選んでいきたい。

IMG_5835_w560.JPG

■読書
今年は資格試験の勉強にさほど時間を割かなかったこともあって,けっこう読めた感じがする。ホームズの正典も読破したし,面白い作品も多かったように思う。今年のベストは最初に読んだシルトの梯子かな。私が好きなイーガンだった。シリーズを通してならWシリーズかわれらはレギオンも良いけれど,まだ完結まで読めていないので。今年読んだ本は下記。こうして並べると森博嗣さんの作品がミステリではなくSFジャンルに分類されるようになったのが面白い。

【SF】
シルトの梯子(G.イーガン) Kindle版
猫SF傑作選 猫は宇宙で丸くなる(中村融 編) 文庫版
スキャナーに生きがいはない 人類補完機構全短篇1(C.スミス) Kindle版
ヘリックスの孤児(D.シモンズ) Kindle版
アルファ・ラルファ大通り 人類補完機構全短篇2(C.スミス) kindle版
地上最後の刑事(B.H.ウィンタース) Kindle版
赤目姫の潮解(森博嗣) Kindle版
三惑星の探求 人類補完機構全短篇3(C.スミス) kindle版
スタートボタンを押してください ゲームSF傑作選(D.H.ウィルソン,J.J.アダムズ編) Kindle版
ネクサス(上・下)(R.ナム) Kindle版
ザ・ビデオ・ゲーム・ウィズ・ノーネーム(赤野工作) Kindle版
ウール (上・下)(H.ハウイー) Kindle版
風は青海を渡るのか?(森博嗣) Kindle版
天駆せよ法勝寺(八島游舷) Kindle版
シフト(上・下)(H.ハウイー) Kindle版
デボラ、眠っているのか?(森博嗣) Kindle版
ダスト(上・下)(H.ハウイー) Kindle版
ダーク・ジェントリー 全体論的探偵事務所(D.アダムス) Kindle版
私たちは生きているのか?(森博嗣) Kindle版
ジャック・グラス伝 宇宙的殺人者(A.ロバーツ) Kindle版
青白く輝く月を見たか?(森博嗣) Kindle版
ペガサスの解は虚栄か?(森博嗣) Kindle版
無常の月 ザ・ベスト・オブ・ラリイ・ニーヴン(L.ニーヴン) Kindle版
われらはレギオン1 AI探査機集合体(D.E.テイラー) Kindle版
血か、死か、無か?(森博嗣) Kindle版
われらはレギオン2 アザーズとの遭遇(D.E.テイラー) Kindle版

【ミステリ】
シャーロック・ホームズの復活【新訳版】(A.C.ドイル) Kindle版
バスカヴィル家の犬【新訳版】(A.C.ドイル) Kindle版
恐怖の谷【新訳版】(A.C.ドイル) Kindle版
シャーロック・ホームズ最後の挨拶【新訳版】(A.C.ドイル) Kindle版
シャーロック・ホームズの事件簿 【新訳版】(A.C.ドイル) Kindle版
怪奇探偵リジー&クリスタル(山本弘) Kindle版

【ノンフィクション】
ジャイロモノレール(森博嗣) 新書版

■ご参考 過去の総括記事
2017年2016年2015年2014年2013年2012年2011年2010年2009年2008年2007年2006年2005年

10737508464_IMG_6004_w560.JPG
posted by ソウヘイ at 07:55| Comment(0) | パソコン・インターネット

2018年12月22日

格安2in1その後(2年経過)

ドンキホーテの格安2in1を買って2年経った。

メインPCは今年初めに更新したMacBookProがあるので,2in1は無線の移動運用が主な用途。

CTESTWINやHAMLOGを動かし,ブラウザで規約を読んだり,結果をGmailで送ったりする限定した使い方なので,最底辺の性能でもなんとか使えている。

ただ,何ヶ月か前のWindows大型アップデートでCドライブの空き容量が少なくてアップデートできないという事態になった。eMMC32GBストレージの格安PCだとけっこう起きている問題らしく,検索して急遽16GBのUSBメモリを買って対応。なんとかアップデートできた。

データ保存用のマイクロSD32GBは,エラーを吐かないまま壊れたことがあったので,robocopyコマンドのバッチファイルを作って,タスクスケジューラで自動でNASにデータをバックアップするようにした。さらにコンテストなどの交信後はログ提出からハムログへのデータ結合,バックアップ,バックアップデータのGmailへの保存,という流れをルーチンにして万が一にもデータが消えないように注意している。

もう2年使って充分元も取ったし,屋外の移動運用に持ち出して,傷など気にせずガンガン使える点が気に入っている。
IMG_5832_w560.JPG
タグ:Windows 2in1
posted by ソウヘイ at 22:30| Comment(0) | パソコン・インターネット

2018年09月15日

夏の工作 Raspberry Pi (Twitterのメンションに反応して動作する)

Twitterで部屋の環境をつぶやくbotと,留守番猫カメラができたので,これらを組み合わせて,Twitter経由でカメラの制御ができるようにする。

Twitterでbot宛のメンションを監視して,「カメラ」「留守番」等のコマンドを検出したら,特定の動作を行うようにしたい。

メンションにリプライを返すbotはいろいろとネットに情報があって例えば,

参考サイト:TweepyとStreaming APIで自動リプライbotをつくる

などを参考にやってみたのだが,どうも動いたり動かなかったりする。変だな変だなと思っていたら,実はTwitterのAPIの仕様が2018年8月で変更になって,上記で使われているStreaming APIが廃止になってしまったらしい。

代わりにTweepy(pythonのライブラリ)で,api.mentions_timelineを使うことで,自分宛のメンションのタイムラインを取得できる。これをcronで定期的に実行するようにして,自分宛の新しいメンションがあったら,その内容をチェックして,「カメラ」,「留守番」等のキーワードが含まれていたら,所定の動作(留守番カメラの起動,写真撮影など)をするスクリプトを書いた。

参考サイト:[(元)情報学科大学生のブログ] Tweepyを使ってTwitterのbotを作る

cronの実行周期を1分にしているので,botに対して@付きでつぶやいてからレスポンスがあるまで最長1分くらい時間がかかるけれど,瞬時に応答が必要な機能でもないので,特に問題は感じない。




注意点としては,自分宛のメンションのうち,特定のユーザID(自分)からのメンションにだけ反応するようにしておくこと。そうしないと知らない人が留守番猫カメラのON/OFFを制御できたりしてしまう。
タグ:Raspberry_Pi
posted by ソウヘイ at 19:24| Comment(0) | パソコン・インターネット

2018年09月11日

夏の工作 Raspberry Pi (欧文/和文モールス音源生成スクリプト)

留守番猫カメラからの続き。

せっかくのラズパイを何か無線関係に使うことはできないだろうか。D-starのノード局にして使う,というのは聞いたことがあるけれど,D-starが使えるリグもないし,そもそもphoneはあまり興味がない。

せっかくならCW関係の何か...といってもすぐ思いつくエレキー/メモリキーヤーなんかはありきたりだし,すでに電池駆動で使えるメモリキーヤーを持っているので,別に必要性もない。

そこで,ちょうど和文や欧文の聞き取り練習をしているところでもあるので,日本語の普通文をCWの音声ファイルに変換するスクリプトはどうだろう。

Windows用にA1A Breakerというすばらしいフリーソフトがあるけれど、確か日本語の平文(漢字仮名交じり文)を直接変換することはできなかったのでは。

というような思考を経て、次のような仕様を考えた。
1 欧文と和文を自動判定
2 和文の場合、漢字仮名交じり文をカナに変換
3 CWの音声ファイルを生成

1はまあ含まれている文字から簡単に判別できそう。
3も文字に対応した符号を生成して、sin波の入切で音声データを作るのはなんとかなりそう。

やっかいなのは2で、漢字仮名交じり文の読み仮名を解析してカナに変換する方法を考えなくてはいけない。

自力でそんなコードを書くのはほとんど無理だけど、世の中には親切な人がいるもので、MeCabというオープンソースの形態素解析エンジンがある。これは日本語の文章を単語に区切り、品詞を同定する処理をしてくれるもので、そのついでに読み仮名も出してくれる。

で、これを使って1、2、3それぞれの機能ごとに少しずつコードを書いていった。




この辺からPythonの日本語処理でハマることが多くなる。まずstrとunicodeと文字コードがごちゃごちゃになってよくわからない。出てくるエラーを見ながらググってはエラーを出し,print文を仕込んでordやtypeやencode文を使って確認しつつ,辻褄を合わせるデバッグ作業が続いた。

文字コード(ASCIIコード,UTF-8コード)に対応したモールス符号の生成(半角"ア" -> UTF-8"FF67 -> モールス符号"11011")は以下のサイトを参考にした。欧文は普通にASCIIコードで変換できる(ord("A")=65)んだけど,半角カナはord("ア")=177とはならず,ord("ア")=65393(FF71)で,これはUTF-8コード。この辺も最初はよくわからずハマった。

参考サイト:JH7UBCブログ ラズパイ Python モールス符号練習機

MeCabの読み変換はもちろん完璧ではなく,「大喜び」を「だいよろこび」と変換するなど,細かいミスはあるものの,一般的な文章なら相当精度良く変換できる。これは本当に素晴らしいなぁ。

和文符号だと濁点や半濁点を分離しないといけない(「ザ」は「サ゛」にする)必要があり,このために全角カナを半角カナにさらに変換。半角カナには濁点・半濁点付きの文字がないので,強制的に分離される。




sin波をつなげて音声を作っていくのは,以下のサイトを参考にした。信号ありをレベル1,無音部分を0として,ドットを基準の長さにして,ダッシュは3倍の長さ,というようにつなげていく。

参考サイト:[python] sin波の音をWAV形式で出力する

サンプリング周波数は最初サンプルと同じくCD音質の44100Hzとしていたけれど,これだと2分を超えるような符号列だと変換途中にメモリーエラーで落ちてしまうことが判明。よく考えたらCWのトーン周波数は700Hzなので,標本化定理に従えば1400Hzで充分再現できるはず。一応さらに倍の2800Hzとした。これで15分以上の長い文章でも一気に変換できるようになったと思う。

まだまだおかしいところはあると思うけれど,現状のコードを載せておく。いろいろなライブラリを読み込んでいるので,importに書かれているライブラリを事前にインストールしておく必要がある。

速度は変数[sec]に短点の秒数で指定。現状だと総通試験の和文の速度(1分間75字程度)になっていると思う。適宜調整してほしい。総通の試験で出ないと思われる符号はバッサリ削除している。音源はそのままでは完成度が低くて使えないかもしれないので,カナ変換した時点で生成されるout.txtをA1A Breakerなりに読み込ませて使うのも良いと思う。

実行方法は下記。引数に変換元のテキストファイルを入れておく。
python txt2cw.py momotaro.txt


ソースコード txt2cw.py
※「動きません」とか質問されても,当方もラズパイ,Pythonビギナーなのでお答えできない可能性が高いです。アドバイスは歓迎いたします。

#!/usr/bin/env python
# coding: utf-8

import numpy as np
import wave
import struct
import pydub
import sys
import MeCab
import mojimoji
import subprocess
import re
import codecs
import jaconv
import textwrap
import gc

#文字コードーモールス符号の変換テーブル
Morse_Code =[63,62,60,56,48,32,33,35,39,47,1,1,1,1,1,1,1,6,17,21,9,2,20,
11,16,4,30,13,18,7,5,15,22,27,10,8,3,12,24,14,25,29,19]
Wabun_Code =[30,59,6,12,61,34,14,57,7,22,54,59,6,12,61,34,18,37,24,29,31, #ヲ〜コ
53,43,55,46,23,5,20,22,58,36,10,21,16,27,28,17,51,19,2,9, #サ〜ホ
25,52,3,49,41,14,57,7,8,11,45,15,26,13,42,4,44, #マ〜ン
109,82,121,40,74,106] # ()ホレ ラタ 段落 区切り点

m = MeCab.Tagger('-Oyomi')

# 原文の読込み(第1引数にファイル名を指定)
f = codecs.open(sys.argv[1], 'r', 'utf-8')
lines = f.readlines()
f.close
bunsho = '\n'.join(lines)
print('*** 原文 ***')
print(bunsho)

# 試験で出ない符号は削除,またはスペースに置換する
bunsho = re.sub('[&%#+*/@$=],', '', bunsho)
bunsho = re.sub('[-\'\",.()]', ' ', bunsho)

#複数の連続するスペースは一つにする
bunsho = re.sub(r"\s+", " ", bunsho)

yomi = m.parse(bunsho.encode('utf-8'))
print('*** MeCab 読み仮名取得***')
print(yomi)
#一般名詞のひらがなで残ったものをカタカナにする
yomi2 = jaconv.hira2hkata(unicode(yomi,'utf-8'))
print('*** jaconv ひらがなtoカタカナ***')
print(yomi2)

#A1A Breaker用にテキストファイルを出力
with open('./out.txt', mode='w') as f:
s_wrap_list = textwrap.wrap(yomi2,20)
f.write('\n'.join(s_wrap_list))

han = mojimoji.zen_to_han(yomi2.decode('utf-8'))
han = han[:len(han)-1]
print('*** mojimoji 全角to半角 ***')
print(han)

message=han
message_len=len(message)

#不要な変数を削除してメモリ解放
del lines
del bunsho
del yomi
del yomi2
del han
gc.collect()

A = 1 # 振幅
fs = 2800 #サンプリング周波数
f0 = 700 #基本周波数 CW信号のトーン
sec = 0.055 #秒 短点の基準

cw_tone = []
# アルファベットは全て大文字に変換
message = message.upper()

# 欧文/和文の判定
#regexp = re.compile(r'[^\x20-\x7E]')
regexp = re.compile(r'(?:\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F])')
result = regexp.search(message.encode('utf-8'))
if result != None:
wabun = 1 # 和文のときは1 欧文は0
else:
wabun = 0

print(wabun)

if wabun ==1:
message = u'<' + message + u'>' # 和文の場合はホレ,ラタを追加

#和文中のアルファベットは削除(総通の問題には出ないので)
message = re.sub(r'[a-zA-Z]+', r'', message)
message_len=len(message)

#和文中の試験に出ない符号は削除する
message = re.sub('[?!()]', '', message)
message_len=len(message)
print(message)

#sin波
def create_wave(A,f0,fs,t): #A:振幅,f0:基本周波数,fs:サンプリング周波数,再生時間[s]
#nポイント
point = np.arange(0,fs*t)
sin_wave =A* np.sin(2*np.pi*f0*point/fs)

sin_wave = [int(x * 32767.0) for x in sin_wave] #16bit符号付き整数に変換

return sin_wave

def create_cwfile(data): # wavファイルの作成と書き出し
#バイナリ化
binwave = struct.pack("h" * len(data), *data)

#サイン波をwavファイルとして書き出し
w = wave.Wave_write("cw.wav")
p = (1, 2, fs, len(binwave), 'NONE', 'not compressed')
w.setparams(p)
w.writeframes(binwave)
w.close()
print(len(data))

#mp3に変換
sound = pydub.AudioSegment.from_wav("cw.wav")
sound.export("cw.mp3", format="mp3")

def dot(): #短点
cw_tone.extend(create_wave(A,f0,fs,sec))

def dash(): #長点
cw_tone.extend(create_wave(A,f0,fs,3*sec))

def space(): #文字間隔
cw_tone.extend(create_wave(0,f0,fs,2*sec))

#文字コードを対応するモールス符号に変換
try:
while True:
for i in range(message_len):
char_code = ord(message[i])
print(char_code)
if char_code == 0x20: #space code
space()
elif wabun == 0: # 欧文
Mcode = Morse_Code[char_code - 48]
while Mcode != 1:
mark = Mcode & 1
if mark == 0:
dot()
else:
dash()
cw_tone.extend(create_wave(0,f0,fs,sec)) # 符号間のスペース(1点)
Mcode >>=1
cw_tone.extend(create_wave(0,f0,fs,2*sec)) # 文字間のスペース(3点分)
elif wabun == 1: # 和文
if char_code >= 48 and char_code <= 57: # 数字
Mcode = Morse_Code[char_code - 48]
elif char_code >= 65 and char_code <= 90: # 和文中のアルファベット
Mcode = Morse_Code[char_code - 48]
elif char_code == 60: #ホレ
Mcode =121
elif char_code == 62: #ラタ
Mcode =40
elif char_code == 40 or char_code == 65378: #下向きカッコ
Mcode =109
elif char_code == 41 or char_code == 65379: #上向きカッコ
Mcode =82
elif char_code == 65377: #段落(。)
Mcode =74
elif char_code == 10 or char_code == 13: #単なる改行は無視
Mcode =1
elif char_code == 65380 or char_code == 65381: #区切り点,中黒
Mcode =106
else:
Mcode = Wabun_Code[char_code - 65382]
while Mcode != 1:
mark = Mcode & 1
if mark == 0:
dot()
else:
dash()
cw_tone.extend(create_wave(0,f0,fs,sec)) # 符号間のスペース(1点)
Mcode >>=1
cw_tone.extend(create_wave(0,f0,fs,2*sec)) # 文字間のスペース(3点分)
create_cwfile(cw_tone)
break

except KeyboardInterrupt:
pass


出力されたmp3をffmpegで動画にしたもの。
原文はももたろうの前半部分。
posted by ソウヘイ at 20:34| Comment(0) | パソコン・インターネット