Island Life

2013/11/11

HHKB + Synergy

HHKB Pro2をLinuxマシンにつないでて、 Synergyを使ってWindowsマシンおよびMacを 操作してるんだけれど、MacのCommandキーをどう入れたら良いのかわからず 不便していた。しかしさすがにその不便さが「設定を調べる面倒くささ」を 上回ってきたので何とかすることに。

設定の組み合わせが色々あるから望む組み合わせを見つけるのが面倒なんだな。 結果だけメモ。

  1. 前提として、Emacs遣いのためAltを多用するので、HHKB Pro2のAltと◇は もともと入れ替えている (Dip SW 5 を ON)
  2. デフォルトのキーボードモード (SW1,SW2ともにOFF) だと、左◇は「無変換」、 右◇は「変換」キーになってるようだ (1.の設定があるので実際のキーは左Altと 右Alt)。キーボードモードをLite Ext.(SW1=OFF, SW2=ON)にすると、 これらがSuperキーになる。
  3. Synergyのconfigで「server(Linux)のsuper」を、「client(Mac)のmeta」にマッピング。 この書き方の順番が結構紛らわしい。
    section: screens
      scherzo:
      toccata:
      etude:
        meta = super
    end
    
    scherzoがLinux、toccataがWindows、etudeがMac。
  4. Ubuntu UnityのデフォルトではSuperキーを押すとdashが立ち上がるが、 このキーの認識はsynergysより手前でインターセプトされるようで、 MacでCommandを使う度にLinux側で画面がちらちらするのが煩わしい。 そこでUnityの方のバインディングを変えておく (Super+Tabにした。)

Tag: Computer

2013/11/11

ピアノレッスン110回目

  • Kapustin: Concerto Etude Op40-1
    • 四分音符=84。2コーラス目のインプロブっぽいフレーズはかなり良くなった。しかし楽譜指定のテンポは144である。かなりムリめだなあ。
  • Ravel: Ondine
    • 一応最後まで超スローで通せるようにはなった。どうやら、かつて暗譜したのを思い出しつつあるようだ。しかし昔と指使いを変えたところ (今はペルルミュテール版を使ってて、右手と左手の分配をかなり参考にしてる) で記憶が混乱するようになった。

Tag: Piano

2013/11/07

マイコン少年

うおぅ、ぱっと見、あなたは私か、と思うくらい似ててびっくりした。

私が同じ頃に作ったのはこんな感じ。

回路図やタイミングチャートなんかも雰囲気が良く似てる。 まだ押入れのどこかにあるはず。

あの頃、ネットで情報交換できたら楽しかっただろうなあ。

Tag: Computer

2013/11/07

コンパイラマクロ

Saggitariusがコンパイラマクロ導入か。

Gaucheにも実は非公開だけどdefine-compiler-macroは備わっている。

コンパイラマクロは、Common Lispで性能が必要なアプリを書いてる時は 多用するので必要性はわかるのだけれど、個人的には言語機能としていまいちだなと感じている。

コンパイラマクロはマクロ展開時という比較的速いステージで呼ばれるため、 使える情報が限られてしまう。マクロと同様に、ソースコードの字面の情報しかわからない。

そこからできることは主にふたつ。

  1. 与えられている引数が即値リテラルの場合に部分評価 (コンパイル時計算できる部分を計算してしまう) ができる。
  2. 関数本体をインライン展開できる。

なんだけど、1については、関数引数に直接リテラルが与えられた場合しか対応できない。

例えばfooにコンパイラマクロがついてるとして、こんなコードがあった場合:

(define-constant *some-constant* ...)

...
(let ([x (constant-expression)])  ; xはset!されてない
  (define (bar y)
    (foo x y))
  ...
  (bar *some-constant*)
  ...)

コンパイラの定数伝搬パス以降であれば、fooの呼び出しが (foo <定数> <定数>) になっている可能性が高いのだけれど、 コンパイラマクロ展開時に見えるのはxyといった変数だけなので、 コンパイラマクロ内で部分評価をすることはできないのだ。

fooをインライン展開すれば、インライン展開パスで一旦コードが展開された後、 定数伝搬パスやlambda liftingパスの後の定数畳み込みによって ある程度コンパイル時計算が進められることが多い。でもインライン展開するだけなら 既にdefine-inlineがある。

define-inlineに比べ、インライン展開のためのコンパイラマクロは、 ほとんど同じようなコードを (手続き本体とコンパイラマクロ展開器の) 2箇所で 書く必要があり、これは大きなデメリットだ。一方だけを直してはまった 苦い思い出の数々。

なので、本当に欲しいのは、ある程度コンパイラのパスが進んで 引数の属性が分かった後に突っ込めるマクロなんだけれど、 そういうことをするにはコンパイラが使ってる内部データ構造を見せないとならないんで そのへんをまだ考えている。うかつに内部データ構造をいじれるようにしちゃうと 後でコンパイラを改良する時に足を引っ張られるから。

「この引数が定数とわかったらこういうパターンで変形せよ」みたいな ルールベースのマクロ (内部データ構造はopaqueにして触らせない) あたりが 落としどころかなあとは思っている。

ただまあ、そっちの方向で複雑にしすぎるとC++みたいなことになりかねないんで、 バランスが難しい。 (最近のC++の機能の多くは、コンパイラにどうやって安全なフックポイントを つけて自分が思うようなコードを吐かせるかって話のように見える。)

Tags: Programming, Gauche

2013/11/02

Greedy goose

らむ太が宿題で不等号をやってた。

不等号は"Greedy goose"と習うらしい。不等号をくちばしに見立てて、greedyだから大きい数の方を食べたくてそっちを向く、というわけ。

ら:でも両方同じ数だったらどうするの?

私:その時は=を使えばいい

ら:ああ、こっちにしようかな、こっちかな、ってなって「ぱきん」ってくちばしが割れちゃうのか

Tag: 生活

More entries ...