Org-mode 7.9.1の新機能(Org Agenda編)

org-mode 7.9.1の新機能、Agenda編です。

変数:org-agenda-sticky

Agendaを付箋のように扱うためのオプションです。
従来のAgendaは、qキーを押すとアジェンダバッファが削除されていました。 org-agenda-stickyを有効にすることで、アジェンダバッファが削除されなくなります。 e2wmを使う時、特定のウィンドウにアジェンダを表示しっぱなしにするために使えそうです。

org-agenda-custom-command-contexts

アジェンダコマンドのコンテキストを設定します。
org-capture-template-contextsと同じように設定すればOKです。
下記の例だと、”p”コマンドはtxtファイルの中でしか使用できません。
(setq org-agenda-custom-commands-contexts
‘((“p” (in-file . “.txt”))))

bulkアクションの変更

kから始まるコマンドは削除され、”バルクアクション”と統合されました。

アジェンダで複数のエントリをマークした後、B sを実行することでタスクをリスケジュールできます。

ポイントが日付の上にある時にkを実行することで、その日付で上書きされたキャプチャが実行されます。

NとPを押すことでアイテムを上/下に移動できるようになりました

コマンド:org-agenda-bulkmark-all

全てのアイテムをマークします。 一括して削除やアーカイブしたい場合に便利ですね。

変数:org-agenda-persistent-marks

有効にすることで、バルクアクションを実行した後もマークが有効なままとなります。

バルクアクションでTODOステータスを間違えて変更した場合等に使えそうです。

org-agenda-skip-timestamp-id-deadline-is-shown

todo-unblocked と nottodo-unblocked

org-agenda-skip-ifという、

アジェンダをカテゴリでフィルタできる

Org-mode 7.9.1の新機能(Org Capture編)

2012-09-03にOrg-modeのバージョン7.9.1がリリースされました。 今回は、キャプチャに追加された新機能を紹介します。

コマンド:org-capture-string

プロンプトで入力した文字列がテンプレートの注釈として挿入されます。

org-captureでは

  1. ‘M-x org-capture’を実行
  2. テンプレートを選択
  3. 入力

ですが、org-capture-stringだと

  1. ‘M-x org-capture-string’を実行
  2. ミニバッファから文字列を入力
  3. テンプレートを選択
  4. 2で入力した文字列が挿入された状態で入力

となります。バッチモードで使う際に便利そうです。

変数:org-capture-templates-contexts

キャプチャのテンプレートが使えるコンテキストを設定できます。 下記のように設定すると、org-modeでキャプチャした時だけ”t”のテンプレートを使うことができるようになります。

scm
(setq org-capture-templates-contexts
'(("t" ((in-mode . "org-mode")))))

コンテキストはデフォルトで4種類用意されています。自分で関数を書けば、かなり柔軟にテンプレートを操作できそうです。 ホスト名、ネットワーク、時間帯等いろいろ条件を設定すれば便利になるでしょう。

  • in-file: マッチするファイルでのみ使用できる
  • in-mode: マッチするモードでのみ使用できる
  • not-in-file: マッチするファイルでは使用できない
  • not-in-mode: マッチするファイルでは使用できない
  • [function]: カスタム関数

テンプレート:%l

リテラルリンクを挿入するためのテンプレートです。 %aはリンクと文言がセットだけど、%lだとリンクしか挿入されません。

変数:org-capture-bookmark

nil以外をセットすると、キャプチャした際に自動的にブックマークに追加します。

テンプレート?%

^{PROMPT}と連携させるようですが、使い方がよくわかりませんでした。

空行挿入の制御

キャプチャした時に、エントリの前か後に空行を挿入するための設定です。

  • :empty-lines-before i

    エントリの前にi行の空行を挿入する

  • :empty-lines-after i

    エントリの後にi行の空行を挿入する

フック:org-capture-prepare-finalize-hook

キャプチャの最終プロセスが始まる前に実行されるフックです。

Linux Native KVM Toolsのメモリ割り当て

LKNTが仮想マシンにメモリをどのように割り当てているのか調べました. 流れとしては,ゲスト作成時にメモリを確保,KVMに確保したメモリを伝える,ゲストが終了する際に確保していたメモリを開放という手順です. 今回はユーザ側のコードですが,いずれはKVMの内部でメモリがどのように扱われているのかも調べてみたいです.

ユーザインタフェース


ユーザがゲストに割り当てるメモリのサイズを指定するにはコマンドライン引数を用います.

メモリ確保


指定した値は,グローバル変数のram_sizeに格納されます.

build-run.c/int kvm_cmd_run

コマンドライン引数で指定しなかった場合どうなるのでしょうか? build-run.cの中でram_sizeに値が格納されているかどうかを確認し,格 納されていない場合はget_ram_size関数で割り当てるメモリサイズを算出 し,ram_sizeに格納します.

build-run.c

get_ram_sizeには使用可能なCPUコア数を渡しています.そして,コア数からメモリサイズを算出します. コア数が2なら,64x(2+3)=320MBとなるようです. ゲストに割り当てられるメモリサイズはマシン全体のメモリサイズにRAM_SIZE_RATIOを掛けたサイズとなります. 算出したメモリサイズが割り当てられる限界値を越えている場合,限界値に修正してram_sizeを返却します.

build.c/host_ram_size

get_ram_sizeの中で呼び出されているhost_ram_size関数はホストマシンのメモリサイズを調べる関数です. sysconf(_SC_PHYS_PAGES)で物理メモリのページ数を取得,sysconf(_SC_PAGE_SIZE)でページサイズをバイト単位で取得します. ページ数xページサイズ=メモリサイズ(バイト)となります. 最後に単位をメガバイトに変更して返却します. メガバイトに変換する時,右シフトを使っています.

build.c

1メガバイト = 1048576バイトで,2進数にすると1048576 = 0b100000000000000000000となります. これを20ビット右シフトすると1になり,バイトからメガバイトへ変換ができるわけです.

build-run.c/int kvm_cmd_run

ゲストに割り当てるメモリのサイズが最小サイズより大きいか,もしくはホストのメモリサイズより大きくなっていないか確認します. 問題なければ,ram_sizeをメガバイトからバイトに戻しています.

KVMへ確保したメモリを登録する

さて,kvmの初期化関数に移動しましょう.

builtin-run.c/kvm_cmd_run

kvm_initは,さらにアーキテクチャ固有のinit関数を呼び出しています.

kvm.c/kvm__init

x86/kvm.c

kvm->ram_sizeにコマンドライン引数から取得した/自動生成したメモリサイズを格納します. ここで,32bitのギャップについてチェックしています.

KVM_32BIT_GAP_SIZEは (768<<20) = 805306368 = 768MB. KVM_32BIT_GAP_STARTは ((1ULL << 32) – KVM_32BIT_GAP_SIZE) = (4294967296 – 768MB) = (4096MB -768MB) = 3328MB.

指定したram_sizeが3328MBより小さい場合,そのサイズをmmapで確保します. ram_sizeが3328MB以上の場合,ram_size+768MBをmmapでマッピングします. メモリのマップに成功した場合,mprotectを使ってkvm->ram_start + KVM_32BIT_GAP_START〜KVM_32BIT_GAP_SIZEのメモリ範囲のアクセス保護を設定しています. PROT_NOTEは,メモリに全くアクセスできない設定となります. メモリのマップに失敗した場合はdieです.

madviceはメモリの利用に関するアドバイスを設定する関数です. kvm->ram_startからkvm->ram_sizeの範囲について,MADV_MERGEABLEに設定しています.MADV_MERGEABLEは,ユーザがマージしてもよいという設定です.

メモリの設定

build-run.cでしばらく先にあるkvm__init_ramでメモリ設定を行います.

builtin-run.c

x86/kvm.c

ここでも32ビットギャップを調べて,結果によって挙動を変えています. メモリサイズが3328MBより小さい場合,ゲストに設定する仮想メモリのサイズにkvm->ram_sizeを,ホストメモリの開始位置にkvm->ram_startを格納し,kvm__register_memを呼び出してVMのメモリの設定を行います.

3328MB以上の場合,仮想メモリのサイズに3328MBを設定してVMのメモリ設定を行い, その後,残りのサイズを再びVMに設定しています.

/kvm.c

ioctlのKVM_SET_USER_MEMORY_REGIONを使い,VMにメモリの変更を許可します.

KVM_SET_USER_MEMORY_REGIONはKVMのAPIです. mem_slotsがマザーボードのメモリスロットに対応するようです. 3328MB以上のメモリを扱う場合は,複数スロットに分割するわけですね. これで,VMがメモリを使えるようになります.

メモリの開放

VMを終了するときにメモリを開放する必要があります.kvm__deleteの中で開放されています.

builtin-run.c

kvm.c

munmapを使い,指定したアドレス範囲のマップを消去するだけのようです.

Emacsのデータストアを見てみる

本記事はEmacs Advent Calendar jp: 2011 : ATNDの23日目です. emacs lispで,keyとvalueを扱う方法について調べていたので,そのま とめです. emacs lispでkey-valueを扱う方法としては,alist(連想リスト), plist(属性リスト),ハッシュテーブルがあるようです. alistとplistはS式を使ったもので,シンプルです.ただ,リストを順番 に見ていくため,計算量は最悪の場合O(n)となり,効率が悪そうです. ハッシュテーブルの場合,計算量はO(1)なので,大量のデータを扱う場 合はplistやalistより速いのですが,データをS式で扱うのではなくハッ シュテーブル型になります. どれを使うかは,用途によるでしょう,plistはユーザが設定を書く時に よく使われますね.

alist(連想リスト)

alist(association list)はコンスセルを用いたリスト.

keyを与えるとkeyとvalueのコンスセルが返ってきます.valueを取り出 すためにcdrを使うのが少し手間な気がします.

plist(属性リスト)

plist(property list)は属性を保持するためのリスト.

個人的に好きなデータ構造です.リストなので扱いやすいためです.

hash table

名前の通り,ハッシュテーブル.

ハッシュテーブルは,今回調べていて初めて存在を知りました.Emacsで 大量のkeyとvalueを扱う場合は素直にハッシュテーブルを使うのがよさ そうですね.

おわりに

EmacsLispでkeyとvalueを扱う構造について紹介しました. Emacs で IPC や RPC (Emacs Advent Calendar jp: 2011) – 技術 日記@kiwanamiのように,emacs lispから外部の言語やDBにアクセスす る試みも行われています.RDBやKVSをemacsから使う日もそう遠くはなさ そうです.

ありえるたんがかわいい

こんにちは,来年の4月からアリエルで8クイーンを書く予定になっている r_takaishiです.Ariel Advent Calendar 2011 : ATNDの22日目です. CTOに誘われたので書くことにしたのですが, 社内ネタを持っていないので,ありえるの中の人であるありえるたん を紹介 します.

twitterでは,ありえるえるあの更新告知をしたり,時々呟いているよう です.ArielAdventCalendarでも記事を書いていて ,なかなか活発ですね.さて,前から気になっていたのですが,ありえるたんのアイコンは こんなアイコンです.

http://a2.twimg.com/profile_images/1374385066/20110529kaeru-ariel-400.jpg

かわいいですね.なぜカエルスーツなのでしょうか?気になります.

http://a0.twimg.com/profile_background_images/145928719/20100907ariel-autamn-500.jpg

カエルスーツを脱ぐとこんな格好のようです.かわいいですね.アリの 触角みたいなのがチャームポイントのようです.

かわいいので,ぜひグッズ化してほしいですね.明日は,闇えるたん さんです.