29 Jan 2015, 12:53

WireShark で SMB/CIFS のパケット解析をするときの便利 Tips

はじめに

仕事で SMB プロトコルのパケット解析ばかりするようになってきた.

少し Tips がたまってきたので, 忘れないうちにメモしようと思う. SMB2 限定.

かなりニッチな内容だけれども, いつかどこかで誰かの役に立つことを願う.

検索を利用する

Ctrl + F で検索窓か開くので, キーワードから検索.

Filter を利用する

素早く情報を検索するには, フィルタが有効.

  • ツールバーからフィルタのパターンを入力
  • よく利用するものは, save を押すと再利用可能
  • フィルタの追加, 削除は Edit > Preferences > Filter Expressions から.

以下, よく利用するものを列挙

smb プロトコルをフィルタする

<div class="outline-text-3" id="text-3-1">
  <p>
    これは基本.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb or smb2<br /> [/sourcecode]
  </p>
</div>

IP アドレスでフィルタリング

<div class="outline-text-3" id="text-3-2">
  <p>
    サーバのログをみるとき, たくさんのクライアントからのアクセスがある ので, ログが見づらい. 以下で, 送信元または送信先でフィルタリング.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> ip.addr == 10.0.0.1<br /> [/sourcecode]
  </p>

  <p>
    送信元と先を指定する.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> ip.addr == 10.0.0.1 and ip.addr == 10.0.0.0<br /> [/sourcecode]
  </p>
</div>

NT Status が エラーのものをフィルタリングする

<div class="outline-text-3" id="text-3-3">
  <p>
    エラーを素早くチェックするために.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb2.nt_status > 0<br /> [/sourcecode]
  </p>
</div>

Command Code でフィルタリング

<div class="outline-text-3" id="text-3-4">
  <p>
    コマンドコードで絞込み.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> # create でフィルタ<br /> smb2.cmd==5<br /> [/sourcecode]
  </p>

  <p>
    コマンドコード一覧
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://msdn.microsoft.com/en-us/library/cc246528.aspx">2.2.1.1 SMB2 Packet Header &#8211; ASYNC</a>
    </li>
  </ul>
</div>

FileId でフィルタリング

<div class="outline-text-3" id="text-3-5">
  <p>
    create response コマンドにある fileId を追跡する.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb2.fid==00004001-0000-0000-0000-000000000000<br /> [/sourcecode]
  </p>
</div>

tshark を利用する

コマンドラインの tshark を利用したほうが, 操作が早いことに気付く. しかし, Detail をしっかりみるためには GUI 版の WireShark がいい.

smb でフィルタリンクしたものを吐き出し. これでログが軽くなる.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2’ -w foo.pcapng
[/sourcecode]

-Y でフィルタをかける. サブ画面でちょっとした grep をするのに便利.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2.cmd==5’
[/sourcecode]

エラーがないかなどを素早くチェックする.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2.nt_status > 0’
[/sourcecode]

25 Jan 2015, 09:31

Emacs での テキストブラウザ eww を使えるレベルにする

はじめに

最近よくマックにいくのだけれども, ここがとても電波回線が悪い (@_@);

ネットサーフィンをしてても, とてもストレスがたまる. このままだと, マックのせいでストレスから立ち直れなくなってしまうので なんとかしようと思った.

テキストブラウザをつかえば, よりサクサクとネットを楽しめるのではとお もい, Emacs での テキストブラウザの eww をつかってみた.

EWW とは

Emacs での テキストブラウザ. Emacs24.4 からデフォルトで Emacs にはいっている.

Basics Config

KeyBindings

  • N (eww-next-url)
  • P (eww-previous-url)
  • l (eww-back-url)
  • r (eww-forward-url)
  • H (eww-list-histories)
  • & (eww-browse-with-external-browser)
  • b (eww-add-bookmark)
  • B (eww-list-bookmarks)
  • q (quit-window)

見にくいときは, R eww-readable をすると, 余計なリンクやサイドバーが消えて見えやすくなる.

いくつか自分でも追加.

(define-key eww-mode-map "r" 'eww-reload)
(define-key eww-mode-map "c 0" 'eww-copy-page-url)
(define-key eww-mode-map "p" 'scroll-down)
(define-key eww-mode-map "n" 'scroll-up)

背景色の設定

正直, 以下の記事をみつけなければ, eww は利用していなかった!!

黒背景を利用していると, google の検索結果が白みががかってしまってつか いものにならなかった. 以下の設定をしたら, あらー不思議. いろが消えた.

(defvar eww-disable-colorize t)
(defun shr-colorize-region--disable (orig start end fg &optional bg &rest _)
  (unless eww-disable-colorize
    (funcall orig start end fg)))
(advice-add 'shr-colorize-region :around 'shr-colorize-region--disable)
(advice-add 'eww-colorize-region :around 'shr-colorize-region--disable)
(defun eww-disable-color ()
  "eww で文字色を反映させない"
  (interactive)
  (setq-local eww-disable-colorize t)
  (eww-reload))
(defun eww-enable-color ()
  "eww で文字色を反映させる"
  (interactive)
  (setq-local eww-disable-colorize nil)
  (eww-reload))

default の検索エンジンを Google に変更

default では, duckduckgo が設定されている. Google へ.

(setq eww-search-prefix "http://www.google.co.jp/search?q=")

dokudokgo

こまかくパラメータ設定

  • kl=ja-jp 日本語
  • k1=-1 広告なし
  • kc=1 自動先読み
  • kf=-1 サイトアイコンなし
  • q = 検索文字

=> サイトアイコンなしは動かない.

;; (setq eww-search-prefix "https://duckduckgo.com/html/?kl=jp-jp&k1=-1&kc=1&kf=-1&q=")

eww 複数起動する

バッファ名を rename すればいい.

(defun eww-mode-hook--rename-buffer ()
  "Rename eww browser's buffer so sites open in new page."
  (rename-buffer "eww" t))
(add-hook 'eww-mode-hook 'eww-mode-hook--rename-buffer)
  • eww-list-buffers (S にキーバインドされている) 生成した eww を一覧で表示できる.

クイック検索

サクッと Google 検索をしたいので, 検索機能を強化した.

  • 検索結果にハイライトをつける.
(defun eww-search (term)
  (interactive "sSearch terms: ")
  (setq eww-hl-search-word term)
  (eww-browse-url (concat eww-search-prefix term)))

(add-hook 'eww-after-render-hook (lambda ()
                   (highlight-regexp eww-hl-search-word)
                   (setq eww-hl-search-word nil)))

テキストブラウザは地味なので, ときには別のブラウザでも Web ページを閲覧したい. 私は普段は conkeror を利用しているので, これで開きたい.

以下の関数で今見ているページを外部ブラウザで開くことができる. &にキーバインドされている.

eww-browse-with-external-link

以下の設定で, ブラウザを conkeror に指定.

(setq browse-url-generic-program (executable-find "conkeror"))
(setq shr-external-browser 'browse-url-generic)

現在の url を eww で開く

外部ブラウザで開きたいときもあれば, eww で開きたいときもある.

(defun browse-url-with-eww ()
  (interactive)
  (let ((url-region (bounds-of-thing-at-point 'url)))
    ;; url
    (if url-region
      (eww-browse-url (buffer-substring-no-properties (car url-region)
                              (cdr url-region))))
    ;; org-link
    (setq browse-url-browser-function 'eww-browse-url)
    (org-open-at-point)))
(global-set-key (kbd "C-c p") 'browse-url-with-eww)

画像表示

画像は遅いので表示させない. 以下の記事のテクをそのまま借りた.

(defun eww-disable-images ()
  "eww で画像表示させない"
  (interactive)
  (setq-local shr-put-image-function 'shr-put-image-alt)
  (eww-reload))
(defun eww-enable-images ()
  "eww で画像表示させる"
  (interactive)
  (setq-local shr-put-image-function 'shr-put-image)
  (eww-reload))
(defun shr-put-image-alt (spec alt &optional flags)
  (insert alt))
;; はじめから非表示
(defun eww-mode-hook--disable-image ()
  (setq-local shr-put-image-function 'shr-put-image-alt))
(add-hook 'eww-mode-hook 'eww-mode-hook--disable-image)

eww-copy-page-url (w) で現在の URL をクリップボードにコピー.

しかし, やりたいことは org-mode のリンクをクリップボードにコピーす ること.この機能かあるかどうかで, 情報収集のスピードが全然違う.

別記事にしました.

External Elisps

eww-hatebu

モードラインにはてぶ数を表示する.

(require' eww-hatebu)
(eww-hatebu-setup)

はてなブックマークを投稿するには, メールからのブックマーク機能を利用する. wl-draft を起動して, コメント書いて送信.

helm-eww-history

helm インタフェースで履歴を見る.

helm-eww-bookmarks

helm インタフェースでブックマークを見る.

(require 'helm-eww-bookmark)
(define-key eww-mode-map "B" 'helm-eww-bookmark)

auto-hightlight-symbol で語句をハイライト

auto-hightlight-symbol を利用すると, 語句にカーソルを当てるだけで, キーワードがハイライトされる.

なんかもうメンテナンスされていないようにみえる.

(require ' auto-highlight-symbol)
(add-hook 'eww-mode-hook 'auto-highlight-symbol-mode)
(global-auto-highlight-symbol-mode t)

ace インタフェースによるリンクの選択. これは必須!! conkeror のようなリンク選択ができる.

o をおすと発動.

(require 'ace-link)
(eval-after-load 'eww '(define-key eww-mode-map "f" 'ace-link-eww))
(ace-link-setup-default)

24 Jan 2015, 15:23

関数型デザインパターンのプレゼン動画をまとめてみた

はじめに

オブジェクト指向言語の世界では, デザインパターンが人気!

関数型言語の世界でも, OO の影響を受けて, きっと誰かがパターンを考えているに違いないと考えて, いろいろとネットで情報収集してみた.

思ったとおりで, いくつか動画をみつけたのでまとめてみる.

Functinal programming patterns for the non-mathematician

15 分くらいに短くまとまっている動画. JavaScript.

関数に成り立つ法則によってまとめている.

  • Composition laws
  • Lenses laws
  • Fmap laws
  • Monad laws
  • Applicative laws
  • Monoid laws
  • Arrow laws

SlideShare のプレゼン資料

Functional Programming Patterns

動画はリンク先から.

プレゼン, 動画ともにとてもボリュームがある. 導入部の説明がとても笑える.

SlideShare のプレゼン資料

Patterns and Functional Programming

Patterns and Functional Programming from Chariot Solutions on Vimeo.

この本を書いた人の動画.

Amazon:

Pragmatic Bookshelf:

既存の OO Pattern を FP で置き換える.

こんな記事もみつけた.

Replacing Object Oriented Patterns
    Introduction
    Replacing Functional Interface
    Replacing State Carrying Functional Interface
    Replacing Command excerpt
    Replacing Builder For Immutable Object
    Replacing Iterator
    Replacing Template Method
    Replacing Strategy
    Replacing Null Object
    Replacing Decorator
    Replacing Visitor
    Replacing Dependency Injection

FP 独自のパターンも紹介.

Functional Patterns
    Introduction
    Tail Recursion excerpt
    Mutual Recursion
    Filter-Map-Reduce
    Chain of Operations
    Function Builder
    Memoization
    Lazy Sequence
    Focused Mutability
    Customized Control Flow
    Domain-Specific Language

これはあとで読みたい.(できれば日本語訳で!!)

Functional Design Patterns

Clojure による,パターンの紹介.

内容をみていないのだけれども, ブックマークだけしておく.

  • State/Event,
  • Consequences,
  • Accumulator
  • MapReduce,
  • Reduce/Combine,
  • Recursive Expansion,

おわりに

シンフォニーとミニマルミュージック

OO でのパターンと FP のパターンでは, うけるイメージが違った.

OO のパターンからは, 堅牢な構築物のようなイメージを受ける. それは, クラス図で表現されているからかもしれない.

それに対して, FP からは, ミニマルな文様なようなイメージを受ける. 微細なパターンが組み合わさって, 全体をつくるような. FP で言うところのパターンは小さいので, OO でいうところの idiom のようにもとらえられる.

それは, 堅牢な交響曲と, 微細なテクノミュージックのような違いを感じる.

今年の目標は関数型パターンをみにつけること.

去年の目標は, OO のデザインパターンを身につけることが目標だった.

今年は, FP のパターンを身につけることを目標にしよう.

それにしても, FP のパターンは Gof のような教科書が見当たらない.

動画の内容にも言えることだけれども, いろんなひとがそれぞれの意見を持っているような群雄割拠状態.

だれでもいいので, すごい本とか出してこの分野を統一してくれないかなと思ってみたり.

23 Jan 2015, 01:38

もうダサいなんていわせない! 黒くてクールな DarkWireShark

はじめに

WireShark がダサいとおもっているならば, それも今日限りだ.

WireShark の UI をクールなブラックにする方法を紹介.

環境

  • Windows 8.1
  • WireShark 1.12

手順

WireShark は GTK2 を UI として利用している. なので, GTK2 のテーマを適用することができる.

テーマを以下からダウンロード

なかにテーマいろいろある.

適当なテーマを選んで, WireShark のインストールフォルダにそのまま コピペする. WireShark を再起動すると, 選択したテーマで起動される.

テーマをチェック

テーマは Youtube 動画がいくつかある. 動画で色をチェックしてから利用するのがいい.

BookMarks

22 Jan 2015, 15:49

Team Geek を読んだ. 仕事をつくるのは誰か?

はじめに

とりたてて読む動機はなかったのだけれども, 図書館でふとタイトルに止まったので借りて読んでみました.

内容

Google のエンジニアがエンジニアの働き方について書いた本.

薄い本なのですぐ読める (1-2 時間) しかし, 得るものはおおい. 講演を元にしているようで,口語で軽い語り口だほ

  • 1 章 天才プログラマの神話
  • 2 章 素晴しいチーム文化を作る
  • 3 章 船にはキャンプテンが必要
  • 4 章 有害な人に対処する
  • 5 章 組織的操作の技法
  • 6 章 ユーザーも人間

感想

1 番こころにのこったのは, 第 3 章だ. この章は, マネージャーについてかかれている.

管理職にはなりたくない

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    正直にかくと, マネージャーにはなりたくない.
  </p>

  <p>
    消極的な理由は, 自分はひとをまとめる力がなくて, メンタル的に打たれよわいから. また, 自分のまわりにいるマネージャーをみると, いつも障害対応でクタクタになっているように見える.
  </p>

  <p>
    積極的な理由は, コードを書く時間がなくなるから.
  </p>
</div>

サーバントリーダーとテクニカルリーダー

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    マネージャーは, 野球部の女子マネージャーのような存在で, 野球選手が輝くためのことをするべき存在だと思っていた.
  </p>

  <p>
    そんな自分の思いを移すような内容だった. この本では, それを
  </p>

  <p>
    <b>サーバント・リーダー</b>
  </p>

  <p>
    と表現している. 19,20 世紀的なマネージャー観とこれからのマネージャー観は違うと書いている. 野球選手やお笑いタレントを影で支えるのがマネージャーの仕事.
  </p>

  <p>
    その代わりにサーバント・リーダーとともに, 技術的にチームを引っ張っていくテクニカル・リーダーの存在も書いている. 会社がうまく回るためには, サーバントリーダーとテクニカルリーダーの存在が不可欠なのだと.
  </p>
</div>

自分のなりたい姿について

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    あっというまに, 読んでしまったのだけれども, 少なからず自分のこれからの仕事観に影響を受けた.
  </p>

  <p>
    自分の将来が未だに描けないのだが, 自分はテクニカル・リーダーになりたいと思った. 従来のような管理職にはなりたくない.会社の仕組みとか人の管理とか, 興味ないし.
  </p>

  <p>
    実現したい想いをもって, ストーリーを描けるようになりたい.
  </p>

  <p>
    もしかしたら, そのためにはコードを書くことを犠牲にするかもしれない. 協力してくれる仲間を巻き込んで, 1 人ではできないような大きなことを成し遂げるのも, それはそれでいい.
  </p>
</div>

仕事をつくるのは誰か?

<div class="outline-text-3" id="text-unnumbered-7">
  <p>
    現状のマネージャー独裁運営から, テクニカルリーダーとサーバントリーダーによる共和制に移行するためには, テクニカルリーダーがもっとお金稼ぎについて責任をもつ必要がある.
  </p>

  <p>
    今の職場では, 仕事はマネージャーがつくりだすものだけれども, これからは, メンバの 1 人ひとりが, 新しいビジネスにつながることを考えないといけないと思う. そのためには, 一人ひとりが技術の動向についてもっと追いかけ, 議論して, 新しい金の卵は落ちていないか探す必要がある.
  </p>

  <p>
    今, 自分の所属している部署は, 売上が減ってきている. 受託開発を長年しているのだけれども,受託が減ることはこの先は明らかなのだ. 生き残っていくには, 新しいことにチャレンジする必要がある.
  </p>

  <p>
    しかし, 自分の目からみると, どうも回りの人は技術の動向に疎いように見える. 家に帰ってプログラミングをすることを厭うような文化がある. 家庭のためにプログラミングを通じてお金を稼ぐサラリーマンのような.
  </p>

  <p>
    今までは仕事があったからよかったのだけれども, これからは, 一人一人がもっともっとお金稼ぎについて 頭をひねるようなことをしないといけないと感じている.
  </p>

  <p>
    そんな状況で, 自分にできることはなんだろうか?
  </p>

  <p>
    ということを考えることが, 今受けてる会社の研修内容だったりする. 答えはおぼろげなので, ここまで.
  </p>
</div>

Bookmarks

以下, 心に残ったものを抜粋する.

天才プログラマの神話

<div class="outline-text-3" id="text-unnumbered-9">
  <p>
    ソフトウエア開発は <b>チームスポーツ</b> である.
  </p>

  <ul class="org-ul">
    <li>
      隠したらダメになる.いつも一人でやっているとリスクが高くなる. 成果を共有することで <b>バス係数</b> (冗長性) が高くなる.
    </li>
    <li>
      ソーシャルスキルの三本柱は以下.(HRT) <ul class="org-ul">
        <li>
          謙虚 (Humility) 世界の中心は君ではない. 君は全知全能ではないし, 絶対に正しいわ けでもない.つねに自分を改善していこう.
        </li>
        <li>
          尊敬 (respect) 一緒に働く人のことを心から思いやろう. 相手を 1 人の人間として扱い, その能力や功績を高く評価しよう.
        </li>
        <li>
          信頼 (Trust) 自分以外の人は有能であり, 正しいことをすると信じよう. そうすれ ば, 仕事を任せることができる.
        </li>
      </ul>
    </li>
  </ul>
</div>

素晴らしいチーム文化をつくる

<div class="outline-text-3" id="text-unnumbered-10">
  <p>
    コミュニケーションの原則は, <b>同期コミュニケーションの人数を減らし, 非同期コミュニケーションの人 数を増やすこと</b> である.
  </p>
</div>

<div id="outline-container-unnumbered-11" class="outline-4">
  <h4 id="unnumbered-11">
    コミュニケーションツール
  </h4>

  <div class="outline-text-4" id="text-unnumbered-11">
    <ul class="org-ul">
      <li>
        ミッションステートメント <ul class="org-ul">
          <li>
            プロジェクトが目指す姿を短い言葉で表現して共有する.
          </li>
          <li>
            <b>方向性</b> と <b>スコープの制限</b> を明確にすること.
          </li>
          <li>
            企業のわけのわからない抽象的な表現がミッションステートメント をダメにしている.
          </li>
        </ul>
      </li>

      <li>
        効率的なミーティング <ul class="org-ul">
          <li>
            ミーティングに 5 以上参加させてはいけない.意思決定者がいなけ れば, 決まるものも決まらない.
          </li>
          <li>
            ミーティング中にノート PC をいじってメールチェックをしている人 は参加しなくていい人.
          </li>
          <li>
            ミーティングを開くときの簡単な 5 原則 <ol class="org-ol">
              <li>
                絶対に必要な人だけを呼ぶ
              </li>
              <li>
                アジェンダを作ってミーティング開始前に配布する
              </li>
              <li>
                ミーティングのゴールを達成したら時間前でも終了する
              </li>
              <li>
                ミーティングを順調に進める
              </li>
              <li>
                ミーティングの開始時間を強制的に中断される時間の前に設定す る (お昼休み, 就業時間)
              </li>
            </ol>
          </li>
        </ul>
      </li>

      <li>
        設計文書 <ul class="org-ul">
          <li>
            設計文書は 1 人が所持するもの. 大勢の人がレビューして, 2,3 人の人が承認するもの.
          </li>
          <li>
            何をどうしたいのかを低コストでチームに伝える手段.
          </li>
          <li>
            タスク分割につかうもの.
          </li>
          <li>
            プロジェクトが進むにしたがって更新するべきもの.
          </li>
        </ul>
      </li>

      <li>
        メーリングリスト <ul class="org-ul">
          <li>
            チームが同じフロアにいるのであれば, メーリングリストで議論す る必要はない.
          </li>
          <li>
            議事録・ミーティングメモ・決定事項・設計文書などをメーリング リストに投稿して, 記録をまとめる.
          </li>
        </ul>
      </li>

      <li>
        オンラインチャット <ul class="org-ul">
          <li>
            信じられないほど便利なツール. 他人の作業を邪魔することなくリクエストを送信できる.
          </li>
          <li>
            IM では, チーム内での情報共有ができない.
          </li>
        </ul>
      </li>

      <li>
        課題管理ツール <ul class="org-ul">
          <li>
            ただの掲示板. メーリングリストと同じ.
          </li>
          <li>
            バグの優先順位をつけることができる.
          </li>
        </ul>
      </li>

      <li>
        コードレビュー <ul class="org-ul">
          <li>
            すべてのコミットにコードレビューする.
          </li>
          <li>
            コードの監視方法をプロダクトに導入する.
          </li>
          <li>
            コードの行のスタイル・品質・ケアレスミスを第三者が確認するべき.
          </li>
        </ul>
      </li>
    </ul>
  </div>
</div>

船にはキャプテンが必要

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

<div id="outline-container-unnumbered-13" class="outline-4">
  <h4 id="unnumbered-13">
    リーダとマネージャー
  </h4>

  <div class="outline-text-4" id="text-unnumbered-13">
    <p>
      マネージャーは, &#8220;サーバント&#8221;, 執事のような存在だ. 芸能人のマネージャーがタレントの活動をサポートするための黒子に徹す るのと同じように, マネージャーはチームのエンジニアに最高のパフォー マンスを発揮させることが使命.
    </p>

    <p>
      一方, リーダはすべてのエンジニアに要求される役割.
    </p>

    <p>
      トンガリ頭のマネージャーは, 軍隊の階級制度を散光にして, 産業革命の ときに導入されたもの.向上では組み立てラインの稼働を労働者に命令する 必要があった.
    </p>

    <p>
      エンジニアリングの世界でも時代遅れの マネージャ&#8221;という肩書きを使っ ている.マネージャーじゃなくて, リーダーにしたほうがいいと思う.
    </p>

    <p>
      マネージャーになりたがらない理由はたくさんある.ぼくたちが耳にした大 きな理由は, コードを書く時間が少なくなるから.
    </p>

    <p>
      もう一つの語られない大きな理由は, &#8220;階層的な組織に属する人間は,必ずその人の無能レベルまで昇進する&#8221;
    </p>

    <p>
      マネージャーは, サーバントリーダーとして謙虚・尊敬・信頼の雰囲気をつくり 出さなければならない. これは, エンジニアでは対処できない社内の障害物を排除することかもしれないし, チームの合意形成を支援することかもしれない.あるいは, 夜遅くなった時にチームに夜食を買ってくることかもしれない.
    </p>

    <p>
      マネージャーになるメリットは, 自分のストーリーを描くことができるから. また, 自分がコードを書く代わりに, チームメンバを利用して より多くのコードを書くことができるから.
    </p>
  </div>
</div>

その他

<div class="outline-text-3" id="text-unnumbered-14">
  <p>
    1 週間に書いたコード行数のような意味のない (デラタメな) 方法で生産性を計測する会社もある. (行数が少ない方がいいに決まっている)
  </p>
</div>

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 のコードも育てていきたい.