その他
    ホーム 技術発信 DoRuby guard-shellでファイル監視

    guard-shellでファイル監視

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

     概要

    • メモ取りにはSphinxがおすすめ
    • ファイル変更監視に使えるRuby GemとしてGuardがある
    • ファイル変更検知時にシェルコマンドを使いたい場合,guard-shellというgemを使う

     メモとりにはSphinxがおすすめ

     はじめまして,Ruby厨のわたなべ(hackugyo)です.

     ところでみなさんはPythonって知っていますか.最近では「グーグル独自のプログラム言語」などと新聞にも紹介されて話題の言語です(<=はい,ここ笑うところですよ).

     Pythonのコードは見た目がきれいに整うという特徴がありますよね.Rubyはコードブロックをdo-endで表現するのに対し,Pythonはインデントで表現するからです.Rubyはend地獄(Pythonはthis地獄)とはよく言われます.

     私はRuby厨ですので,インデントでブロックを表現するのにはぜんぜん慣れられないのですが,そんな私でもインデントのうまみを思い知ることがあります.

     それはテキストメモをとるときです.

    典型的なテキストメモ

     業務中,私たちはコードを書いているばかりでなく,RedmineにToDoを切り出したり,Skypeチャットで議論をしたりと,いろいろ文字をうちます.特に私などは,書き出さないと考えがまったく整理できないので,ローカルのメモにも大量の書き込みをしています(大半は「うううこのコードがうまくいかない」「あああおれがばかだった」などです).

     以前は,これをwiki記法で書いていましたが,するとEmacs上での見た目はこういうふうになります:

    * 2012/04/18(水)
    ** 今日のToDo
    - コードレビュー依頼
    -- 日取り・メンバを決める
    ** 今日取り組んでいる問題
    - URL取得がうまくいかない
    -- このメソッドが悪いのか?
     SuperComplexActivity # getUrlAndParseAndMakeQuery()
    -- どう考えても切り分けが必要
    

     内容はともかく見づらいですね.

    Sphinxによる見やすいテキストメモ

    ここでPython流の,インデントによる構造化を取り入れてみたらどうでしょうか.

    ================
    2012/04/18(水)
    ================
    
    今日のToDo
    ==========
    
    - コードレビュー依頼
    
      - 日取り・メンバを決める
    
    今日取り組んでいる問題
    ===================
    
    - URL取得がうまくいかない
    
      - このメソッドが悪いのか?
    
    
    .. code-block:: java
    
     SuperComplexActivity # getUrlAndParseAndMakeQuery()
    
    - どう考えてもメソッド分割が必要
    
    

    見やすいですね!

     じつは上記の記法はreST記法といって,Python製のドキュメンテーションツールSphinxで読むことができます.Sphinxのよいところは,テキストファイルの状態でも上記のようにそこそこ読みやすいreST記法を扱っており,さらにそのテキストファイルをビルドすることで,HTMLやPDFなど見栄えのする形式に変換できることです.

     私も,Emacsで上記のようにメモをとったあと,`make html`のシェルコマンドにより,Wikiのような形式に変換しています.過去のメモの参照がしやすく,気分もよくなります.

     ファイル変更検知にはGuard

     さて,前節で述べたような「メモをとる=>保存する=>コマンドを叩く」の流れは,明らかに自動化すべきです.保存をかけたらそれだけでhtmlができあがっていれば便利ですね.

     ここからが本題です.「ファイル編集=>保存する=>処理実行」と言えば,Ruby厨として思い出すのは当然,Guardです.Guardは,RSpecによるテスト実行時に使うRubyGemとして有名な,ファイル変更監視ツールです.Guardを使うことで,Railsのモデルを編集しただけで自動的にRSpecを実行するなどの処理が簡単に行えます.

     Guardを,上記のようなテキストメモの監視&コマンド実行にも使えないでしょうか? もちろんできます.やってみましょう.

    (もちろん,ファイル変更監視ツールは他にもいろいろあります.Rubyにもwatchrというgemがありますし,Pythonならwatchdogがあります.シェルスクリプトを組んでポーリングしてもいいでしょう.エディタがEmacsなら保存時にフックして処理を挟む手もあります.今回はRuby厨として,Guardの使い方を広げるために,Guardを使います.)

    shell操作にはguard-shell

    guardにシェルコマンドを叩かせるには,guard-shellというgemが必要です.

    $ gem install guard-shell
    

    これだけでGuard込みでインストールできます.逆に,Guardだけでやろうとするとうまくいきません(私はこれで1時間はまりました.下記のGuardfileにでてくるシンボル:shellをGuardに理解させるには,guard-shellが必要です.).

     インストールできたら,監視対象とするディレクトリまで移動し,下記のようなGuardfileを置きます.

    # -*- coding: utf-8 -*-
    guard :shell do
      watch( %r{(.*)¥.rst} ) { |m| `echo #{m.first}が更新されました` }
    end
    

    rstは,reST記法を使って書かれたドキュメントによく使われる拡張子です.上記の例では,ディレクトリ直下の*.rstファイルの変更をすべて監視させ,変更があるたびに,更新されたファイル名をechoするシェルコマンドを叩かせています.簡単ですね.

     echoの代わりに,Sphinxのコマンドmake htmlを叩かせるようにすれば,要求が実現できます.

    あとは,

    $ guard
    

    のコマンドを叩くだけで,Guardが自動的にGuardfileを読み込み,ファイル更新検知をはじめてくれます.

    これでテキストメモ保存時のひと手間が減りました.Guardであなたの貴重な時間を守りましょう.

     ご参考

    1. reST記法については,こちらのチュートリアルが親切です:http://sphinx-users.jp/doc11/rest.html
    2. Sphinxについては,
      • 同じくSphinx-Users.jpを参照するか,
      • 株式会社ビープラウド, *Pythonプロフェッショナルプログラミング*(秀和システム, 2012)なども勉強になります.
    3. Guardはこちらにソースがあります. https://github.com/guard/guard-shell
    4. Guard-Shellなど,Guardと組み合わせて使えるgemのリストはこちらです. https://github.com/guard/guard/wiki/List-of-available-Guards
    記事を共有