ちょっと困ったことが起きており、一昨日からワンオ… | Fri, Oct 11. 2019 - 氾濫原 書いてからワンオペしてたがとりあえず終わった。

入院する前、調子を崩して家にいる状態だと、保育園から毎日毎日「何の病気なのか」と聞かれ続け、知らねーよ判ったら苦労しねーよと内心苛立っていたが、とりあえずそれがなくなってストレスは一つ減った。

生活品を届けにいったとき先生から説明をうける。ハッキリ原因がわからないので、安全な治療からはじめて、それがいつまでにうまくいかなかったら次はこうする、という方針を聞く。洒落ためがねをしていて頭が良さそう(医者なんだからもちろんそうなのだが、その上で)とぼーっと考えていた。

運悪く、保育園の弁当を持ってこいイベントが発生間近であり、まぁ冷凍食品のからあげを詰めたり、梨を剥いて詰めたりしてしのいだ。からあげは大変好評であった。

その間に台風19号があって避難したりして、なかなか面倒に。一人親の苦労ってのは責任が単一にかかるってのもあるよなあとか、大人が一人だけだと満足にトイレもいけないなとかいろいろ考えさせられる。子どもが5歳で良かったとか、近くに (妻方の) 親戚がいたので助かったとか思った。

台風後に子どもが発熱。幸い機嫌は良く、一日経ったら解熱して問題なかった。

病院は12歳以下の面会はお断りなので、あまり子どもをつれてお見舞いにいくという感じではない。そういえばと思ったのでテレビ電話で通話。子どもは喜んでたみたい。テクノロジー。

洗濯物は仕舞うのが面倒なので山積みにして (山になるほどではないが)、宝探しだぞと子どもに探させた。割と楽しくて一石二鳥

週があけて入院診療計画書が渡された。事前に主治医から聞いた内容が文書になった感じ。週単位の入院計画でなかなか暗い気持ちにはなる。

と思ったら翌日に、経過がよければ次の週末に退院の予定となる。一回説明するから来てくださいと言われたので (必要なの?とは思いつつ) 早退して聞きにいった。部屋で座って説明されることになって、重病なのか?と不安になったがそういうわけではなく、ものすごく丁寧な先生というだけだった。紙に図解付きで明確に説明されるので、資料作りながらプレゼンしてる感じですごいな〜と考えてた。

Android で外部キーボード使用時の日本語入力を快適にする (SKK) | tech - 氾濫原 というのを書いたが、設定できない部分で自分にあわない挙動があったので、fork して変更した。

以下の点だけ

  • egg-like-newline な挙動に (変換中の RET で改行を入力しない)
  • 辞書登録時に何も入力せず RET した場合は元の状態に戻るように

GitHub Actions で自動ビルドするようにしてある。

  1. トップ
  2. tech
  3. SKK for Android の自分用フォーク

Android では、アプリのサイズをできるだけ減らしたりするために、リリース前にアプリ全体のコードの最適化 (いわゆるツリーシェイキング) が推奨されている。動作としては、実行されるコードを解析で割り出しで、不要なコードを全て削除、というものになる。

基本的には minifyEnabled true を build.gradle に書けばよくて、簡単なアプリケーションなら、マニフェストから起動される Activity を解析してそこから呼ばれるクラスやメソッドは削除されないようになるので、これだけですむ。

が、リフレクションや JNI、または capacitor のように JavaScript のエンジンを一度経由して呼ばれるクラスなどは、この解析パスで到達できない。結果として、性質上、実行時にエラーが起こることになる。

capacitor で keep すべきもの

capacitor の場合、JavaScript 経由で呼ばれるものには全て keep しておく必要がある。

  • com.getcapacitor.plugin.* のうち、利用しているもの。
    • 名前も含めて keep しないとダメ。JS 側から見える名前はリフレクションで取得されるため
  • その他、利用しているプラグイン以下のクラス

-keep public class com.getcapacitor.plugin.App {
    static *;
    public *;
}
-keep public class com.getcapacitor.plugin.Device {
    static *;
    public *;
}
-keep public class com.getcapacitor.plugin.Filesystem {
    static *;
    public *;
}

-keep public class org.apache.cordova.CordovaPlugin

-keep public class fr.drangies.cordova.serial.**
-keepclasseswithmembers class com.hoho.android.usbserial.driver.** {
    static *;
    public *;
}

-printconfiguration /tmp/full-r8-config.txt
-printusage /tmp/usage.txt

`-keep public class com.getcapacitor.plugin.Filesystem` だけだと名前が変わってしまう。ProGuard の指定方法がややこしつてよくわからなかったが、上記のようにしたらうまくいった。

cordovarduino という Cordova のプラグインを利用しているので、それ系の設定もある。

`-printusage` で指定したファイルには「削除された」クラスやメソッド名が出力される。必要なメソッドが意図せず削除されているかも?と思ったらこのファイルを見てみる。

  1. トップ
  2. tech
  3. capacitor で Android 向けに minifyEnabled true

手元にある Elecraft KX3 の測定をしてみる。

(ちなみに当局の KX3 は「平成17年12月以降にアマチュア局の保証を受けて免許を受けた無線機」に該当するのでスプリアス確認保証は不要、のはず)

新スプリアス規定

測定結果を提出データとして使うためには測定器(スペアナ)が1年以内に校正されていなければならないので、現実的に個人でこれを行うのは難しい。

しかしアマチュアであれば JARD に対してスペアナ(校正済みでなくてもよい) の測定結果をもって保証してもらうという手がある。

測定周波数

アマチュアの場合広い帯域を一括で免許をうけるので、どの周波数を使うのかと思うが、割り当て帯域幅によって異なり、帯域幅が1MHz以下なら指定周波数 (免許状に書いてある、周波数帯域の中央) で測定をすれば良いらしい。別表第35

ただし電波形式は免許を受けるすべての形式で行う必要がある。

具体的な測定方法

スプリアス領域における不要発射等の測定方法の陸上関係無線設備(一般)にしたがう。

スペアナの設定のうちRBW, VBW, 検波モードが必ず指定された通りになっていることを確認すること。

スプリアス探索時

  • 掃引周波数幅 (基本周波数別に別途規定)
  • 分解能帯域幅 (RBW): 各スプリアス周波数毎に選択
  • ビデオ帯域幅 (VBW): RBW の等倍から5倍程度
  • 検波モード: ポジティブピーク
  • 掃引時間: 測定精度が保証される最小の時間
  1. 基本波の中心周波数か 2.5Bn (Bn=必要周波数帯幅) 以上離れたスプリアス成分を探索する
  2. 探索した各スプリアス成分の振幅値が許容値以下の場合は、探索値を測定値とする
  3. 許容値を超えた場合は振幅測定行い、平均値を測定値とする

スプリアス振幅測定

探索したピークに周波数をあわせて振幅をはかる

  • 中心周波数: スプリアス周波数
  • 掃引周波数幅: 0Hz
  • 分解能帯域幅 (RBW):
    • 9kHz 〜 150kHz : 1kHz
  • 150kHz 〜 30MHz: 10kHz
  • 30MHz 〜 1GHz: 100kHz
  • 1GHz〜: 1MHz
  • ビデオ帯域幅 (VBW): RBW の等倍から5倍程度
  • 検波モード: サンプル
  • 掃引時間: 測定精度が保証される最小の時間

実際にやってみる

面倒なので 40m (7100kHz) の CW だけでやる。変調をかけ最大送信電力にするということになっている。できるだけ厳しい条件でやるという意図だと思われるので、短点連続(帯域が最大)でやってみる。技適の手順だと25ボーとか、外部変調装置がある場合その最高速度みたいな手順みたいだが…

10W 7100kHz の場合、帯域外領域のスプリアス発射強度の許容値は 50mW (17dBm) 以下かつ、基本周波数の平均電力より40dB低い値。スプリアス領域での不要発射の強度の許容値は 50μW (-13dBm)以下。

  • 10W = 40dBm
  • 30dB 50W のアッテネータで 10dBm (0.01W)
  • 10dB 2W のアッテネータで 0dBm。これをスペアナに入力

必要周波数帯 (BN) は基本的に占有周波数帯幅の許容値と同値になるので CW の場合は 0.5kHz。スプリアス領域 は 2.5BN 離れた領域なため、7100±1.25kHz の外側がスプリアス領域。

7MHz の場合、基本波が9kHz〜100MHzのケースのためなのでスプリアスの測定範囲は 9kHz〜1GHz。ただし10倍高調波まで見る。

帯域外領域

帯域外領域の測定を勘違いしていました。別表第一 スプリアス発射又は不要発射の強度の測定方法 によると帯域外領域は無変調で行うようです。

ということで撮りなおしました。(Ref Offset を40dBいれているので、直読できるようになってます)

以下の画像はキーイング状態なので正確な測定ではないです。

一旦必要周波数帯と帯域外発射を見る。帯域外発射の範囲は 7100±1.25kHz なので、7100kHz を CENTER にして 2.5kHz SPAN で見てみる。

「帯域外領域のスプリアス発射強度の許容値は 50mW 以下かつ、基本周波数の平均電力より40dB低い値。」基本周波数の平均電力より -64dB 低いので後者の条件は達成、10W は 40dBm なので、帯域外領域の発射強度は -24dBm。50mW は約17dBmなので達成している。

スプリアス領域

上下にあるので、下から見ていく。

9kHz〜150kHz

下側 RBW=1kHz の範囲

なにもなさそう。

150kHz〜7100kHz

下側 RBW=10kHz の範囲

なにもなさそう。

7100kHz〜30MHz

上側 RBW=10kHz の範囲

高調波が出てる。40dBm -62 なので -22dBm。50μW (13dBm) 以下なので合格

30MHz〜70MHz (基本波の10倍)

RBW=100kHz の範囲

見つからず。

「ITU-R 勧告SM.329-10における指針」に従って、基本周波数の10倍高調波まで見れば良いことにはなっている。つまり 7MHz なら 70MHz まで見れば十分なはず。

スプリアス振幅測定

スプリアス強度が許容値を超えていた場合はどのぐらい超えたかを確定させるため、スプリアス振幅測定を行う必要がある。

今回は超えていないがこれもやってみる。14.2MHz を CENTER にして、ゼロスパンにする。

ref

  1. トップ
  2. tech
  3. スペアナでスプリアス測定してみる (KX3 CW)