>> 古い記事: CCLedな曲を紹介・配信しているポッドキャストのリンク集
<< 新しい記事: サクラエディタ: マクロで選択範囲の SQL文を整形する(要Ruby、anbt-sql-formatter使用)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Yapra メモ: コマンド+パイプを使った処理との比較、モジュールの書き方など

注)断片的な情報を基にけっこう適当に書いてます。


たとえば Bash で次のような処理を行うとする。

$ cat in.txt | grep -v foo | write-to-file -o out.txt

概要としては(1)ファイルからデータを読み込み (2)データを加工し (3)データをファイルに書き込む という処理を行っている。

grep の -v(--invert-match) オプションは指定されたパターンにマッチしない行を出力させるためのオプション。

write-to-file というコマンドは架空のもので、 ふつうならリダイレクトを使うところだろうが、説明の都合上でっちあげた。 標準入力から渡されたデータを -o で指定されたファイルに書き込むというコマンドのつもり。

Yapra では「モジュール」がコマンドに、 設定ファイルのパラメータ(config: ~ の部分)がオプション指定に対応する。 そして、シェルスクリプトを書く代わりに次の設定ファイルを書く。


上の cat、grep、write-to-file の処理を Yapra で行うために書いてみる。 処理の流れ(順番)と使用するモジュール、パラメータを YAML ファイルに書く。

- module: Example::cat
  config:
    filename: test.yaml
- module: Example::grep
  config:
    pattern: module
    invert_match: true
- module: Example::write_to_file
  config:
    filename: out.txt

モジュール cat, grep, write_to_file を書く。

モジュールは自分の環境では ~/.gem/ruby/1.8/gems/yapra-0.1.3/plugins/ に置く(一般ユーザではなく sudo で gem install した場合はそれに応じたディレクトリ。 その他の任意のディレクトリに置きたい場合についてはこちら(Yapra メモ)を参照)。 ディレクトリの階層構造がモジュールの階層構造に対応しているので、 たとえば Foo::bar というモジュールを使いたかったら ~/plugins/Foo/bar.rb となるように置く。

# cat.rb

require 'yapra/plugin'

def cat(config, data)
  File.open( config["filename"] )
end

cat はこれだけ。 config["項目名"] で YAML ファイルで指定した値が参照できる。 これを ~/.gem/ruby/1.8/gems/yapra-0.1.3/plugins/Example/cat.rb となるように置く。 また、Ruby なので return ~ という書き方をしていないが、 この cat メソッドの返り値は当然 File.open の値である File オブジェクトになる。

同様に grep.rb と write_to_file.rb を書いて同じディレクトリに置く。

# grep.rb

require 'yapra/plugin'

def grep(config, data)
  file = data # 入力として File オブジェクトを受け取ることを想定している
  result = ""

  while line = file.gets
    if config["invert_match"]
      if not /#{config["pattern"]}/ =~ line
        result << line
      end
    else
      if /#{config["pattern"]}/ =~ line
        result << line
      end
    end
  end
  
  result # 加工した結果を次のモジュールに渡す
end
# write_to_file.rb

require 'yapra/plugin'

def write_to_file(config, data)
  File.open( config["filename"], "w" ) do |f|
    f.print data
  end
end

ここまで準備できたら、コマンドラインで次のように実行すると、test.yaml から "module" を含まない行だけを抽出した out.txt ができる。

$ yapra -c test.yaml

「なんだ、じゃあコマンド+パイプでいいじゃん」 と思うかもしれないが、シェルの処理ではコマンド間で受け渡されるデータがバイト列である一方、 Yapra では任意の(Rubyの)オブジェクトが使えるところが違う。 たぶん最も大きな利点。


コマンド(+パイプ)を使った処理の経験がある人なら、 ここから先のことや そもそも「Yapra を使うと何ができるの?」といったところは簡単に想像ができると思う。

「ファイルを読み込み → 加工 → ファイルへ書き出し」という流れにこだわらなくても、 たとえば「ファイルを読み込むモジュール」を「ネットワーク越しにリソースを取ってくるモジュール」や 「自らデータを生成するモジュール」にしてもいいし、 ファイルに書き出す代わりに標準出力に吐いてもいい。 そうした処理の中でも定型的なものは、たとえば RSSフィードを読むためのプラグインとして 標準で付属していたりする。

「読み込み → 加工1 → 加工2 → ... → 加工n → 書き出し」 とたくさんつなげるような使い方も、コマンド処理に慣れた人には特に説明しなくても すんなり分かってもらえるのではないかと。

その他

  • 歴史的な流れとしては Plagger(Perl) → Pragger(Ruby) → Yapra ←今ここ

  • 検索するときは検索キーワードとして yapra だけではなく pragger や、場合によっては plagger も使うとよいでしょう。

  • pragger のプラグインがほとんどそのまま使えるらしい。 (legacy_plugins ディレクトリに入れる?)

  • たぶん「プラグイン」と「モジュール」は同じ。

  • ちなみに、Yapra の存在については「Ruby 逆引きレシピ」で知りました。

    Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)
    Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)島田 浩二 設樂 洋爾 村田 賢太 前田 智樹 谷口 文威

    翔泳社 2009-07-25
    売り上げランキング : 320039


    Amazonで詳しく見る
    by G-Tools
  • 2010-10-01 追記: 最初は 「うーん。いまいち状況が分からないけどこれは UNIX pipe とのアナロジーで説明したら (分かる人には)一発で伝わるんじゃないかな…?」みたいな感じでこの記事を書いたんですが、 ふと気になって本家 Plagger のサイト(plagger.org)を見に行ったところ 一番上にでかでかと Plagger: the UNIX pipe programming for Web 2.0 と掲げてあって 青い鳥というかお釈迦様のてのひらの上にいたのだなぁ、と思いました。

  • Plagger については書籍も出ています。Yapra の本ではないので当然「そのまま使える」訳ではありませんが、使い方や用途を参考にしたい場合は役に立ちそうです。
    さすが!と言わせる Plagger徹底攻略術
    さすが!と言わせる Plagger徹底攻略術蒲生 睦男

    シーアンドアール研究所 2009-01-22
    売り上げランキング : 148596

    おすすめ平均 star
    star非常に分かりやすいです

    Amazonで詳しく見る
    by G-Tools

関連記事

参考(外部リンク)

>> 古い記事: CCLedな曲を紹介・配信しているポッドキャストのリンク集
<< 新しい記事: サクラエディタ: マクロで選択範囲の SQL文を整形する(要Ruby、anbt-sql-formatter使用)
** ホームに戻る

コメント

コメントの投稿

管理者にだけ表示を許可する

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。