83's

Top > Archives > 2004 > December

December 02, 2004

今日はT見の誕生日 17:11

らしいので、みんなで迷惑メールを送りましょう。

December 18, 2004

UMLムズい 02:07

昨日からの集中講でUMLをなんとなく見てきたわけだが、これすぐには習得が難しそうだ。 演習で書いた図がことごとく先生の答えと違うんで、もう凹みまくりですよ。

で、思い付きなんだが、でかいプログラムを解析するときに、 コードを読みながらUMLの図を普通とは逆の順に書いていって 徐々に抽象化していけば概要がつかみやすくなるかも、と思うんだがどうなんだろう。 今nicolatterのソースを読んでるので、実践してみようと思う。 ま、UMLが明日でしっかりわかれば、な。 GUIアプリなんて作ったことないんで、ちょっと改造しようと思っても まったくわからなくて困ってるんです。

にしてもコレ、オープンソースのソフトではさすがに使われてないよなあ? 経験とかでなんとかなるんだろうか。 いつかはオープンソースに参加してみたいもんですね。

December 19, 2004

nicolatterのON/OFFをshift+spaceで 00:50

nicolatterは 英字入力→日本語入力はshift+spaceでできるんだが、 それ以外のキー設定はshiftと組み合わせることができないみたい。 だから日本語→英字がshift+spaceでできず、kinputに慣れた人には気持ち悪い。 てことで、改造してみた。

環境は、vine 3.1 + nicolatter 1.7.8 + FreeWnn。nicolatter-1.7.8/nicolatter/WnnConv.ccの 741行目を次のように変更。

const Key* key = keyMap->find_key(getKeyName(event.modifier, event.keycode));

                                  ↓

const Key* key = keyMap->find_key(getKeyName2(event.modifier, event.keycode));

これでmakeしてインストールし直せば、 shiftと組み合わせたキー設定ができるようになる。

次に、shift+spaceで日本語入力から英字入力に切替えるキー設定をする。

キー設定にはもともとkeyconfというソフトが付属しているが、 これはshiftと組み合わせることができないのでファイルを 直接いじる。

~/.nicolatter/common.keymapを開くと、begin-key〜key-defineの間に 次のような設定があるはずだ。

ctrl-backslash	漢字モード

「漢字モード」ってのは「日本語→英字」の切替えを行なう機能を表す。 なのでこの例の場合、ctrl + \ で日本語入力から英字入力に切替える設定になっている。 これをshift + spaceで切替えるようにするには、「ctrl-backslash」を「shift-space」に変えればいい。

で、この変更による副作用なんだが、日本語入力のモードのとき、 shiftを押しながら例えばaを押すと、日本語に変換されず「A」と出力される。 もちろんshift-aに機能が割り当てられてない場合だ。 でもこれってたいして問題じゃないよね?

とまあ、集中講義中はこんなことやってたんですね。 1/3遊んで、1/3寝て、1/3真面目に受けた感じですね。 まあ単位はとれそうなので良かったです。

にしても、Linuxは親指シフターにとってなんて辛い環境なんだろう。 nicolatterもちょっと不満があるんだよね。

どこ行っちゃうのよ、と。

なんだろう、入力中はウインドウの左下に文字が現れるんだよね。 俺だけ? 位置は慣れればそれほど苦ではないんだけど、 ウインドウが下の方にあると変換候補がディスプレイからはみ出すという罠('A`)

December 20, 2004

nicolatterのON/OFFをnicola-skk風にする 23:30

nicolatterの「日本語入力→英字入力」「英字入力→日本語入力」の切替えを Emacs上で使えるSKKの親指シフト風にしてみた。 いまいちよく分からんけど、とりあえず動くみたいなので公開。 どんなかというと、2つの親指シフトキーを同時に押すんです、同時にポンッと。 手のポジションが変わらないので動作が少なくて済むのがいい。

ちなみに環境はVine 3.1 + nicolatter-1.7.8 + FreeWnn。 シフト方式は同時打鍵。

変更箇所が多いのでパッチが作れたら良かったんだが、 ちょっとやってみたけど分からなかったんで、面倒だけど載せとく。 ちなみに修正していくとここに書いてある行数とズレてくるので注意。

nicolatter-1.7.8/nicolatter/syncshift.cc

176〜178行目。

    case 0: /* S1/A1 */
        // TRACE("s1/a1 ");
        gr = event;   state = 2;  break;

これを次のように変える。

    case 0: /* S1/A1 */
        //TRACE("s1/a1 ");
	if(ic->kanaKanji->getKanaMode() == MODE_OFF) ic->input(event, 0);
	else{ gr = event;   state = 2;	}
        break;

次に233〜236行目は次のようになっているので

    case 14: /* S3/A3 */
        // TRACE("s3/a3 ");    // シフトキーのキーリピート
        ic->input(sr, 0);
        sr = event; break;

これを次のように変える。

    case 14: /* S3/A3 */
        //TRACE("s3/a3 ");    // シフトキーのキーリピート
	ic->input(sr, sk(event));
	state = 1; break;

nicolatter-1.7.8/nicolatter/client.cc

150〜153行目。

    case MODE_ALPHA: // 無変換固定
        if (event.type == KeyPress)
            input(event, (event.modifier & ShiftMask) != 0 ? 1 : 0);
        break;

これを次のように変える。(数行コメントアウトする)

    case MODE_ALPHA: // 無変換固定
      //        if (event.type == KeyPress)
      //            input(event, (event.modifier & ShiftMask) != 0 ? 1 : 0);
      //        break;

nicolatter-1.7.8/nicolatter/WnnConv.cc

744〜758行目。

    if (key && key->getType() == FUNCTION_KEY) {
        // 制御キー
        if (!level) {
            const CtrlFunc* func = dynamic_cast<const FunctionKey*>(key)->func[level];
            if (func)
                execCtrlFunc(func, &status);
            return status;
        }
        else {
            if (im_state == MI_NYURYOKU)
                return THROUGH;   // [Shift] + カーソルキー
            else
                return NONE;
        }
    }

これを次のように変える。(数行をコメントアウト)

    if (key && key->getType() == FUNCTION_KEY) {
        // 制御キー
//         if (!level) {
               const CtrlFunc* func = dynamic_cast<const FunctionKey*>(key)->func[level];
               if (func)
                   execCtrlFunc(func, &status);
               return status;
//         }
//         else {
//             if (im_state == MI_NYURYOKU)
//                 return THROUGH;   // [Shift] + カーソルキー
//             else
// 	      return NONE;
//         }
    }

724,725行目。

        if (getKeyName2(event.modifier, event.keycode)
                                    == global_prop.kana_key) {

これを次のように変える。

       if (getKeyName2(event.modifier, event.keycode)
	    == global_prop.kana_key ||
	    (event.keycode == 131 && level == 2) ||  //131 = Muhenkan
	    (event.keycode == 129 && level == 1)){   // 129 = Henkan

ちなみにここまでの変更で「英字→日本語」が「変換キー+無変換キー」で できるようになっている。「変換キー+スペースキー」でやりたければ、 上の131を65に変えればいい。

~/.nicolatter/common.keymap

例によって設定ファイルを直接いじる。

「変換+無変換」で「日本語→英字」をやるなら、次のふたつの行について、

        Henkan_Mode     変換

        Muhenkan        無変換

次のように変更する。

        Henkan_Mode     変換    漢字モード      漢字モード

        Muhenkan        無変換  漢字モード      漢字モード

「変換+スペース」でやるなら、次の2つの行を

        Henkan_Mode     変換 
    
        space   変換

次のように変更する。

        Henkan_Mode     変換    漢字モード      漢字モード

        space   変換    漢字モード      漢字モード

たぶんこれで全部。おかしなところあったら教えて下さい。あと、 壊れても責任はとれませんので、自己責任で。 なんせ、ド素人の頭でやってるわけだから。

December 23, 2004

nicolatterの候補一覧をskkinput風に改造中の途中経過 19:21

変換候補一覧から選ぶのに変換キーを連打するよりは、 skkinputや skkように候補に割り当てられたキーを押すことで確定する方が キーを押す回数が少なくて済んで効率的なので、今nicolatter の候補一覧のところを作り変えてる。今のところ、こんな感じ。まだまだですわ。

改造中のnicolatterの候補一覧

このskkの方式は7つの候補にA, S, D, F, J, K, Lのキーが割り振られているので (これらのキーはホームポジションなので手を動かさなくても打てる)、 該当する候補のキーを打てば変換を確定できる。 この7つのなかになければ、変換キーで次の7つが表示される。

これ、早いよ。MS IMEとかも候補に番号がついてて そのキー押せば確定できるけど、なにせ数字キーの位置が遠い(2段も上だなんて)。 それに、表示されてる候補の一覧をぱっと見て該当するものがないと わかっても、次の新しい候補を表示するには何回か変換キーを押して 「下に」移動しなきゃならなかったはず。その動作がskkでは1回の変換キーで できる。あ、でもWinのIMEは頭いいから2、3回変換キー押せば済んでしまうのか……。

December 31, 2004

SEP3エミュを作ってみた 04:52

ソフトウェア実験の最後は実機で動作チェックするわけだが、 いちいちUSBで転送して動作確認するのはめんどくさいなーと思って、 Javaの勉強をかねてSEPボードのエミュレータを作ったよ。 最後の実機チェック以外でも、吐き出した機械語が正しいかどうかの 検証とかにも使えると思う。がんばれA木君。とみんな。

とりあえず前期に作った乗算のプログラムはうまく動いてたみたい。 でもまだまだベータ版。動作おかしかったり要望あったら教えて下さい。 使うかどうか知らんけど。

SEP3エミュレータ→Sep3emu.jar

Javaなんで、JavaのVMが入ってないと動きません。 あと、GUIじゃないんで。ターミナルで使ってね。

使い方

Sep3emu.jarを保存したディレクトリで、次のように使う。

java -jar Sep3emu.jar  走行モード  入力ファイル  開始番地(16進数)

走行モードには、aかbを入れます。

  • a…通常走行
  • b…命令ステップ

走行モードといっても、通常走行はHLTした後のレジスタとLEDの状態を、 命令ステップは命令ごとにその状態を表示するだけです。こんな感じで。

R0 :ffff        (16進数)
R1 :fffe        (16進数)
R2 :2   (16進数)
R3 :10  (16進数)
R4 :1   (16進数)
R5 :1000        (2進数)
R6 :10  (16進数)
R7 :258 (16進数)
LED:0   (16進数)

これで十分だら。

入力ファイルは、説明いらんね。機械語ファイルね。 相対パスなり、絶対パスなり、適当に書く。

開始番地は16進数で書く。200とか。

まとめると、

java -jar Sep3emu.jar a /home/cs20xx/SW-II/test.bin 200

とか

java -jar Sep3emu.jar b ../test.bin 200

とか書けばいい。

注意事項

  • 確実な動作は保証しませんよ。一応テストしたけど、テストケース考えるの苦手だから残念ながら。(不安ならテストに使ったテストケースでも見て)
  • ACKがついたら数字入力して下さい。16進数なら0〜fまで。変なのは入れないで。17進数とかやるやつは知らん。わかってやってるのか、と。
  • SVC, RITは確認してません。だって実験で作ったC言語もどきごときが割り込み命令吐かないでしょ。

実験のコンパイル、アセンブル、エミュレートを1コマンドで 19:46

実験につきまとう面倒くささはまだあった。 コンパイル、アセンブル、エミュレートで3回もコマンドを打たないといけないわけだ。 Cもどき言語のソースを書いて、それをすぐにエミュレートできたらいい。 てことで、シェルスクリプトでやってみた。

まず、コンパイラとアセンブラについて、エラーがあったらreturn -1とかexit(1)とか 、0でない数を返して終わるようにする。 なんでかと言うと、エラーだったらその後のエミュレートとか実行したくないので、 エラーかどうかを知らせて欲しいからだ。

次に、下のシェルスクリプトをsepというファイルに保存する。 下のは俺の設定なので、適宜変えて。

#!/bin/bash

#コンパイラのパス
comp='/home/cs20xx/SW_jikken/SW-II/come'

#アセンブラのパス
asm='/home/cs20xx/SW_jikken/SW-I/asm'

#エミュレータのパス
emu='/home/cs20xx/SW_jikken/Sep3emu.jar'

if [ $# = 3 ]; then

        #$1:入力ファイル  $2:走行モード  $3:開始番地
        $comp $1 > temp.s && $asm temp.s && java -jar $emu $2 temp.bin $3

else
        echo 'Usage: sep inputfile mode startAddr'
fi

変える箇所は、それぞれのパスと、あと実行部分。実行部分は人によって 変わってくるはず。

俺のコンパイラは今のところコンパイル結果を標準出力に出すので、 それをリダイレクトでtemp.sというファイルに保存。 次にtemp.sをアセンブル。するとtemp.binというファイルができるので、 これをエミュレータに渡す。

ちなみに&&でコマンドをつなぐと、前のコマンドが0を返して終わらない限り、 &&のあとのコマンドは実行しない、みたいなので、それを使っている。

まー、例えばコンパイラが出力ファイル名を指定できるなら、こんな感じになりますかね。

$comp $1 outfile.s && $asm outfile.s && java -jar $emu $2 outfile.bin $3

最後に

chmod a+x sep

で、sepに実行権限を与えて出来上がり。

使い方は

sep  Cもどき言語のファイル   走行モード   プログラム開始番地

なので、

./sep  inputfile  a  200

とかやれば実行できます。