読者です 読者をやめる 読者になる 読者になる

Emacs で Markdown のテーブルを整形する

https://github.com/qwerqwer1111/md-table-formatter

Atommarkdown-table-formatter みたいなものが Emacs でも欲しかった. Emacs Lisp で全部実装するのは厳しかったので, shell-command-on-regionPythonスクリプトを呼び出すようにした.

各行のカラム数が異なっていたり, 入力のフォーマットがおかしい場合には整形しないようにしている.

環境

使い方

md-table-formatter.pyをどこかに保存して, ~/.emacs.d/init.elに下記のように記載しておけば, C-x tで選択範囲内のテーブルを整形できる.

(defun md-table-formatter (start end)
 (interactive "r")
 (save-excursion
   (shell-command-on-region start end "python /path/to/md-table-formatter.py" nil t)))
(global-set-key (kbd "C-x t") 'md-table-formatter)

サンプル

入力

|Left align|Center align|Right align|
|:-|:-:|-:|
|Content|Content|Content|
|Content|Content|Content|

出力

| Left align | Center align | Right align |
|:-----------|:------------:|------------:|
| Content    |   Content    |     Content |
| Content    |   Content    |     Content |

ガウス過程メモ

ガウス過程について調べたのでメモしておく. ところどころ間違っているかも知れない.

入力{\mathbf{x}=(x_1, \dots, x_d)^\top\in\mathbb{R}^d}から出力{y\in\mathbb{R}}を予測する回帰関数{y=f(\mathbf{x})}を求めたい. はじめに, {y=f(\mathbf{x})}を, 基底関数{\boldsymbol{\phi}(\mathbf{x})}を用いて, 以下のような線形モデルで表すことにする.
{ \displaystyle
  y=\mathbf{w}^\top\boldsymbol{\phi}(\mathbf{x}).
}
ここで, {\mathbf{w}=(w_0, \dots, w_{M-1})^\top}{M}次元の重みベクトルである. また, 基底関数{\boldsymbol{\phi}(\mathbf{x})=(\phi_1(\mathbf{x}), \dots, \phi_{M-1}(\mathbf{x}))^\top}である.
上述のモデルを{y_1, \dots, y_N}について同時に書くと, 計画行列{\mathbf{\Phi}}を用いて, 次のような{\mathbf{y}=\mathbf{\Phi}\mathbf{w}}の行列形式で記述することができる.
{ \displaystyle
  \begin{pmatrix}
    y_1 \\
    \vdots \\
    y_N
  \end{pmatrix}=\begin{pmatrix}
  \phi_1(\mathbf{x}_1) & \dots & \phi_{M-1}(\mathbf{x}_1) \\
  \vdots & \ddots & \vdots \\
  \phi_1(\mathbf{x}_N) & \dots & \phi_{M-1}(\mathbf{x}_N) \\
  \end{pmatrix}\begin{pmatrix}
    w_1 \\
    \vdots \\
    w_{M-1}
  \end{pmatrix}.
}

次に, 重み{\mathbf{w}}の事前分布として, 以下のような等方ガウス分布を考える.
{ \displaystyle
  \mathbf{w}\sim\mathcal{N}(\mathbf{0}, \alpha^{-1}\mathbf{I}).
}
ここで, {\alpha}は分布の精度を表す超パラメータである. また, {\mathbf{I}}{M\times M}単位行列である. このとき, {\mathbf{y}=\mathbf{\Phi}\mathbf{w}}ガウス分布に従い,
{ \displaystyle
  \mathbb{E}[\mathbf{y}]=\mathbf{\Phi}\mathbb{E}[\mathbf{w}]=\mathbf{0} \\
  \mathrm{cov}[\mathbf{y}]=\mathbb{E}[\mathbf{y}\mathbf{y}^\top]=\mathbf{\Phi}\mathbb{E}[\mathbf{w}\mathbf{w}^\top]\mathbf{\Phi}^\top=\alpha^{-1}\mathbf{\Phi}\mathbf{\Phi}^\top=\mathbf{K}}
となる. ここで, {\mathbf{K}}
{ \displaystyle
  K_{i, j}=k(\mathbf{x}_i, \mathbf{x}_j)=\alpha^{-1}\mathbf{\phi}(\mathbf{x}_i)^\top\mathbf{\phi}(\mathbf{x}_j)
}
を要素にもつグラム行列であり, {k(\mathbf{x}, \mathbf{x}')}カーネル関数である.

上記のモデルは, ガウス過程の1つの例になっている. 一般的にはガウス過程は関数{f(\mathbf{x})}上の確率分布として定義され, 任意の点集合{\mathbf{x}_1, \dots, \mathbf{x}_N}に対する{f(\mathbf{x})}の値の同時分布がガウス分布に従うとしたものである.

ほとんどの応用において, {f(\mathbf{x})}の平均についての事前知識はないため, 対称性からこれをゼロとすることが多い. このとき, ガウス過程は, カーネル関数
{ \displaystyle
  \mathbb{E}[f(\mathbf{x}_i)f(\mathbf{x}_j)]=k(\mathbf{x}_i, \mathbf{x}_j)
}
として与えられる, 任意の2つの{\mathbf{x}}に対する{f(\mathbf{x})}の共分散によって定まる.

また, カーネル関数は必ずしも基底関数の定義を介して導出する必要はなく, カーネル行列{\mathbf{K}}が半正定値性を満たすものであれば自由に定義することができる. 具体的なカーネル関数としてよく使われるものをいくつか挙げる.

{ \displaystyle
  k(\mathbf{x}, \mathbf{x}')=\exp \left(-\frac{\|\mathbf{x}-\mathbf{x}'\|^2}{2\sigma^2}\right).
}

{ \displaystyle
  k(x, x')=\exp(-\theta|x-x'|).
}

回帰等についてはまたそのうち書くつもり.

C++でforの多重ループを抜ける

C++(もしくはC)で多重ループを抜けるにあたって, 面白い方法があることを知ったのでメモしておく. フラグを使ったり関数を作ったりするよりも, 場合によっては便利かも知れない.

#include <cstdio>

int main() {
    int i_max = 4;
    int j_max = 2;
    int k_max = 3;

    for (int i = 0; i < i_max; i++) {
        for (int j = 0; j < j_max; j++) {
            for (int k = 0; k < k_max; k++) {
                printf("%d %d %d\n", i, j, k);
                if (i * j * k >= 2) { // i * j * kが2以上でループを抜ける
                    i = i_max - 1;
                    j = j_max - 1;
                    k = k_max - 1;
                }
            }
        }
    }

    return 0;
}
 ./a.out
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2

Microsoft Sculpt Ergonomic Keyboard を Mac で使う

先日, Sculpt Ergonomic Desktop の US 配列を個人輸入した. Mac で使うにあたっていくつか設定をしたのでメモ.

環境

  • OS X Mavericks v10.9.3

設定内容

システム環境設定からの設定

  1. Caps Lock を Control に変更
    • Control が A の左にあったほうが便利なので変更.
  2. Option を Command に変更
  3. Command を Option に変更
    • Mac の US 配列と同じ並びにするために交換.

KeyRemap4MacBook からの設定

  1. 左右の Command に[英数/かな]を割り当て
    • For Japanese タブ -> 左右のコマンドキーを「英数/かな」としても使う -> コマンドキーの動作を優先モードにチェック
  2. Application を Option に変更
    • Mac の US 配列と同じ並びにするために変更.
  3. Insert を Fn に変更
    • Sculpt Ergonomic Keyboard では Fn キーがスライドスイッチになっていて不便だったので変更.

上記 2. 3. の設定のために private.xml に以下のように記述した.

<?xml version="1.0"?>
<root>
  <item>
    <name>Application to Option</name>
    <identifier>private.app_to_option</identifier>
    <autogen>__KeyToKey__ KeyCode::PC_APPLICATION, KeyCode::OPTION_R</autogen>
  </item>
  <item>
    <name>Help to Fn</name>
    <identifier>private.help_to_fn</identifier>
    <autogen>__KeyToKey__ KeyCode::HELP, KeyCode::FN</autogen>
  </item>
</root>

マウスは Magic Trackpad の方が便利なので現状使っていない.

プロンプトの表示が遅い

いつの間にか, ターミナルを起動してからプロンプトが表示されるまでに数秒かかるようになっていた. ASLログの破損などが原因のようなので, 下記コマンドを実行してすべて削除した後, 再起動して初期化した.

$ sudo rm -f /private/var/log/asl/*.asl

Emacs 24.3 のインストール

環境

  • OS X Mavericks v10.9.2

準備

autoconfのインストール

$ brew install autoconf

ダウンロードと展開

$ wget http://ftp.gnu.org/pub/gnu/emacs/emacs-24.3.tar.xz
$ tar xvf emacs-24.3.tar.xz

インラインパッチの適用

$ svn checkout http://svn.sourceforge.jp/svnroot/macemacsjp/inline_patch/trunk inline_patch
$ cd emacs-24.3
$ patch -p0 < ../inline_patch/emacs-inline.patch

nsfont.mの修正

Mac上のEmacsで和文フォントをデフォルトに設定すると, フレーム幅が2倍になる. そこで, Mac de Emacs総合スレ v6の700を参考にnsfont.mを修正.

/* set up metrics portion of font struct */
font->ascent = lrint([sfont ascender]);
   ||中略
font->underline_thickness = lrint (font_info->underwidth);

    • >追加 font->average_width = font->space_width;

ビルド

$ ./configure --with-ns --without-x
$ make bootstrap
$ make install

nextstep/Emacs.appが生成されているので, /Applicationsなどにコピーする.

Flymakeが落ちる

あるソースファイルを読み込むとFlymakeがエラーとなり, 再度開こうとすると今度はEmacs全体が落ちるといったようなことが多々あった. 設定ファイルに以下のように書いてとりあえず解決.

(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
  (setq flymake-check-was-interrupted t))
(ad-activate 'flymake-post-syntax-check)