15 Jan 2015, 15:59

Emacs Lisp の例外処理について軽く調べてみた

はじめに

さっき, Java の例外処理について調べて見たので, こんどは Emacs Lisp の例外処理について調べてみた.

文法

error

<div class="outline-text-3" id="text-unnumbered-3">
  <p>
    致命的なエラーが発生した時に利用. 実行中の elisp を強制停止.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> (error "%s" "Fatal Error Occured!!!")<br /> [/sourcecode]
  </p>
</div>

signal

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    エラーシンボルとデータを伴って例外をあげる.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> (signal &#8216;wrong-type-argument &#8216;(0))<br /> [/sourcecode]
  </p>

  <p>
    java における throw new HogeException (&#8220;hoge&#8221;);
  </p>
</div>

condition-case

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    エラーを補足する.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> (defun error-test ()<br /> (interactive)<br /> (condition-case error-var<br /> (/ 0 0)<br /> (message "%s" error-var)))<br /> (error-test)<br /> [/sourcecode]
  </p>

  <p>
    java における catch のような役割.
  </p>
</div>

unwind-protect

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    後処理をする.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> (defun error-test2 ()<br /> (interactive)<br /> (unwind-protect<br /> (/ 0 0)<br /> (message "%s" "you shall die!!")))<br /> (error-test)<br /> [/sourcecode]
  </p>

  <p>
    java における finally のような役割.
  </p>
</div>

15 Jan 2015, 15:07

Java の例外処理について徹底的に調べてみた

はじめに

Java 言語で開発をしていて, 例外処理をよく知らないため調べてみた.

自分が仕事で関わっている製品は, (異常なくらい?) 高品質と高信頼性が求められているにも関わらず, 開発者がへなちょこだと, 安心してみんな銀行にお金をあずけられないからね.

例外処理 (Exceptions) とは

そもそも例外処理はなにかを Wikipedia から調べてみる.

例外処理とは,

プログラムがある処理を実行している途中で, なんらかの異常が発生した場合に, 現在の処理を中断 (中止) して, 別の処理を行うこと.

言語サポートについて

<div class="outline-text-3" id="text-unnumbered-3">
  <blockquote>
    <p>
      幾つかのプログラミング言語では組み込みの例外処理機能を用意している.
    </p>
  </blockquote>

  <p>
    言語のサポートがないものとして自分が知っているのは, C 言語.
  </p>

  <p>
    以前 C 言語 & vxWorks で開発していたときは, 致命的なエラーが発生したら kernel の関数をコールすることで, システムを緊急停止するようなことをしていた.
  </p>

  <p>
    ここでのポイントは, 例外とはプログラミング技術の一つで, すべての言語に応用できるということ.
  </p>

  <p>
    この言語では, 例外処理をどうやってサポートしていて, それが Java とはどう違うのかまで考えられるようになりたい.
  </p>
</div>

CTMCP からの引用

<div class="outline-text-3" id="text-unnumbered-4">
  <ul class="org-ul">
    <li>
      try ・・・ 例外ハンドラをもつ例外補足コンテクストを生成.
    </li>
    <li>
      raise ・・・ もっとも内部の例外補足コンテキストへ jamp し, そこにある例外ハンドラを起動.
    </li>
  </ul>

  <p>
    各コンテキストはスタックで管理され, try はスタックの 1 つに marker をつける. raise は marker にジャンプして marker の場所に例外処理のコンテキストを挿入する.
  </p>

  <p>
    CTM p93 参照.
  </p>
</div>

例外の種類

<div class="outline-text-3" id="text-unnumbered-5">
  <ul class="org-ul">
    <li>
      Asynchronous Exceptions: 非同期例外
    </li>
    <li>
      Synchronous Exceptions: 同期例外 <ul class="org-ul">
        <li>
          Traps: 意図的に OS が止める breakpont, systemcall, file open
        </li>
        <li>
          Faults: リカバリ可能な例外, page fault, segmentation fault
        </li>
        <li>
          Aborts: リカバリ不可能な例外, プログラムは強制終了.
        </li>
      </ul>
    </li>
  </ul>
</div>

例外がないと困ること

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    例外をつかわないと, コンテクストごとの結果を検証必要があり, return 文 と case 文が乱立するうんこうんこコードが出来る.
  </p>

  <p>
    例えば, 下位のコンテキスト (A) で発生したエラーは, return -> return -> して上位でも戻り値のエラーチェックが必要.
  </p>

  <p>
    C だど, メモリ獲得できたかの null チェックをよくする.
  </p>

  <p>
    [sourcecode language=&#8221;c&#8221; title=&#8221;&#8221; ]<br /> #define ERROR -1<br /> #define OK 0
  </p>

  <p>
    int main (void) {<br /> if (C ()==ERROR) {<br /> printf (&#8220;Error\n&#8221;);<br /> }<br /> }
  </p>

  <p>
    int A () {<br /> return ERROR;<br /> }
  </p>

  <p>
    int B () {<br /> int ret = A ();
  </p>

  <p>
    if (ret == ERROR) {<br /> return ERROR;<br /> }<br /> else {<br /> return OK;<br /> }<br /> }
  </p>

  <p>
    int C () {<br /> int ret = B ();
  </p>

  <p>
    if (ret == ERROR) {<br /> return ERROR;<br /> }<br /> else {<br /> return OK;<br /> }<br /> }<br /> [/sourcecode]
  </p>

  <p>
    Java ならば, return 文のチェックをする必要がない.
  </p>

  <p>
    [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221; ]<br /> public class ExceptionSample {<br /> static final int ERROR = -1;<br /> static final int OK = 0;
  </p>

  <p>
    public static void main (String args[]) {<br /> try {<br /> C ();<br /> }<br /> catch (Throwable e) {<br /> e.printStackTrace ();<br /> }<br /> }
  </p>

  <p>
    public int A () {<br /> throw new RuntimeException (&#8220;上位のメソッドへ一気にジャ~ンプ ( ̄,  ̄) 丿&#8221;);<br /> return OK;<br /> }
  </p>

  <p>
    public int B () {<br /> A ();<br /> return OK;<br /> }
  </p>

  <p>
    public int C () {<br /> B ();<br /> return OK;<br /> }<br /> }<br /> [/sourcecode]
  </p>
</div>

Java での例外

Java では例外はクラスとして実装する.

文法

<div class="outline-text-3" id="text-unnumbered-8">
</div>

<div id="outline-container-unnumbered-9" class="outline-4">
  <h4 id="unnumbered-9">
    try
  </h4>

  <div class="outline-text-4" id="text-unnumbered-9">
    <p>
      例外を捕まえるための範囲 (コンテキスト) を作る. {}で囲まれた部分がコンテキストになる.
    </p>
  </div>
</div>

<div id="outline-container-unnumbered-10" class="outline-4">
  <h4 id="unnumbered-10">
    catch
  </h4>

  <div class="outline-text-4" id="text-unnumbered-10">
    <p>
      try{}で作成したコンテキスト内で発生した例外を捕まえたあとに 処理する内容を書く. エラーログを吐くとか.
    </p>
  </div>
</div>

<div id="outline-container-unnumbered-11" class="outline-4">
  <h4 id="unnumbered-11">
    finally
  </h4>

  <div class="outline-text-4" id="text-unnumbered-11">
    <p>
      最後にかならず実施したい処理を書く.
    </p>

    <p>
      例えば IO ファイルを Open して処理している途中で異常が発生したとき, ファイルを閉じる処理など.
    </p>
  </div>
</div>

<div id="outline-container-unnumbered-12" class="outline-4">
  <h4 id="unnumbered-12">
    try と catch の例
  </h4>

  <div class="outline-text-4" id="text-unnumbered-12">
    <p>
      try 文には正常系を, catch 文には異常系を書く.
    </p>

    <p>
      こうすることで,
    </p>

    <p>
      <b>正常系のコードと異常系のコードを明確に分ける</b>
    </p>

    <p>
      ことができる (そして, 異常系は後回し&#x2026;)
    </p>

    <p>
      [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221; ]<br /> try {<br /> hoge ()<br /> } catch (FooException e1) { // 例外クラス 変数名<br /> e1.printStackTrace ();<br /> } catch (BarException e2) { // 例外クラス 変数名<br /> e2.printStackTrace ();<br /> } finally {<br /> // 任意<br /> }<br /> [/sourcecode]
    </p>

    <p>
      printStackTrace () メソッドを書くと, 例外発生時のスタックトレースを表示できる.
    </p>
  </div>
</div>

<div id="outline-container-unnumbered-13" class="outline-4">
  <h4 id="unnumbered-13">
    throw
  </h4>

  <div class="outline-text-4" id="text-unnumbered-13">
    <p>
      throw 文をつかうと, 自分で例外を投げることができる. 引数にメッセージをわたすこともできる.
    </p>

    <p>
      [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221; ]<br /> throw new HogeException (&#8220;秘密のメッセージ&#8221;);<br /> [/sourcecode]
    </p>
  </div>
</div>

例外の種類

<div class="outline-text-3" id="text-unnumbered-14">
  <p>
    Throwable クラスを継承するかたちで, 各例外クラスが定義されている. 以下のようなサブクラスで小分類されている.
  </p>

  <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
    <colgroup> <col class="left" /> <col class="left" /> <col class="left" /> </colgroup> <tr>
      <td>
        Error
      </td>

      <td>
        &#xa0;
      </td>

      <td>
        処理の継続不可. 致命的なエラー.
      </td>
    </tr>

    <tr>
      <td>
        Exception
      </td>

      <td>
        検査例外
      </td>

      <td>
        コンパイル時に例外処理の実装が強制される
      </td>
    </tr>

    <tr>
      <td>
        RuntimeException
      </td>

      <td>
        実行時例外
      </td>

      <td>
        コンパイル時に例外処理の実装が強制されません.
      </td>
    </tr>
  </table>
</div>

独自定義の例外

<div class="outline-text-3" id="text-unnumbered-15">
  <p>
    Java の例外はクラスなので, 上のクラスを継承したクラスを定義することで, 独自例外を作成できる.
  </p>

  <p>
    Error と RuntimeException は, Java 仮想マシンが通知してくる特別な 例外なので, 一般のプログラマは, 以下のどちらかで定義.
  </p>

  <ul class="org-ul">
    <li>
      Java API で用意されている Exception のサブクラスを使う
    </li>
    <li>
      <p>
        java.lang.Exception Exception のサブクラスを自分で定義する
      </p>

      <p>
        [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221; ]<br /> class MyException extends Exception {}<br /> [/sourcecode]</li> </ul> 

        <p>
          こんな風にかけば, 上位のコンテキストにエラーコードを渡すことができ る. catch ブロックで発生したエラーによって, 処理を分岐できる.
        </p>

        <p>
          しかし, 分岐するならば, 例外クラスを定義した方がエレガントだ.
        </p>

        <p>
          [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221; ]<br /> import java.lang.Exception;<br /> public class MyErrorSample {<br /> public static void main (String args[]) {<br /> try {<br /> throw new MyException (5);<br /> }<br /> catch (MyException e) {<br /> e.printStackTrace ();<br /> System.out.println (&#8220;ErrorCode = &#8221; + e.getCode ());<br /> }<br /> }<br /> }
        </p>

        <p>
          class MyException extends Exception {<br /> int errorCode;
        </p>

        <p>
          MyException (int errorCode) {<br /> this.errorCode = errorCode;<br /> }
        </p>

        <p>
          int getCode () {<br /> return errorCode;<br /> }<br /> }<br /> [/sourcecode]
        </p>

        <p>
          [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> ErrorCode = 5<br /> [/sourcecode]
        </p></div> 

        <div id="outline-container-unnumbered-16" class="outline-4">
          <h4 id="unnumbered-16">
            Eclipse
          </h4>

          <div class="outline-text-4" id="text-unnumbered-16">
            <p>
              Eclipse では, カスタム例外を作成するための機能がついてる. 簡単に作成できる.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://www.atmarkit.co.jp/ait/articles/1112/20/news131.html">【改訂版】 Eclipse ではじめるプログラミング (24):Java の例外処理で知らないと損する 7 つのテクニック (1/3) &#8211; @ IT</a>
              </li>
            </ul>
          </div>
        </div></div> 

        <div id="outline-container-unnumbered-17" class="outline-3">
          <h3 id="unnumbered-17">
            Java の標準的な例外クラス
          </h3>

          <div class="outline-text-3" id="text-unnumbered-17">
            <p>
              そもそも, この記事を書こうと思ったのは, 例外処理をしたいとき, なにを throw すればいいのかわからなかったから.
            </p>

            <p>
              Effective Java にも, 標準例外を利用するようにと書いてある.
            </p>

            <ul class="org-ul">
              <li>
                みんな知っているから
              </li>
              <li>
                パフォーマンスが軽くなるから
              </li>
            </ul>

            <p>
              標準的に利用される Java の例外を以下にまとめてみる. このくらいならば, 簡単に覚えて使いこなせそうだ.
            </p>

            <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
              <colgroup> <col class="left" /> <col class="left" /> <col class="left" /> </colgroup> <tr>
                <th scope="col">
                  Definition
                </th>

                <th scope="col">
                  Description
                </th>

                <th scope="col">
                  Example
                </th>
              </tr>

              <tr>
                <td>
                  java.lang.IllegalArgumentException
                </td>

                <td>
                  不適切な引数
                </td>

                <td>
                  パラメータエラー
                </td>
              </tr>

              <tr>
                <td>
                  java.lang.IllegalStateException
                </td>

                <td>
                  不正な状態
                </td>

                <td>
                  未初期化で呼び出し
                </td>
              </tr>

              <tr>
                <td>
                  java.lang.NullPointerException.
                </td>

                <td>
                  Null アクセス
                </td>

                <td>
                  &#xa0;
                </td>
              </tr>

              <tr>
                <td>
                  java.lang.IndexOutOfBoundsException
                </td>

                <td>
                  範囲外
                </td>

                <td>
                  配列の Index オーバ
                </td>
              </tr>

              <tr>
                <td>
                  java.util.ConcurrentMdificationException
                </td>

                <td>
                  マルチスレッドアクセス
                </td>

                <td>
                  平行処理漏れ
                </td>
              </tr>

              <tr>
                <td>
                  java.lang.UnsupportedOperationException
                </td>

                <td>
                  未サポート機能
                </td>

                <td>
                  未サポートなのにメソッドが呼ばれた
                </td>
              </tr>
            </table>

            <p>
              自分で利用しないまでも, よくみかける例外が以下にまとまっている. デバッグの友.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://docs.oracle.com/javame/config/cdc/ref-impl/cdc1.1.2/jsr218/ja/java/lang/class-use/Exception.html">クラス java.lang.Exception の使用 (Connected Device Configuration (CDC), バージョン 1.1.2)</a>
              </li>
              <li>
                <a href="http://www.ne.jp/asahi/hishidama/home/tech/java/exception.html">Java 例外メモ (Hishidama&#8217;s Java Exception Memo)</a>
              </li>
            </ul>
          </div>
        </div></div> 

        <div id="outline-container-unnumbered-18" class="outline-2">
          <h2 id="unnumbered-18">
            おわりに
          </h2>

          <div class="outline-text-2" id="text-unnumbered-18">
            <p>
              これで明日からも, 例外処理と戦えそうです&#x2026; はぁ.
            </p>
          </div>
        </div>

        <div id="outline-container-unnumbered-19" class="outline-2">
          <h2 id="unnumbered-19">
            Bookmarks
          </h2>

          <div class="outline-text-2" id="text-unnumbered-19">
            <ul class="org-ul">
              <li>
                <a href="https://moneyforward.com/engineers_blog/2014/08/22/java%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%BB%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/">Java における例外処理のベスト・プラクティス | マネーフォワード エンジニアブログ</a>
              </li>
              <li>
                <a href="http://www.itsenka.com/contents/development/java/exception.html">例外処理 &#8211; Java 入門 &#8211; IT 専科</a>
              </li>
              <li>
                <a href="http://www.ohshiro.tuis.ac.jp/~ohshiro/ooprog_b/04/">オブジェクト指向プログラミング b 第 4 回</a>
              </li>
              <li>
                <a href="http://d.hatena.ne.jp/unageanu/20070830/1188476810">「エラーの原因ごとに例外の型を別ける」のはどうなの? &#8211; うなの日記</a>
              </li>
            </ul>
          </div>
        </div>

11 Jan 2015, 13:25

R のオブジェクトについてのまとめ

はじめに

最近, R 言語を学び始めた. データ型について整理してみた.

Atomic Classes of Objects

R には 5 つのアトミックなオブジェクトがある.

  • charactor
  • numeric (real number)
  • integer
  • complex
  • ligical (true/false)

Basic Objects

もっとも基本的なオブジェクトは vector.

vetor

c で vector を生成する.

a <- c (0.5, 0.6)    # numeric
b <- c (TRUE, FALSE) # logial
c <- 0:5             # integer     
d <- c ("a", "b", "c") #chalactor

型の混合も許す. tuple のような機能も併せ持つ.

a <- (1,7, "a")
b <- (TRUE, "a")
x <- 0:6
class (x)
integer

list

vector の特殊な形. 異なる型の vector を一つにまとめる.

x <- list (1, "a", TRUE, 1 + 4i)
x
1   a   TRUE    1+4i

Matrices

次元の性質をもつ vector. matrix 関数で生成.

m <- matrix (nrow = 2, ncol = 3)
m
nil nil nil
nil nil nil
m <- matrix (1:6, nrow = 2, ncol = 3)
m
1   3   5
2   4   6

dim

dim 関数をつかうと vector に 次元の性質を与えることができる.

m <- 1:10
dim (m) <- c (2,5)
m
1   3   5   7   9
2   4   6   8   10

cbind-ing and rbind-ing

cbind, rbind を利用しても, vector から matrix を生成できる.

x <- 1:3
y <- 10:12
cbind (x, y)
1  10
2  11
3  12
rbind (x,y)
1   2   3
10  11  12

Factors

vector の特殊なかたち. categorical data を扱う.

integer vector について, それぞれの integer に label があるようなもの.

enum 列挙型 ともいえる.factor 関数で作成.

x <- factor (c ("yes", "no", "no", "yes", "no"), labels = c ("yes", "no"))
table (x)
yes 3
no  2

Data Frame

list の特殊なかたち. list の list.

  • list のなかのすべての list が同じ length をもつ必要がある.
  • list の中の list は column とみなされる.
  • list の中の各要素の番号は row とみなされる.

  • 通常は, rad.table (), read.csv によって生成される.

  • data.matrix (x) によって matrix 型に変換できる.

x <- data.frame (foo = 1:4, bar = c (T,T,F,F))
1   TRUE
2   TRUE
3   FALSE
4   FALSE

names

オブジェクトには名前をつけることができる. 可読性を向上させる.

x <- 1:3
names (x) <- c ("foo", "bar", "norf")
x <- 1:3
names (x) <- c ("foo", "bar", "norf")

m <- matrix (1:4 nrow = 2, ncol = 2)
dimname (m) <- list (c ("a", "b"), c ("c", "d"))

Subsetting: 部分集合

サブセット (部分集合).

vector

x <- c ("a", "b", "c", "c", "d", "a")
x[1:4]
a
b
c
c

条件を指定して, 部分を抽出することができる.

x[x > "a"]
b
c
c
d

list

x <- list (foo = 1:4, bar = 0.6)

# index で指定
x[1]

# $で指定
x$bar

Marix

x <- matrix (1:6, 2, 3)
1   3   5
2   4   6

, を利用することで, 行や列だけを vector として抽出.

x[1,]
1
3
5

NA Values を取り除く

complete.cases で調べる.

x <- c (1, 2, NA, 4, NA, 5)
y <- c ("a", "b", NA, "d", NA, "f")
good <- complete.cases (x, y)
good
TRUE
TRUE
FALSE
TRUE
FALSE
TRUE
x[good]

Operations

vector

x <- 1:4, y <- 4:9
x + y
x * y
x / y
x <- matrix (1:4, 2, 2) 
1   3
2   4

matrix

y <- matrix (rep (10, 4), 2, 2)
10  10
10  10
x * y
10  30
20  40

05 Jan 2015, 07:53

Windows コマンド net user / net localgroup で コマンドプロンプトからアカウント管理するメモ

はじめに

2015 年の初仕事は, Windows 2003 サーバの障害復旧から始まった.

結局復旧できない (データロスト??) なので, 明日も頑張ります.

ということで, 明日やることのメモ.

今日は, Windows2003 サーバを再インストールしたので, 明日はユーザとグループを作成し直す. できれば, コマンドラインからやりたい.

コマンド

管理者権限で コマンドプロンプトを起動.

ユーザ管理

net user コマンドを利用する.

ユーザー名 + パスワードを指定して アカウント作成

net user <ユーザ名> /add

net user tsune password /add

アカウント確認

net user tsune

ユーザー名                           tsune
フル ネーム                          西郷隆盛
コメント
ユーザーのコメント
国/ 地域番号                          000 (システム既定)
アカウント有効                       Yes
アカウントの期限                     無期限

最終パスワード変更日時               2015/01/05 15:37:36
パスワード有効期間                   2015/02/16 15:37:36
パスワード次回変更可能日時           2015/01/05 15:37:36
パスワードあり                       Yes
ユーザーによるパスワード変更可能     Yes

ログオン可能なワークステーション     すべて
ログオン スクリプト
ユーザー プロファイル
ホーム ディレクトリ
最終ログオン日時                     なし

ログオン可能時間                     すべて

所属しているローカル グループ        *HomeUsers
                                     *Users
所属しているグローバル グループ      *なし
コマンドは正常に終了しました.

本名も追加

net user tsune password /add /fullname:"西郷隆盛"

グループ管理

net localgroup コマンドを利用する.

グループ新規作成

net localgroup <グループ名> /add /comment:"<テキスト>"]

net localgroup hoge /add /comment:"実験"

グループにユーザを所属させる

net localgroup <グループ名> <ユーザ名> /add

net localgroup hoge tsune /add

ユーザーは次回ログオン時にパスワード変更が必要のオブションを有効にする.

これは, 初期パスワード設定後に, ユーザにパスワード変更を強制するための仕組み.

Windows Vista, Windows Server 2008 以降では, 以下のオプションが利用できる.

net user tsune passoword /add /logonpasswordchg:yes

Windows Server 2003 では??

WSH を利用すればできるぽい.

Bookmarks

04 Jan 2015, 15:00

Immutable Emacs! AWS 上の Ubuntu サーバに ansible で Emacs 環境を自動構築する

はじめに

去年, Immutable Infrastructure という言葉を知った.

この概念を Emacs の管理に利用できないかなとという話.

これをやろうと考えたのは, 去年の 6 月だった. この記事の延長が本記事.

なかなか時間がとれなくて, 結局半年後の冬休みにようやくできた.

問題の分析

問題

<div class="outline-text-3" id="text-unnumbered-3">
  <p>
    Emacs を家でも会社でも利用している.以下が簡単な環境.
  </p>

  <ul class="org-ul">
    <li>
      自宅 <ul class="org-ul">
        <li>
          ArchLinux
        </li>
        <li>
          Widows 8 (GUI 版)
        </li>
      </ul>
    </li>

    <li>
      会社 <ul class="org-ul">
        <li>
          Widows 7 (GUI 版)
        </li>
        <li>
          Windows 7 (Cygwin 版)
        </li>
      </ul>
    </li>
  </ul>

  <p>
    設定を github にあげて, 設定を共有している. 会社で設定ファイルを更新するのは社内規程的に NG なので, いつもは以下のような運用.
  </p>

  <ul class="org-ul">
    <li>
      自宅で設定ファイルを git push
    </li>
    <li>
      会社で設定ファイルを git pull
    </li>
  </ul>

  <p>
    しかし, 自宅で設定したものが会社で動かなかったりすることがよくある.
  </p>

  <p>
    会社で Emacs の設定ファイルを更新した後は, 朝の 30 分は毎回 Emacs と戯れているのはここだけのないしょだ.
  </p>

  <p>
    しかし, 設定の同期作業も, 面倒なのでなんとか時間を短縮できないもの か&#x2026; というのが今回の解決したい問題.
  </p>

  <p>
    また, 1 年に 1 回 くらいの頻度で Emacs 環境を一から再構築することがある. このとき, Emacs の パッケージ管理は el-get を利用して管理しているので, 自動ですべてのパッケージを ネットから落としてきて動作するはず.
  </p>

  <p>
    しかし, 必ず el-get のダウンロードで失敗するパッケージがたくさんでる.
  </p>

  <p>
    会社だと, proxy という厄介なものがある. また, 設定の問題とは思うが, MELPA へアクセスできなく github からしか elisp を取得できない.
  </p>

  <p>
    まとめると,
  </p>

  <ul class="org-ul">
    <li>
      会社で Emacs の設定ファイルを更新したときに 起動時のエラーを発生させなくするためには?
    </li>
    <li>
      Emacs 環境を一から再構築するときに エラーを発生させなくするためには?
    </li>
  </ul>
</div>

課題

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    よくあるあたふたケースは,
  </p>

  <ul class="org-ul">
    <li>
      自宅の Linux 環境で push したものを 会社の windows 環境で pull して動かなくなる.
    </li>
    <li>
      会社で pull をするのが怖いのでしばらく放置した後, 久しぶりに pull すると 大量のエラーが発生する.
    </li>
  </ul>

  <p>
    エラーがあっても放置してしまうのは, 頻繁に エラーの確認をしないから. それは面倒だからしない. エラーの確認作業を自動化できたらうれしい.
  </p>

  <p>
    ということで, 課題は以下.
  </p>

  <ul class="org-ul">
    <li>
      Linux 環境で push したら Windows 環境で pull してエラーチェックを する作業を自動化する.
    </li>
    <li>
      定期的に一から Emacs の設定を再構築する作業を自動化する.
    </li>
  </ul>
</div>

解決策

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    この 自動でエラーをチェックするところを Immutable Infrastracture の概念と 組み合わせたらおもしろそうだと思った. 無駄な勉強にもなるし.
  </p>
</div>

<div id="outline-container-unnumbered-6" class="outline-4">
  <h4 id="unnumbered-6">
    Immutable Infrastructure とは
  </h4>

  <div class="outline-text-4" id="text-unnumbered-6">
    <p>
      簡単に調べてみた.
    </p>

    <p>
      一度サーバーを構築したらその後はサーバーのソフトウェアに変更を加えないこと.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://ja.wikipedia.org/wiki/Immutable_Infrastructure">Immutable Infrastructure &#8211; Wikipedia</a>
      </li>
    </ul>

    <p>
      以下の説明がとてもわかりやすい.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://www.publickey1.jp/blog/14/immutable_infrastructure_1.html">Immutable Infrastructure はアプリケーションのアーキテクチャを変えていく Publickey</a>
      </li>
    </ul>

    <blockquote>
      <p>
        Windows って調子が悪くなると再インストールしてすっきりさせるじゃないで すか. OS にいろんなソフトウェアをインストールしたりカスタマイズしたり すると調子が悪くなりますが, 再インストールすれば戻ります.
      </p>

      <p>
        だったら, そもそも毎回作り直せばシステムはすっきりするよね, というのが 簡単な Immutable Infrastructure の説明です.
      </p>
    </blockquote>
  </div>
</div>

<div id="outline-container-unnumbered-7" class="outline-4">
  <h4 id="unnumbered-7">
    Action Plan
  </h4>

  <div class="outline-text-4" id="text-unnumbered-7">
    <p>
      以下のようなアクションプランを考えた.
    </p>

    <ul class="org-ul">
      <li>
        AWS 上のサーバで Emacs 環境を構築する.
      </li>
      <li>
        AWS 上のサーバで エラチェックーを走らせる.
      </li>
      <li>
        チェックがおわったらサーバを破棄して終了.
      </li>
    </ul>

    <p>
      さらにこの手順の自動化ができたらいいけど, これは大変そうなので今度.
    </p>

    <ul class="org-ul">
      <li>
        git push したら AWS 上で動く サーバで エラチェックーを走らせる.
      </li>
      <li>
        毎週深夜に, Emacs 環境を自動で構築する.
      </li>
    </ul>
  </div>
</div>

解決へのとりくみ

Windows 環境はなにかと難しいとおもったので, まずは, Linux 環境を構築することにした.

というわけで, この記事のゴールは,

AWS 上に Emacs と自分の Emacs の設定を自動でインストールすること

名づけて,

Immutable Emacs! 大作戦.

響きがとても気に入った!

AWS を借りる

<div class="outline-text-3" id="text-unnumbered-9">
  <p>
    別記事に独立.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2847">AWS の Amazon EC2 で Windows サーバを立ち上げて リモートデスクトップ接続してみた | Futurismo</a>
    </li>
  </ul>

  <p>
    ここでは, Ubuntu Server 14.04 LTS (HVM), SSD Volume Type をつかう.
  </p>
</div>

ansible で Amazon AWS に SSH 接続

<div class="outline-text-3" id="text-unnumbered-10">
  <p>
    なれている, ansible を利用する.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2490">自分のデスクトップ環境の歴史を記録する!ansible で設定ファイルをクラウド管理する方法 | Futurismo</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> mkdir -p ~/.emacs.d/playbook<br /> cd ~/.emacs.d/playbook<br /> echo &#8216;54.65.121.127&#8217; >> hosts<br /> [/sourcecode]
  </p>

  <p>
    以下の作業はすべて,~/.emacs.d/playbook で実施.
  </p>

  <p>
    ansible.cfg ファイルを作成.
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> [defaults]<br /> hostfile = ./hosts<br /> remote_user = ubuntu<br /> private_key_file = ~/.ssh/archlinux.pem<br /> host_key_checking = False<br /> [/sourcecode]
  </p>

  <p>
    ping する.
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> ansible all -m ping -i hosts<br /> [/sourcecode]
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> 54.64.58.11 | success >> {<br /> "changed": false,<br /> "ping": "pong"<br /> }<br /> [/sourcecode]
  </p>
</div>

ansible playbook

org-mode で書いたものは, 以下のスクリプトで yaml に変換する.

[sourcecode language=”bash” title=””]
#!/bin/sh
# -*- mode: shell-script -*-
#
# tangle files with org-mode
# see: http://orgmode.org/manual/Batch-execution.html
#
DIR=`pwd`
FILE=""

for i in $@; do
# tangle org to yaml
emacs -Q –batch –eval "(progn
(add-to-list ‘load-path \"/usr/share/emacs/site-lisp/org\")
(require ‘org) (require ‘ob) (require ‘ob-tangle)
(setq org-src-preserve-indentation t)
(find-file (expand-file-name \"$i\" \"$DIR\"))
(org-babel-tangle)
(kill-buffer))" 2>&1 | grep tangled

# execute ansible command to yml file
string_filename=${i##*/}
string_filename_without_extension=${string_filename%.*}
string_path=${i%/*}

if test $string_filename = $i ; then
ansible-playbook ${string_filename_without_extension}.yaml -i hosts
else
ansible-playbook ${string_path}/${string_filename_without_extension}.yaml -i hosts
fi
done
[/sourcecode]

ここからは実際の ansible playbook を書く.

ansible settig

<div class="outline-text-3" id="text-unnumbered-12">
  [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> &#8212;<br /> &#8211; hosts: defaults<br /> sudo: yes<br /> vars:<br /> home_dir: /home/ubuntu<br /> emacs_dir: emacs<br /> dotfiles_dir: dotfiles<br /> tasks:<br /> [/sourcecode]
</div>

initial tools

<div class="outline-text-3" id="text-unnumbered-13">
  <ul class="org-ul">
    <li>
      libncurses5-dev は tputs error 対策
    </li>
    <li>
      gnutls-bin for el-get
    </li>
    <li>
      texinfo for makeinfo
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> &#8211; name: apt-get update<br /> command: apt-get update<br /> &#8211; name: apt-get install git<br /> apt: pkg=git<br /> &#8211; name: apt-get install build tools<br /> apt: pkg=build-essential,autoconf,automake,libncurses5-dev,gnutls-bin,texinfo<br /> [/sourcecode]
  </p>
</div>

<div id="outline-container-unnumbered-14" class="outline-4">
  <h4 id="unnumbered-14">
    bookmarks
  </h4>

  <div class="outline-text-4" id="text-unnumbered-14">
    <ul class="org-ul">
      <li>
        <a href="http://gihyo.jp/admin/serial/01/ubuntu-recipe/0235">第 235 回 Ubuntu 12.04 で Emacs 24.1 を使う:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社</a>
      </li>
      <li>
        <a href="http://emacs.tsutomuonoda.com/emacs24-1-ubuntu-install/">Emacs24.1 を Ubuntu にインストールする | Emacs の elisp インストール・設定・使い方</a>
      </li>
    </ul>
  </div>
</div>

install emacs

<div class="outline-text-3" id="text-unnumbered-15">
  <ul class="org-ul">
    <li>
      <p>
        <a href="http://qiita.com/seizans/items/f5f052aec1592c47767f">Ansible で git clone させる &#8211; Qiita</a>
      </p>

      <p>
        make -j オブションをつけたら, メモリ枯渇で make が停止した.
      </p>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> &#8211; name: get emacs from git repository<br /> git: repo=git://git.savannah.gnu.org/emacs.git dest={{home_dir}}/{{emacs_dir}} accept_hostkey=yes<br /> &#8211; name: make emacs configure file<br /> command: ./autogen.sh chdir={{home_dir}}/{{emacs_dir}}<br /> &#8211; name: make emacs Makefile<br /> command: ./configure &#8211;prefix=/usr/local &#8211;without-makeinfo &#8211;with-x-toolkit=no &#8211;without-all chdir={{home_dir}}/{{emacs_dir}}<br /> &#8211; name: make emacs<br /> command: make chdir={{home_dir}}/{{emacs_dir}}<br /> &#8211; name: install emacs<br /> command: make install chdir={{home_dir}}/{{emacs_dir}}<br /> [/sourcecode]
  </p>
</div>

install dotfiles

<div class="outline-text-3" id="text-unnumbered-16">
  [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> &#8211; name: clone dotfiles<br /> git: repo=https://github.com/tsu-nera/dotfiles.git dest={{home_dir}}/{{dotfiles_dir}}<br /> &#8211; name: make lnlinks<br /> command: ./make_lnlink chdir={{home_dir}}/{{dotfiles_dir}}<br /> sudo: yes<br /> sudo_user: ubuntu<br /> [/sourcecode]
</div>

install additinal tools for emacs

<div class="outline-text-3" id="text-unnumbered-17">
  [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> &#8211; name: install additinal tools for pdf-tools<br /> apt: pkg=libpng-dev,libz-dev,libpoppler-glib-dev,libpoppler-private-dev<br /> &#8211; name: install additinal tools for magit<br /> apt: pkg=texinfo<br /> &#8211; name: install additinal tools for org2blog<br /> apt: pkg=bzr<br /> &#8211; name: install additinal tools for exectable-find<br /> apt: pkg=mercurial<br /> &#8211; name: install additinal tools for cmigemo<br /> apt: pkg=cmigemo<br /> &#8211; name: install additinal tools for ag<br /> apt: pkg=silversearcher-ag<br /> [/sourcecode]
</div>

boot emacs

<div class="outline-text-3" id="text-unnumbered-18">
  <p>
    Emacs の boot に, el-get を利用してパッケージを次々にダウンロードする.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/tsu-nera/dotfiles/blob/master/.emacs.d/inits/00_el-get.org">https://github.com/tsu-nera/dotfiles/blob/master/.emacs.d/inits/00_el-get.org</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> &#8211; name: boot emacs first<br /> command: emacs &#8211;daemon<br /> sudo: yes<br /> sudo_user: ubuntu<br /> # &#8211; name: reboot emacs<br /> # command: emacsclient -e &#8216;(progn (defun yes-or-no-p (p) t) (kill-emacs))&#8217; && emacs &#8211;daemon<br /> # command: emacs &#8211;daemon<br /> # sudo: yes<br /> [/sourcecode]
  </p>
</div>

おわりに

これで AWS 上で動く Ubuntu サーバに Emacs をインストールすることができた.

まだまだ, 改良の余地は大ありだ.まだ, スタート地点.

dotfiles を育てるように, ansible のコードも育てていきたい.

03 Jan 2015, 13:49

org-babel と R の組み合わせがとても心地よい件

はじめに

org-mode と R を 組み合わせたら, 予想外に心地よかったので, メモメモ.

できること

テキスト + コード + グラフ が ひとつのファイルのなかにおさまるのだ.

  • org-mode で書いているテキストの中にコードを埋め込むことができる.
  • org-mode で書いているテキストの中にグラフを埋め込むことができる.
  • org-mode で書いているテキストの中のコードをその場で実行できる.

サンプル

  #+OPTIONS: toc:nil
  * Lab3
  ** 1. 
     Make a histogram to visualize the distribution of Earnings.

  #+name: earnings
  #+begin_src R :file earinings.png :width 600 :height 600 :results graphics :session ex :export both
  bull <- read.csv ("BullRiders.csv")
  earnings <- bull$Earnings
  hist (earnings)
  #+end_src

  #+RESULTS:
  [[file:earinings.png]]

  ** 2. 
     Generate the appropriate descriptive
     statistics for this distribution.

  #+name: earnings-median
  #+begin_src R :session ex :export both
  median (earnings)
  #+end_src

  #+RESULTS:
  : 111147.63

  #+name: earnings-mean
  #+begin_src R :session ex :export both
  max (earnings)
  #+end_src

  #+RESULTS:

: 1464475.61

設定

org-mode からコードを実行する

まずは, 以下の設定が必須

(org-babel-do-load-languages
 'org-babel-load-languages
 '((R . t)
   )
 )

begin_src のところで C-c C-c をたたいて 評価する.

評価するときにいちいち質問されないようにするために,以下を書く.

(setq org-confirm-babel-evaluate nil)

org-mode でファイルをひらくときに,inline-image があれば読み込み.

(add-hook 'org-babel-after-execute-hook 'org-display-inline-images)   
(add-hook 'org-mode-hook 'org-display-inline-images)   

画像変換 : :file earinings.png :width 600 :height 600 :results graphics

グラフを生成するには, org-babel Header に以下をかく.

:file earinings.png :width 600 :height 600 :results graphics 

インタプリタ :session hogehoge

インタプリタをもつ言語では, :session hogehoge を記述することで, hogehoge バッファでセッションが開始する.

なにがうれしいかというと, 複数の code block の間で, 変数を共有することができるのだ.

さいごに

文芸的プログラミング, 普通のプログラミングにはつかいどころがないと 思っていた.絵空事だとおもってた.

R 言語のようにグラフをともなうものにこそ, そのコンセプトは光り輝くのだと思った.

Reproducible Research というバズワードも最近になって話題になった.

これを機会に,もってみんな Emacs と org-mode をつかうべし.

Bookmarks

R 言語と org-mode で Reproducible Research を.

02 Jan 2015, 17:13

conkeror の 黒背景 & ダークテーマ で 目に優しいクールなブラウザをつかおう!

はじめに

ブラウザは conkeror を 利用しています.

今回, 黒背景と黒テーマを偶然にも発見した.

設定したらあまりにもカッコ良かったのでメモする.

黒 Google 検索

白い Google 検索が嫌いだった. 待ってたよ, Dark Google!!

黒背景

ここで手に入る. https://github.com/scottjad/dotfiles/blob/master/.conkerorrc/color-theme.js

カスタマイズを解説した動画もある.

.conkerorrc に color-theme.js に取得した color-theme.js を配置する.

黒テーマ (zenburn)

ここで手に入る.

.conkerorrc/themes/ にチェックアウトした.

.conkerorrc ディレクトリ配下の *.js に以下を.

theme_load_paths.unshift ("~/.conkerorrc/themes/");
theme_unload ("default");
theme_load ("conkeror-theme-zenburn");

02 Jan 2015, 15:41

2015 年の書き初め! Emacs Lisp をはじめて書いてみた

はじめに

今年の目標は, Emacs Lisp がかけるようになること.

というわけで, 新年早々, Emacs Lisp をはじめて書いてみた.

書き初めみたいな. ちなみに, 初夢はなにもみなかった.

はじめて??

はじめて というと, 正確にはウソ.

今までは他人の書いた Code をコピペしたり, 部分的に書き換えたりしながらつかってきた.

今回は, コピペではなく, 文法を理解しつつ書いたという意味で, はじめて.

文法の勉強

まずは, 文法を知らないとなにもできないので,

以下の本のはじめのほうを読む.

書いたもの

もちろん, 他の人の書いたものをベースにして書いた.

ERC で キーワード が呼ばれたら, Growl で通知

Linux では erc-nick-notify があるのだけれども, Windows 環境で 通知する elisp がなかったので,つくってみた.

つくってみたのだが, テストできないので, テストしていないという…

元ネタはこれ.

Windows 環境での Growl の設定は以下を参考にした.

Growl を利用すると, Alt+x, Alt+Shift+x が利用できなくなるという 致命的な問題がある. なんと, M-x が利用できない!

%USERPROFILE%\Local Settings\Application Data\Growl\2.0.0.0\user.config

で Alt+X とかいてあるところをべつのものに修正すればいい.

つくったもの

というわけで, 作成したのは以下.

初仕事は会社で elisp のデバッグだ!!

休憩時間をタイマーではかる

休憩時間に休憩中というメッセージを画面に表示して, 休憩時間を計測する elisp.

こんな感じ.

以下を参考にした.

つくったもの

02 Jan 2015, 10:41

Emacs での eval について調べてみた

はじめに

Elisp を評価 (eval) する方法について調べてみました.

代表的なコマンド

以下の 3 つが代表的.

  • eval-buffer バッファを評価
  • eval-region リージョンを評価
  • eval-last-sexp C-x C-e 最後のかっこを評価

参考:

インタラクティブに評価

こんな感じや, こんな感じに,

片方のウィンドウで評価したら別のウィンドウで動作させたいので, 以下の関数を書いてみた.

(defun my-inf-elisp ()
  (interactive)
  (eval-buffer)
  (if (one-window-p)
    (split-window))
  (other-window 1)
  (eshell)
)
(define-key emacs-lisp-mode-map (kbd "C-c S") 'my-inf-elisp)

01 Jan 2015, 14:54

SKK サーバを利用して Linux 環境で 親指シフト&Google 日本語入力ができた!

はじめに

Google 日本語入力がもっとも変換にすぐれているとおもう. mozc を利用したいところなのだけれども, 自分には mozc をつかえない致命的な問題があった.

それは・・・ 親指シフトに対応していないこと

Windows 環境では, GoogleIME + やまぶきの組み合わせで実現できていた. Linux 環境での IME は, ibus-anthy を利用していた.

しかし, 今日でそれもおわりだ! Linux 環境でも Google 日本語入力をする方法を偶然にも発見してしまった.

それは,SKK を利用するというワザ.

SKK とは

SKK は, IME の一種.

導入手順は過去記事を参照. 親指シフトにも対応している.

SKK Server で Google 日本語入力サーバにアクセスする

SKK Server という機能を利用すると, Google 日本語入力サーバにアクセスすることができる.

ローカル PC で SKK サーバを動かして, 日本語入力サーバにアクセスすることで, 親指シフト入力が出来るようになる.

install

gem install google-ime-skk

install できたら, google-ime-skk を実行する.

ddskk の設定

IP を設定してアクセスする.

(require 'skk-server)
;; 辞書サーバを利用する場合の設定
(setq skk-server-host "0.0.0.0"
      skk-server-prog "google-ime-skk" ;; パスは通っているようだ.
      skk-server-portnum 55100)

;; 辞書サーバが使用不能になると辞書ファイルを 
;; Emacs のバッファに読み込んで 検索を行う.
(setq skk-server-inhibit-startup-server nil) ;; 通信エラー時はローカル辞書を.
(setq skk-server-jisyo "~/.emacs.d/dic/SKK-JISYO.L")

(add-to-list 'skk-search-prog-list
         '(skk-server-completion-search) t)
(add-to-list 'skk-search-prog-list
         '(skk-comp-by-server-completion) t)

;; 一応手動で起動する手段を用意するが, 起動は OS 側で実施する予定
(defun my/boot-skk-server ()
  "Start SKK server"
  (interactive)    
  (unless (skk-server-live-p)
    (async-shell-command skk-server-prog (get-buffer-create "*google-ime-skk*"))
    (setq skkserv-process (skk-open-server-1))
    (when (skk-server-live-p)
      (set-process-coding-system skkserv-process 'utf-8 'utf-8))))

(defun my/skk-close-server ()
  (interactive)
  (when (skk-server-live-p)
    (skk-disconnect-server)
    (kill-process (get-buffer-process "*google-ime-skk*"))
    (message "Server disconnected")))
(add-hook 'kill-emacs-hook 'my/skk-close-server)

おわりに

以前の記事にも書いたのだけれども, どうも SKK の打鍵方法と NICOLA は相性が悪い気がする. 文節のあたまで打鍵をする必要があるため, いままでに比べて打鍵数が増えているきがするのだ.

まだ慣れていないだけの問題なのだろうか??

しばらく様子見だけれども, そのうちどうするかは決定する. いまは, 長い文章を一気に変換できることに快感を覚えている.