2015年1月24日土曜日

UbuntuでHHKBを使う

仮想マシンでUbuntuを使ってるんですが、キーボードの初期設定をちょっと間違えましてJIS認識にされてるんですね。
で、俺が使ってるのはHHKB(US)なので、いろいろ不都合はあるわけですが、基本的にWindowsで.cやら.texやらのファイルを編集して、それをコンパイルしたりとか、その程度の理由で使っているわけですが、やっぱり不便だなぁなんて思ったので。

おまじないはこちら

# dpkg-reconfigure keyboard-configuration

ここから、HHKBを選べばOK

かと思いけや、なんじゃこりゃ、
JISのままやないかーい


というわけで、
/etc/default/keyboard
をとりあえず覗いてみた。

うーん、hhkのusって書いてあるんだけどなぁ...


とりあえずググる...
えーと、なになに
/usr/share/ibus/component/mozc.xml
をつつけばよろし?
なるほど、ibus側の設定でしたか。
とりあえず管理者権限がいるっぽいね。

layoutをenに変えれば良いと?

とりあえず変えてみたけど動作は変わらず


とりあえずガチャガチャ...

ibusの設定に、日本語キーボードとか言う奴がいたから削除。
USを追加して一番上に...

そしたらちゃんと認識してもらえましたとさ。


2015年1月22日木曜日

TeXのbb指定に関して

現在、レポートに追われて死んでいます。
というか、これからレポートを出しに行ってきます。

でも、その前に。
.pngファイルをTeXで挿入しようとしたらなんかバグって大変なことになったんですよね。
.pngを使うときはebbコマンドで.bbファイルを生成して、その中身を覗いてbb指定して...ということをしていたのですが、なんでバグったのか意味不明でした。

で、死んでしまうと思いながら必死に調べていたら、
bb指定は使うべきではないとの記事を発見。

これによると

$ extractbb *.png

とでもやれば良さそうで。

早速試してみると...
うまくいった!!!

しかも、これまでみたいにbb指定をいちいち書かなくていいから楽そう。
こりゃいいや。

というわけで、/bbで検索かけてdf,で消して、あとはひたすらn.っと。


2015年1月20日火曜日

yamyを使ってJISキーボードをUS風にする

デスクトップPCだと、US配列のHHKBを使えばいいだけの話ですが、
ノートPCたと、US配列はなかなか入手がめんどくさいですよね(昔に比べれば楽になったほうだと苦情がでそうですが...)

そこで、yamyを使ってwindows PCのJIS配列をUS風にカスタマイズして使ってるのですが、
意外と需要があるのではないかと思ったため一応まとめてます。


参考にした配列はこちらです。




まず、こちらからyamyを入手します。
詳しいマニュアルはこれを参照してください。

とりあえず、以下のコードをコピペしてmyUS.mayuとかその辺りのテキトーな名前で保存して、
yamyに読み込ませればUS風にキーバインドが変更されます。
ざっくりした説明をすると、左辺が押したキーボード、右辺が画面に表示される文字って感じですかね。
C-はCtrl,S-はShift,
その前についてる*はワイルドカード的なそれで、~はNot
例えば、

key *C- S-_2                 = *C-~S-Atmark             # @
だったら、Ctrlの状態は任意で、Shiftと2が押されたらCtrlの状態を保持したままShiftを押さずにAtmarkキーが押されたことにしろみたいな意味になります。


include "109.mayu" # Japanese Keyboard
keymap Global

key *C- S-_2                 = *C-~S-Atmark             # @
key *C- S-_6                 = *C-~S-Caret              # ^
key *C- S-_7                 = *C- S-_6                 # &
key *C- S-_8                 = *C- S-Colon              # *
key *C- S-_9                 = *C- S-_8                 # (
key *C- S-_0                 = *C- S-_9                 # )
key *C- S-Minus              = *C- S-BackSlash          # _
key *C-~S-Caret              = *C- S-Minus              # =
key *C- S-Caret              = *C- S-Semicolon          # +
key *C-~S-Atmark             = *C-~S-LeftSquareBracket  # [
key *C- S-Atmark             = *C- S-LeftSquareBracket  # {
key *C-~S-LeftSquareBracket  = *C-~S-RightSquareBracket # ]
key *C- S-LeftSquareBracket  = *C- S-RightSquareBracket # }
key *C- S-Semicolon          = *C-~S-Colon              # :
key *C-~S-Colon              = *C- S-_7                 # '
key *C- S-Colon              = *C- S-_2                 # "
key *C-~S-RightSquareBracket = *C- S-Atmark             # \
key *C- S-RightSquareBracket = *C- S-Caret              # ~

 mod Shift += !BackSlash

あとは、これをデフォルト起動にするために、このへんを参考に、タスクスケジューラを使ってログイン時にyamyを自動起動にしておけば大体OKかな?


ちなみに、capsLockはこちらを参考に

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00

の4行をcaps2ctrl.regとかって名前で保存して管理者権限で実行しておけばCapsLockがCtrlに書き換わってくれますね。




2015年1月12日月曜日

PS/2キーボードの波形に関して

しばらくキチガイじみたことを休止していたため、久しぶりの更新となります。

もちろん今もVimmerなわけで、もちろんUS配列信者でもあるわけで...
ついでに、大学のとある科目でマイコンを突っつく機会ができたわけで...

つまりですね、PSoCを使ってJISキーボードをUS配列風に変えたり、Vimエミュレータっぽい挙動をさせてみたりしてはどうかなと思ったわけです。

まぁ、それは良いとして、PS/2キーボードとしてマイコンが生成する信号をキーボードとしてちゃんと認識させるのに苦労しました。

PS/2キーボードのプロトコルに関してはこちらを参照しました。

これによると、clockがhighの時にdataをセットし、clockがlowの間にデータが読まれると言うこと。
つまりですね、clockがlowの時にはデータラインを変更しないということですよね。

しかし、まず苦労した点として、これを読まずに実装しに行ったのでどうせポジティブエッジだろうと勝手に思い込んでしまったんですね。
どちらかと言うとネガティブエッジなので失敗。
動作テストはキーボードの動きが見れれば十分だったのでBIOS上でやったのですが、ビープ音なりまくりw

そこで頼りになるのがオシロスコープ。
ちなみに、PS/2端子はOpen Drain Lowになっているのでオシロスコープにはプルアップ抵抗をつける必要があります。
とりあえずキーボードが生成する波形を測ってみました。
黄→データ
青→クロック
です(言わなくてもわかるか)



これはキーボードを話した時に送られる0xF0の波形。
スタートビット(常に0)、データビット(下位→上位ビットの順で送られることに注意)、パリティビット(奇数パリティ)、エンドビット(常に1)
の順で送られていることが確認できます。

で、

こっちがでっかくしたやつ。

よく見てもらうとわかると思うのですが(と言うか、0x0Fがわかりにくいのでもっとわかりやすい波形を使えって話なのですが、保存してあった画像がこれだけだったのですいません。)、
クロックの立ち下がりよりクロック周期の1/4だけ早くデータラインが変化しているのです。

というわけで、この波形を純粋に真似てみるということをしました。

そのソースの一部がこちら。

void outputData(BYTE d) {
    unsigned short i;
    unsigned short x = d << 2 | 0x03;
    int j;
    const t = 2;
    // calculate parity
    for ( i=0x80; i; i>>=1 ) {
        if ( d & i ) {
            x ^= 0x02;
        }
    }
    // send
    for (i=0x400; i; i>>=1 ) {
        if ( x & i ) {
            DATA_OUT_On();
        } else {
            DATA_OUT_Off();
        }
        for ( j=0; j<t; j++); // wait
        CLK_OUT_Off();
        for ( j=0; j<t; j++); // wait
        for ( j=0; j<t; j++); // wait
        CLK_OUT_On();
        for ( j=0; j<t; j++); // wait
    }
    DATA_OUT_On();
}


tの4倍がクロック周期となっていますね。
そもそも、マイコンのクロックが遅いのに対して、T=80[um]とかいう鬼畜な状況だったので、
データを送りながらパリティを送るのはリスキー。
そこで、先にスタート、データ、パリティ、エンドを羅列したxという変数を作成し、
そこから1bitづつ送信しています。
ちなみに、dは上位と下位を反転しています。

余談になりますが、キーボードの入力を読み取るときにクロックの立ち上がりで割り込み処理をしているのですが、80[um]ごとに11回連続で呼び出されることがわかっている割り込みなので、データをこねこねしていたのではとても間に合わないのかなぁと思って、論理演算のみで、しかも演算回数を極力減らしたかったので、オーバフローを活用しながら、上位と下位が反転した形でキーコードを扱うという非常に保守点検のしにくいプログラムが出来上がる予定です。