Windows 10 で Emacs キーバインディングを利用するための設定のメモ2016年01月31日 11時26分

Windows の操作全般および MS-IME で Emacs のようなキーバインディングを利用するための個人的なメモ。

Ctrl キーの位置調整

Change Key を利用。管理者として実行する。

  • CapsLock → Ctrl (左)
  • カタカナ/ひらがな → Shift (右)
  • 半角/全角 → Esc

XKeymacs の設定

XKeymacs のスナップショットバージョンを利用。Explorer を「管理者として実行」し、その上で C:\Program Files にフォルダをコピー。

dot.xkeymacs

以下の内容でファイル %APPDATA%\dot.xkeymacs (たいていは C:\Users\{user}\AppData\Roaming\dot.xkeymacs) を作成。

(fset 'browser-back [browser-back])
(fset 'browser-forward [browser-forward])
(fset 'find-next [f3])
(fset 'find-previous [?\S-f3])

プロパティの「基本」タブ

  • 「アクティブウィンドウから離れる」の C-z 及び M-F12 を無効化
    • C-z は素通しさせ、「元に戻す」として扱う。
  • 「消去、編集」の C-t 及び C-x C-t を無効化
    • C-t は screen でのメタキーとしてのみ用い、他の用途には使わない。
  • 「その他」の Esc 及び C-[ を無効化
    • メタキーには Alt のみ用い、Esc は Esc としてのみ用いる。
  • 「IME の切替え」の全項目を無効化
    • IME のオン / オフは変換 / 無変換キーで行う。
  • 「その他」の C-x h を無効化
  • 「移動」の C-l、「消去、編集」の C-k、「その他」の C-u を無効化
    • MS-IME に対して「XKeymacs を無効にする」としていても、Firefox など (IME で入力中の文字列を自前で描画するアプリケーション?) では MS-IME での入力中に XKeymacs の設定が適用されてしまうので、MS-IME のキー設定と干渉するものは無効化しておく。
  • 「その他」の C-0 ... C-9 を無効化
    • 誤爆しかしない。必要なコマンドの数を事前に算出し、正しい数値のキーを打つのは私には困難。

プロパティの「詳細」タブ

  • 「その他」の Esc に Ctrl + [ を割り当て
    • C-[ は Meta ではなく単なる Esc として用いる。
  • 「その他」の Temporarily Disable XKeymacs に Ctrl + ; を割り当て
    • C-; C-○ と打つことでネイティブのショートカットキーを利用できる。";" (セミコロン) はホームポジションなので打つのも簡単。
  • 「その他」の Select All に Ctrl + X H を割り当て
    • Firefox Nightly で C-x h が期待通り動作しないので、これをネイティブの「すべて選択」に置換する
  • 「その他」の newline に Ctrl + J を割り当て
  • 「オリジナルコマンド」の browser-back に Meta + , を、browser-forward に Meta + . を、find-next に Ctrl + . を、find-previous に Ctrl + , をそれぞれ割り当て
    • "," (カンマ) は "<" (小なり) すなわち「←」(戻る方向) を、"." (ピリオド) は ">" (大なり) すなわち「→」(進む方向) を、それぞれ表す。

MS-IME の設定

  • 「スペースの入力」を「常に半角」
  • 「Shift キー単独で英数モードに切り替える」を有効化
  • 英数字及び記号類を「常に半角に変換」、ただし「~」のみ「変換しない」

MS-IME のキー設定

インポート / エクスポート機能がなさそうなので、ひとつずつ設定しなおしている。

キー 入力/変換済み文字なし 入力文字のみ 変換済み 候補一覧表示中 文節長変更中 変換済み文節内入力文字 備考
無変換 IME-オフ 全消去 文節戻し 候補閉 文節戻し 全戻し 何もなければ IME オフ、ほかは Esc と同じ
Shift + 無変換 かな切替 かな切替 かな切替 かな切替 かな切替 かな切替
変換 IME-オン 何もなければ IME オン、ほかは変更なし
Ctrl + 変換 再変換 何もなければ再変換、ほかは変更なし
Ctrl + A 文字先頭 文節先頭 候補先頭 - 文字先頭 Home と大体同じ
Ctrl + B 文字左 文節左or文字左 文節左or文字左 文節左 文字左 「←」と同じ
Ctrl + C - - - - - 握りつぶす
Ctrl + D 1文字削除 1文字削除 候補閉 - 1文字削除 Delete と同じ
Ctrl + E 文字末尾 文節末尾 候補最後 - 文字末尾 End と大体同じ
Ctrl + F 文字右 文節右 文節右 文節右 文字右 「→」と同じ
Ctrl + G 全消去 文節戻し 候補閉 文節戻し 全戻し Esc と同じ
Ctrl + I 予測候補表示 - 候補表示切替 - - Tab と同じ
Ctrl + J 全確定 全確定 候補選択+確定 全確定 全確定 Enter と同じ
Ctrl + N 全変換 変換+次 変換+次 文節変換 全変換
Ctrl + P 全変換 前候補 前候補 文節変換 全変換
Ctrl + Q - - - - - 握りつぶす
Ctrl + R - - - - - 握りつぶす
Ctrl + S - - - - - 握りつぶす
Ctrl + U カタカナ カタカナ カタカナ カタカナ カタカナ
Ctrl + V - - - - - 握りつぶす
Ctrl + W - - - - - 握りつぶす
Ctrl + X - - - - - 握りつぶす

Ctrl + H/K/L/M/O/T/Y/Z は変更なし。

MS-IME のキー設定の「機能選択」には「-」という項目がふたつ存在するが、先頭のものは MS-IME を利用しているアプリケーション側にそのキーを伝え、末尾のものは MS-IME 内でそのキーを握りつぶす。

はてなでコードを書くときに気をつけていること2011年12月18日 14時37分

こんにちは、はてなでアプリケーションエンジニアをしている nanto_vi です。この記事は Hatena::Staff Advent Calendar 2011 の一環として書いています。Advent Calendar の会場ははてなブログとなっていますが、主催の antipop さんに尋ねたところ何でもよいというような返答があったのでここで書きます。

はじめに謝っておきますが、この記事ははてなとほとんど関係がありません。タイトルに「はてな」と入っているのは Advent Calendar の要件を満たすための目くらましあり、内容はといえばはてなのノウハウでもなんでもない、私が最近個人的に心がけていることです。ごめんなさい。

できれば明示的に

業務で書くコードは複数人により読み書きされメンテナンスされるので、わかりやすさが重要になってきます。わかりやすさを保つためには暗黙的に行われる操作を減らし、明示的にコードに表した方がよいと感じます。たとえば、Perl では、

use Encode;

# encode_utf8 関数は Encode モジュールで定義されている
my $octets = encode_utf8 $string;

のようにモジュール読み込み時に自動的に関数をインポートすることができますが、それよりも、

use Encode qw/encode_utf8/;

my $octets = encode_utf8 $string;

のようにインポートする関数を明示的に指定したほうが、その関数がどこで定義されているのかわかりやすいでしょう。

個人的には、関数や変数の名前で grep をかけてその定義(外部で定義されている場合は宣言)を探し出せることが、「明示的」であるための最低線ではないかと思います。

入力には正規化を、出力には符号化を

アプリケーションを作るうえで入出力の扱いは避けて通れません。入力元はユーザーだったりバッチ処理スクリプトの引数だったり、出力先はユーザーだったりデータベースサーバーだったりしますが、いずれにおいても入力には正規化処理を、出力には符号化処理を、それぞれ施すことになります。

正規化は一般に不可逆です。空白文字類をすべてスペースに置換した後はもともとスペース以外の空白文字が含まれていたのかわかりませんし、数値「42」を生み出した入力は "42" でも "42.0" でも、はたまた "0x2A" でもありえます。

符号化は一般に可逆です。あるデータをユーザーのもとへ送り届けるのに、そのデータを HTML のテキストとして扱えるよう一部文字を文字参照の形に符号化し、その HTML ソース全体を文字符号化方式 UTF-8 をもって符号化し、さらには HTTP メッセージに、TCP のセッションに、IP のパケットにと符号化を重ねていきますが、それらすべては符号化規則を逆に適用することで元の形式へ復元できます。

たとえば HTML として解析され、その結果が JavaScript の文字列として、HTML として、URI としてと順に解析されるデータを Template-Toolkit で出力する場合、解析の逆順でそれぞの形式に応じた符号化を施す必要があります。

<script type="text/javascript">
document.write('<a href="/search?q=[% word | uri | html | js %]">検索<\/a>');
</script>

script 要素の内容は CDATA 型であり文字参照は解決されないので、最後に html フィルタをかけることはしません。また、そもそもこのような多重にフィルタをかける事態は避けたほうが賢明でしょう。

入出力いずれにおいても、データがどういう形式で扱われるのかを意識し、それに応じた正規化処理または符号化処理を施すことで、意図しない入力が致命的な挙動を引き起こすこともある程度は防げるのではないかと考えます。

次は hitode909 さんです。

LiveCoding #6 の 22009年07月19日 23時40分

OSC Kansai に出た帰りに satzz 君に電話したら、ちょうど LiveCoding #6 をやっているとのことだったのでその足で寄ってきました。前回も第 6 回だった気がするのは何かの間違いでしょうか。

LiveCoding とはプログラミングの実演と実況を楽しみましょうというイベントで、出てくる言語も C から PHP まで色とりどり。まともとは思えないテクニックも多々披露されたわけですが、中でも驚愕だったのが ujihisa さんが書いた Ruby のコード、

def fib n, x = (n < 2) ? n : fib(n - 1) + fib(n - 2)
  x
end

fib 10 # => 55

Ruby ではデフォルト引数内で再帰呼び出しができるだなんてちっとも知りませんでした。

飛び入り LiveCoder も大歓迎といわれ、その特典である参加費 (お寿司 + カレー代 + etc.) キャッシュバックを目当てに手を挙げたのですが、ネタが思い浮かばず、bit.ly API の存在を教えてもらって「Web ページ閲覧中にリンク先が bit.ly 経由で何回クリックされたかを表示する Greasemonkey スクリプト」を作ることにしました。

[図: リンク先へのクリック回数を表示する Greasemonkey スクリプト]

Greasemonkey スクリプトでは let を使えないのについ let と打ってしまって var と打ち直したり、Greasemonkey と bit.ly と wedata の API リファレンスを読みふけったり、E4X で構築した要素を手っ取り早く使うために innerHTML を使おうと思ったら、そもそも要素を作成する必要がないことがわかって単なるテキストを innerHTML に代入する羽目になったり、それならとテキストノードを直接生成するように書き換えたりしているうちに制限時間 20 分はあっという間に過ぎ、45 分かけてどうにか動くものができるという有様。動くのは LDRize 対応サイトのみ、利用するには Firefox 3.5 以上と bit.ly のアカウントが必要です。

その場で cho45 が「こういうときは JSDeferred を使えば」とプッシュしていた気がするので、後日 JSDeferred を使って書き直してみました。JSDeferred をうまいこと使えているかは不明ですが。

ちなみに Greasemonkey スクリプトで let が使えないというのは、Components.utils.evalInSandbox で JavaScript のバージョンが指定できないという制限によるものです。この仕様は Firefox 3.5 で改善され、適切なバージョンを指定すればサンドボックス内でも letyield を使えるようになりましたが、Greasemonkey 側はまだ対応していません。

コーディングが終わった後はまったり過ごしていましたが、JSDeferred のロゴを作れば女子高生の間で JSDeferred が流行るんじゃないかという話になったため、実際に作ってみましたsecondlife さんに「何この 5 秒で描いたような」と dis られましたが、30 秒はかかっています。JSDeferred のトップページにもこのロゴを貼り付けたので、ナウなヤングにバカウケ間違い無しですね。

それと、Gist で Greasemonkey スクリプトを管理しようという話を聞きますが、皆さん具体的にどうやって管理しているんでしょうか? とりあえず Greasemonkey スクリプトを書いた後、gisty で投稿してそれを git remote で引っ張ってきてとやったのですが、これでいいのかよくわかりません (環境は Cygwin + Meadow)。

$ cd FIREFOX_PROFILE_DIR
$ cd gm_scripts/bitly_referred/
$ ls
bitly_referred.user.js
$ gisty post bitly_referred.user.js
Initialized empty Git repository in GISTY_DIR/149553/.git/
$ git init
$ git remote add origin git@gist.github.com:149553.git
$ git pull origin master
$ cat > .gitignore
*
!*.user.js
$ meadoww bitly_referred.user.js
$ git add .
$ git commit -m "Rewrite with JSDeferred"
$ git push

セキュリティ & プログラミングキャンプ・キャラバン 2008 京都2009年02月11日 16時54分

セキュリティ & プログラミングキャンプ・キャラバン 2008 京都に行ってきました。セキュリティ & プログラミングキャンプとは、IT 分野において優秀な若者の発掘・育成を目的として、22 歳以下の学生を対象に毎年夏に行われている合宿 (参加費無料) です。中学生の参加者もおり、普段はなかなかできないコンピュータの話題で盛り上がるそうです。

キャラバンはキャンプの紹介のためのイベントで、プログラミングとセキュリティに関する講義や昨年のキャンプの様子の公開などがありました。詳しい内容については「セキュリティ&プログラミングキャンプキャラバン2008 レポート - y_tsuda's blog - s21g」やそこからとだれるページ、はてなブックマークで「caravan2008」タグをつけられたページなどを参照してください。

個人的に印象に残ったのは、「セキュリティ & プログラミングキャンプの選考に受かるコツは?」という質問に対する回答です。絶対的なコツはないという前置きの下で、自分から情報発信をすること、活動が見えないと評価ができないという話でした。キャンプの選考に限らず、IT 分野において情報の発信は非常に重要だと思います。

私の場合、WEB+DB PRESS に連載を持たせていただいたり、はてなインターンに参加させていただいたりということがありました。こうした機会を得られたのは、ちょうど Ajax ブームが起きて JavaScript に注目が集まったという「タイミングがよかった」面もありますが、ひとつ確実にいえるのは、このブログを書いていなければそのような機会はなかったということです。

現在個人が情報発信する場として代表的なのはブログですが、ブログでは何かすごいことを書かないといけないというようなことはまったくありません。わからないなら何がわからないのか書けばいいのです。勉強会に行こうという話もありましたが、勉強会に行って何が楽しかったかブログに書くだけでもずいぶん違うと思います。私自身は筆不精でついついブログの更新が滞りがちなのですが (^^;)、そうしたブログを読んでいくのは楽しいし、新たな気づきが得られることもたくさんあります。

そのほかキャラバンでは、セキュリティ & プログラミングキャンプは 22 歳以下だけど、大学院生も参加できる IT Keys という取り組みもあるという話、脆弱性を報告したが製造者から「仕様です」と言われたときに、引き下がって愚痴るのではなく製造者やコミュニティに働きかけて悪い仕様を良い仕様に変えていこうという話がありました。

全体を通して主催者側のキャンプにかける意気込みが伝わってきて、若年層にはぜひキャンプに参加してほしいと感じました。同じ志を持った同年代の人たちと知り合えるというだけでも刺激的な体験になると思います。また、このような取り組みが今後も継続していけるよう、自分にできることがあれば積極的に協力していきたいです。

最後に、勉強会に行こうという話があったといいましたが、現在私が参加している主な勉強会に、関西の JavaScript 勉強会 Kanasan.JSSICP 読書会 (こちらは最近タイミングが合わずご無沙汰していますが) があります。Kanasan.JS の方はこの 2 月 22 日 (日曜日) に Greasemonkey チュートリアル読書会が開かれるので、お近くにお住まいの方はぜひ参加してみませんか。午前中には同会場で Haskell 勉強会 実践編も開かれます。

第 7 回アルゴリズムイントロダクション輪講会資料2008年12月04日 23時08分

すでにニュースでも伝えられている通り、12 月 1 日に第 7 回アルゴリズムイントロダクション輪講会がありました。今回の担当は私だったので、その発表資料を公開します。

  1. 中央値と順序統計量 (その 1)
    1. 予定
    2. 順序統計量とは
    3. 選択問題とは
    4. 最小値と最大値
    5. 平均線形時間選択アルゴリズム
  2. 中央値と順序統計量 (その 2)
    1. 最悪線形時間選択アルゴリズム
    2. 3 つずつのグループに分割した場合
    3. 7 つずつのグループに分割した場合
    4. 参考文献
  3. 中央値と順序統計量 (補足)
    1. 4 つずつのグループに分割した場合
    2. 6 つずつのグループに分割した場合
    3. Lazy-Select
    4. Randomized-Partition
    5. スタッフロール

「どうせ後から Web で公開するんだから、PDF とか見るのに手間がかかるものは使ってられないよね。やっぱ時代は XML 複合文書でしょ!」と、数式を表現するのに MathML を使いまくったら、なぜか Firefox 以外ではまともに表示されなくなってしまいました。ホスト言語が XHTML なので、IE にいたっては地の文の表示すらできません。

とは言っても MathML の仕様書を斜め読みしただけなので、適切でないマークアップが結構含まれています。本当は図も SVG で表現したかったのですが、いろいろと余裕がなかったのであきらめました。資料が 3 つ (本番では補足を除く 2 つ) の文書に分かれているのは、Firefox で MathML の要素数が一定数を越えると、文字揃えが効かなくなるというバグに遭遇したためです。

なお、MathML の記述に当たっては以下を参考にしました。

ちなみに私は今のところ風邪の症状は出ていないようです。