Category javascript.

昔 keyString.js という KeyBoardEvent からなんとなく押されたキーの文字列表記になおすやつを書いたことがある。

しかしこれは実装が不完全で一部のキーがちゃんと判定されなかったりした。が、マルチプラットフォーム・マルチブラウザで検証するような気力はないし、そんなことしても無駄になるのは目に見えているのでやる気はおきない。

KeyBoardEvent.key

KeyBoardEvent に key というプロパティが DOM Level 3 Events ではできることになっていて、これは Enter キーの場合 "Enter" という文字列が入り、物理的なキー位置(ということになっている謎の数値)ではなく、論理的なキーを表現するということになっている。が、全てのブラウザで同じように実装されているとはいえない。

ということで KeyBoardEvent.key には polyfill をつかおう。

https://github.com/inexorabletash/polyfill/blob/master/keyboard.js

を読みこむだけでいい。完璧ではないがおそらく現時点で一番まともだと思う。このファイルにはライセンスが書いてないが polyfill 全体で Public Domain となっており適当に扱っても問題ない。

KeyBoardEvent.key を直接判定に利用するには問題がある

KeyBoardEvent.key は modifierKey (シフトキーとか) の状態は当然含んでいないので、単に

if (e.key === 'Enter') {
}

で判定してしまうと、Shift+Enter や Alt+Enter なども同じもの扱いになってしまう。かといって

if (e.shiftKey && e.key === 'Enter') {
} else
if (e.altKey && e.key === 'Enter') {
} else
if (!e.shiftKey && !e.altKey && e.key === 'Enter') {
}

とか全部書くのは見通しが悪い。

ということでしかたなしに

var key = (e.altKey?"Alt-":"")+(e.ctrlKey?"Control-":"")+(e.metaKey?"Meta-":"")+(e.shiftKey?"Shift-":"")+e.key;   

みたいなのを1行書いて modifier key のプリフィックスをつけておくとやはり楽になる

if (key === 'Shift-Enter') {
} else
if (key === 'Alt-Enter') {
} else
if (key === 'Enter') {
}
  1. トップ
  2. tech
  3. DOM の KeyBoardEvent の e.keyCode とか e.which とかを文字列としてとりたいやつ
  1. トップ
  2. [js
  3. DOM の KeyBoardEvent の e.keyCode とか e.which とかを文字列としてとりたいやつ
  1. トップ
  2. javascript
  3. DOM の KeyBoardEvent の e.keyCode とか e.which とかを文字列としてとりたいやつ

なんかエクセルで計算できるのがでまわっているっぽいのだけれど、HTML で計算したいので JavaScript で書きなおした。

自分で書いたら欲しい機能増やせるし便利。特に、計算したパラメータから、必要な材料の長さを出したりしたかったので canvas で全体像をレンダリングしている。

コイルも密巻きの場合を簡単に求められるようにしたりした。ただ、細長いコイルはQ値がさがってよくないらしいので低い周波数では調整する必要があるのかもしれない。でもそれでどの程度効率が変わるのかがわからない。

7MHz MicroVert アンテナを制作

φ25mm φ22mm のアルミパイプそれぞれを 1m ずつ買ってきて作った。設計上は 1m + 0.85m で 15cm ほど重ねるイメージ。

コイルを設計通りに巻くのがかなり難しく、はじまりとおわりの処理の仕方がよくわからなくて、これはうまくできたとは言い難い。

7MHz だとカウンターポイズが 8.3m 必要だけど、なんとなく買っておいた 10m の 5D-2V があったので頑張って計って切った。コアは 50MHz 用のコブラアンテナを試作したときのを流用した (12ターン 3D-2V がW1JR巻きで FT240 #44 に巻いてある)

ちなみに、設置ロケーションは給電点地上高 2m 程度で、建物からは 30cm 程度しか離すことができないので全く SWR が落ちないような予感がしていた。やってみなければわからない、と自分を励ましつつやったが、案の定全く下がらなかった。

複素インピーダンスを広域で一覧するとだいぶ下 (6.8MHzヘルツぐらい) に同調しているような感じだったのでエレメントを短くしてみたりしたが、なかなかうまくいかず。

カウンターポイズのはわせかたを変えたり、エレメントの長さを変えたりいろいろ試行錯誤しまくったあげく、7MHz 付近でエレメントは共振しているようだが SWR は下がらない (リアクタンスがないけどインピーダンスの実数が低すぎる)、という状態になったので、カウンターポイズを動かし、ようやく 1.5 程度まで下がった。

インピーダンスが低めに出ていたので、カウンターポイズをできるだけエレメントから離すように置いたら効果があった。

エレメントの長さによっては、特定の周波数 (だいたい6.8MHzぐらい) で SWR が 1.0 程度になったりした一方、7MHz 以上では SWR が下がりきらなかった。たぶんコイルの巻きすぎ?だと思うが、ほどくのが大変面倒なので、一度コイルには手をつけずエレメントだけで調整し、7.000〜7.200MHz、すなわち 7MHz 帯全域で SWR 2.0 以下にできた。最低 SWR 点が 1.5 程度なのがちょっと微妙だけど、とりあえず気にしない。

しかしその後一旦コイルの固定やらで取り外すことにしたので、コイルも1ターン巻き戻して再調整したところ、7.0MHz 付近で SWR 1.1〜1.2 ぐらいまで落とすことができた。もう1ターン戻してもよかったかもしれないが、メインで運用しているのはバンド下限あたりなのでこれでよさそう。

帯域が広いのは事前情報で知ってはいたけど、なんとなく信じていなかったので、設計時に 7MHz をターゲットにしたのがよくなかった。今回の場合 7.1MHz ぐらいをターゲットにして作る (計算上はコイルが1ターン減るだけ) と丁度よかったかもしれない。

制作上思ったこと

  • できれば調整部分は手の届く範囲にすべき
    • 1段目を短めにしたほうが調整しやすい (70cmぐらい?)
  • LCR メータがあったほうがいい (自分は持っていないのでコイルのインダクタンスがどんなものなのか、計算でしか求められない。アナライザーでも一応測れるけど結構ナイーブで値が信用しにくい)
  • アナライザーなしでは調整が困難
    • カウンターポイズを使うアンテナでは必須だと思った
  • マストと固定するため、塩ビパイプのコイルから下側は長めにしたほうがいい

使用感

UHV-6 という 2m 程度の短縮マルチバンドアンテナとの比較しかできないが、今のところ感じるのは以下の通り

  • 信号は UHV-6 と同じか、それより弱く聴こえる
  • SN は UHV-6 より少しよく感じる
    • 特に、7.01MHz 未満では、UHV-6 はなぜかノイズが常時ひどくで聴こえなかったのが、MV で聴こえるようになった。設置位置の関係かもしれない
  • とにかく帯域が広くて 7MHz ならどこにでも出れる。UHV-6 はチューナーなしだと 7.00 から 7.025 ぐらいまでしか出れないので、嬉しい感じ。

ベランダのスペースの関係上、UHV-6 と今回作った MicroVert アンテナは開けている方角が違うので、相手局の位置によって変わりそう。もうすこし耳が良いのを期待したけど、それに関しては少し期待はずれだった。短いアンテナなので、結局その点に関しては短縮ホイップと同じなのかもしれない。

  1. トップ
  2. ham
  3. MicroVert アンテナの設計ツール
  1. トップ
  2. javascript
  3. MicroVert アンテナの設計ツール

window.addEventListener("load", initialize, true); って書いていたのだけど、なんかコレだと Opera が4回とか3回とか initialize を実行する。まじワカンネーよーと Opera 糞だよーふぁっきんだよーと嘆きつつ、一切実行しないように書き換えた直後、IRC に該当コードを貼り付けたらひらめいた。そんなわけで truefalse にしたら見事1回だけ実行してくれるように。

ところで initialize って一気にタイプしないと書けない。というか紙に書こうとすると無理 (謎)。それとは別だけど listener って単語がよくゲシュタルト崩壊する。12回に1回ぐらい辞書ひくか動的補完してる。あはは

  1. トップ
  2. web
  3. Opera で addEventListener の最後はできるだけ false に
  1. トップ
  2. javascript
  3. Opera で addEventListener の最後はできるだけ false に