エディタの最小構成を考えてみる

プログラミング初心者にはツールの使い方をいろいろと注入するのが効率がいいと思っている昨今、プログラミングツールのど真ん中であるエディタについていろいろ考えている。初心者に薦められるプログラミング向きのエディタを考えるその1。

とりあえずはPerlPHPあたりでWeb開発する話に限定しておく。ちなみに著者は普段はNTEmacsCarbon Emacsを主に使っているけど、vimサクラエディタ、メモ帳もたまに使っている。

必要な機能

インデントが深いほど必須度が低く、マニアック度が高く、普及率が低いイメージでまとめてある。必ずしもちゃんと構造になっていない部分あり。

文字コードまわり
  • 任意の文字コードのファイルをちゃんとよめる
    • 自動認識できる
      • 絵文字も表示できる
    • 任意の文字コードに変換して保存できる
言語系
  • シンタクスハイライト
  • 自動インデント
編集機能
  • キーボードマクロ
    • マクロ言語
  • 矩形編集
検索・置換

NTEmacsを評価する

NTEmacsでは「絵文字の表示」ができていない。

他に考えるツールのリスト
  • ターミナル
  • ブラウザ
  • その他

Microsoft ResearchのTechnical ReportにSSDのパフォーマンス・コストに関する詳細な調査記事があった。(まだ書き途中)

http://research.microsoft.com/apps/pubs/default.aspx?id=76522 (リンク先からPDFがダウンロードできる)
12ページもあってきっちりとは読んでないのだが、ざっくりとメモを。主語が省略されている部分はSSDのことです。

注意:まだ大事な部分を読めていません。

      • -

1章

  • 実際のエンタープライズ利用での負荷分析を現状での市場価格によるコストの面と電力消費を考慮して検討した。
    • disk only
    • ssd only
    • hybrid(HDDとDRAMの中間層に設置するキャッシュとしてSSDを使う:後述)
  • 冷却、ネットワーク、エンクロージャコスト等は範囲外。
  • バイト単位のコストが1〜3桁下がれば完全に置き換わることになるが、完全な置き換えを待つまでもなく、キャッシュ層として使うのであれば短中期的にも魅力的な選択肢になる。
  • キャッシュ層での利用では25%程度の性能向上で、現状の価格でも10%程度のコストメリットがある。
  • SSDはwrite-ahead log に使うのにとても向いている。レスポンスタイムが大事で、大容量、広帯域は求められないから。
  • 導入コストが高いので消費電力抑制は十分にペイしない。この点に期待して移行するほどの効果はない。
  • 消費電力あたりの容量、パフォーマンスはSATAディスクと大きく変わらない。
  • 金銭コストあたりの容量、パフォーマンスはSSDやenterprise disks(SASとか?)よりSATAの方がずっとよい。(信頼性とのトレードオフは当然ある)

2章

SSD
  • SATASCSIと同じようなインターフェースのblock I/O デバイス
  • 機械動作を伴わないデータアクセスなのでシークタイムが無く高速。レイテンシはディスク装置が数ミリ秒以上かかるのに対し、1ミリ秒以下。
  • 現状で購入できるものは全てNANDフラッシュメモリベース。
  • 将来的に使われるかもしれないものに磁気RAM (M-RAM)やphase change memory(PCM:Intelが2008年に発表)などがある。
  • 比較対象にしているのはNAND のSSDだけだが、他のメモリにも適用可能。
  • NANDメモリの弱点
    • small in-place updatesが遅い。(書き換え時に64-128KB単位でいったん消去する必要があるため)
    • →ブロックインターフェースレベルではランダムアクセスwriteが遅い。
    • →remap技術でsequential write に置き換えることで、解消できる。(Agrawal et al. 2008;Birrel et al. 2007;Woodhouse 2001)
    • 摩耗する(wear)
    • 10,000〜100,000回程度の書き換え寿命がある
    • wear-leveling 技術(Gal and Toledo 2005)で、均等に書き込むことで延命
  • remap や wear-leveling には小さいながらもオーバーヘッドがある。(追加の書き込みオペレーション、compaction、フラグメンテーション)
エンタープライズ利用での負荷分析(enterprise workload traces)

traceの情報収集はブロックデバイスレベルで行われた(バッファキャッシュのレイヤよりは下で、ストレージレイヤよりは上)

  • 14サーバの45ボリューム
  • DB、ファイルサーバ、Webサーバ、プリントサーバ等
    • 期間は一週間
    • RAID1やRAID5
    • 1週間で434 million requests, of which 70% were reads(メールサーバを除外)
  • メールサーバ
    • 期間は1日
    • exchange volume はRAID10
    • 102disks in exchange volume
    • 61 million requests, of which 43 are reads
  • OLTPは対象外(残念…)
関連研究
  • 組み込み&SSD向けにB-Tree(Nath and Kansal 2007; Wu et al. 2004)やハッシュ構造 (Zeinalipour-Yazti et al. 2005)の最適化を検討
  • データベースのレイアウトをフラッシュメモリに最適化(Lee et al. 2008)
  • などなど。他は本文を参照。

3章

特にこの辺、訳しにくい部分はすっ飛ばしています。

workloadのパラメータ

  • 容量
  • ランダムアクセスread
  • ランダムアクセスwrite
  • ランダムアクセスI/O(read/write混在状況での性能)
  • シーケンシャルread
  • シーケンシャルwrite
  • 可用性
  • 信頼性


バイスのパラメータ

  • 容量
  • パフォーマンス(IOPS, MB/s)
  • MTBF
  • 摩耗率(SSD)(GB/day)
  • 消費電力
  • 調達費用

SSDは本来はsequential I/Oや random read に比べるとrandom writeがずっと遅いが、block-level remapping(上で出てきた)やlog-structured file system (Rosenblum and Ousterhout 1991;Woodhouse 2001)で緩和できる。

log-cleaningやremapの並び替え等はバックグラウンド処理で十分に賄えるらしい。

SSDをキャッシュ層で使う」という構成の内容がここに図示されていた。
要は

  1. ディスクに対する直接の書き込みは行わず、SSDにWALとして書き込む。
  2. SSD上のWALから徐々にディスクに書き出す
  3. READが発生したらまずSSD上のRead Cacheを確認し、HITすればそのままREAD、MISSであればディスクから読む。
  4. Read CacheはWAL書き込みと同時にSSDに書き込んでおく

という構成だ。いわゆる「ハイブリッドHDD」がやっているような構成を複数台で構成している感じ(Milleret al. 2001; Panabaker 2006)。
今回の測定実験ではこういった処理はブロックレベルで透過的に行われ、ファイルシステムやアプリケーションの変更はない。
SSDとHDDを使った透過的WALは (Narayanan et al. 2008b)を参照。

Postboxがすごい(かもしれない)

Thunderbirdを使っていたのだけど、最後に残った不満は検索機能だった。(主に全文検索があまり早くないことが不満。)
Postboxでは明示的に全文検索インデクスを作る機能があるので、おそらく高速に動くのではと期待している。欲を言えばそれ(インデクス作成)すらバックグラウンドでよしなにやってほしいのだが。

本当にすごいかどうかは週明けに会社で試す。
http://www.postbox-inc.com/

参考記事:
Mozilla Re-Mix: Thunderbirdベースのクールなメールクライアント「POSTBOX」
http://mozilla-remix.seesaa.net/article/114218781.html

      • -

日本語で本文が検索できないらしい。orz
http://d.hatena.ne.jp/Rockridge/20090211/1234321097

自分用メモcygwinインストール

久しぶりにcygwinを使っている。

  1. setup.exeを起動
  2. ftp.jaist.ac.jp
  3. 全部デフォルト
  4. zip unzip make gcc gcc-g++ gcc4 gcc4-g++ binutils cvs subversion vimなどを追加(diffutils wget が漏れていた。)
  5. Strawberry Perlはもともと入っている(ただしcygwin 上では cygwin perl を使うことにした)
  6. ユーザ環境変数 PATH に C:\cygwin\bin;C:\cygwin\usr\bin;C:\cygwin\usr\local\binを追加
  7. mkpasswd -l > /etc/passwd
  8. mkgroup -l > /etc/group
  9. PuTTY + cygterm の設定をする http://d.hatena.ne.jp/ymotongpoo/20071116/1195194547
  10. alias ls='ls -hF --color=tty --show-control-chars'→日本語のファイル名も表示できた。
  11. 今度なんか作る
  12. デフォルトのPS1はアレなので、
export PS1='\[\e[33m\]\w \$\[\e[0m\] '

する

10年間 Emacs を使い続けてきた俺が最後にたどり着いたキーバインド

変態キーバインドが嫌いな方へ

俺がおすすめできるのは↓ぐらいです。


(global-set-key [C-delete]
'(lambda() (interactive)(kill-buffer (buffer-name))))

本題

完全に参考記事(下部に掲載)にインスパイアされています。

要するに

  • ↑←↓→をwindmove の up,down,left,right (split した windowを渡り歩く)
  • Shift+ → or ← はwindowを左右に分割
  • Shift+ ↑はwindowを上下に分割
  • Shift+ ↓は分割を解除
  • Ctrl + ← or → で Elscreen の←→移動

これを設定します。

あとC-[DEL] に(lambda() (interactive)(kill-buffer (buffer-name)))
を割り当てるのは我ながら結構気に入ってます。
要は削除するバッファ名を指定するまでもなく、カレントバッファを消すってことです。

↓ここからコピペしてください。


(global-set-key [S-right] 'split-window-horizontally)
(global-set-key [S-left] 'split-window-horizontally)
(define-key global-map [S-up] 'split-window-vertically)
(define-key global-map [S-down] 'delete-other-windows)

(global-set-key [right] 'windmove-right)
(global-set-key [left] 'windmove-left)
(define-key global-map [up] 'windmove-up)
(define-key global-map [down] 'windmove-down)

(global-set-key [C-backspace] 'switch-to-buffer)
(global-set-key [C-delete] '(lambda() (interactive)(kill-buffer (buffer-name))))

(global-set-key [C-right] 'elscreen-next)
(global-set-key [C-left] 'elscreen-previous)

(global-set-key [C-return] 'find-file)

まあ、その、タイトルは釣りなんだ・・・

おととい初めてやった設定だしHAHAHA!

参考記事

今日 (windmove-default-keybindings) で shift + カーソルキーで分割したウィンドウが移動できることを知って驚愕してます。

Emacs ユーザーの方に質問です。これは便利! と思える elisp プ… - 人力検索はてな

カーソルキーを押すと、右手全体が微妙にホームポジションから離れてしまいますから、入力中に割り込んでくるような機能ですと、ダルくてやってられません。

改行も削除もカーソルの移動も、入力中に使う機能ですから、ダルい感じになっちゃうわけです。

ですから一旦は入力から離れるような機能を、割当てれば良いということになります。

僕の場合は、ウィンドウを分割したり、バッファを切り替えたり、ファイルを読み込んだりしている時というのは、入力をすることから離れている状態です。

そんなわけで、こういう感じにしました。


(global-set-key [right] 'split-window-horizontally);;右カーソルを横方向分割に割り当て
(global-set-key [left] 'split-window-horizontally);;右とか左とか覚えられないので、左カーソルも横方向分割に割り当て
(define-key global-map [up] 'split-window-vertically);;上カーソルを縦方向分割に割り当て
(define-key global-map [down] 'delete-other-windows);;下カーソルを分割削除に割り当て、上と下くらいなら覚えられるよ
(global-set-key [C-backspace] 'other-window);;分割したウィンドウを移動
(global-set-key [backspace] 'escreen-goto-next-screen);;escreen で次の screen に移動
(global-set-key [C-return] 'muse-project-find-file);;muse のファイルを開く的な機能、C-x + C-f とかほとんど使わんくなったよ

http://d.hatena.ne.jp/kotorikotoriko/20081103/1225687600