fairy 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +674 -0
- data/Makefile +116 -0
- data/README +15 -0
- data/bin/fairy +582 -0
- data/bin/fairy-cat +74 -0
- data/bin/fairy-cp +128 -0
- data/bin/fairy-rm +122 -0
- data/bin/subcmd/controller +41 -0
- data/bin/subcmd/inspector +81 -0
- data/bin/subcmd/master +43 -0
- data/bin/subcmd/node +47 -0
- data/bin/subcmd/processor +54 -0
- data/doc/programming-interface.html +240 -0
- data/doc/programming-interface.rd +300 -0
- data/etc/fairy.conf.tmpl +118 -0
- data/ext/simple_hash/extconf.rb +4 -0
- data/ext/simple_hash/simple_hash.c +42 -0
- data/fairy.gemspec +60 -0
- data/lib/fairy/client/addins.rb +20 -0
- data/lib/fairy/client/barrier.rb +29 -0
- data/lib/fairy/client/basic-group-by.rb +52 -0
- data/lib/fairy/client/cat.rb +41 -0
- data/lib/fairy/client/direct-product.rb +51 -0
- data/lib/fairy/client/equijoin.rb +79 -0
- data/lib/fairy/client/exec.rb +54 -0
- data/lib/fairy/client/filter.rb +62 -0
- data/lib/fairy/client/find.rb +35 -0
- data/lib/fairy/client/group-by.rb +194 -0
- data/lib/fairy/client/here.rb +84 -0
- data/lib/fairy/client/inject.rb +70 -0
- data/lib/fairy/client/input-file.rb +53 -0
- data/lib/fairy/client/input-iota.rb +49 -0
- data/lib/fairy/client/input-local-file.rb +188 -0
- data/lib/fairy/client/input-varray.rb +30 -0
- data/lib/fairy/client/input.rb +42 -0
- data/lib/fairy/client/io-filter.rb +26 -0
- data/lib/fairy/client/junction.rb +31 -0
- data/lib/fairy/client/map.rb +34 -0
- data/lib/fairy/client/merge-group-by.rb +71 -0
- data/lib/fairy/client/output-file.rb +64 -0
- data/lib/fairy/client/output-local-file.rb +60 -0
- data/lib/fairy/client/output-null.rb +47 -0
- data/lib/fairy/client/output-varray.rb +50 -0
- data/lib/fairy/client/output.rb +29 -0
- data/lib/fairy/client/roma-put.rb +62 -0
- data/lib/fairy/client/roma.rb +156 -0
- data/lib/fairy/client/seg-join.rb +61 -0
- data/lib/fairy/client/seg-map.rb +78 -0
- data/lib/fairy/client/seg-shuffle.rb +35 -0
- data/lib/fairy/client/seg-split.rb +27 -0
- data/lib/fairy/client/seg-zip.rb +60 -0
- data/lib/fairy/client/select.rb +38 -0
- data/lib/fairy/client/sort.rb +48 -0
- data/lib/fairy/client/sort18.rb +56 -0
- data/lib/fairy/client/sort19.rb +61 -0
- data/lib/fairy/client/there.rb +47 -0
- data/lib/fairy/client/top_n_into_roma.rb +34 -0
- data/lib/fairy/client/wc.rb +92 -0
- data/lib/fairy/controller.rb +1103 -0
- data/lib/fairy/logger.rb +107 -0
- data/lib/fairy/master/addins.rb +20 -0
- data/lib/fairy/master/atom.rb +17 -0
- data/lib/fairy/master/c-barrier.rb +283 -0
- data/lib/fairy/master/c-basic-group-by.rb +250 -0
- data/lib/fairy/master/c-cat.rb +159 -0
- data/lib/fairy/master/c-direct-product.rb +203 -0
- data/lib/fairy/master/c-exec.rb +68 -0
- data/lib/fairy/master/c-filter.rb +422 -0
- data/lib/fairy/master/c-find.rb +138 -0
- data/lib/fairy/master/c-group-by.rb +64 -0
- data/lib/fairy/master/c-here.rb +80 -0
- data/lib/fairy/master/c-inject.rb +119 -0
- data/lib/fairy/master/c-input-file.rb +46 -0
- data/lib/fairy/master/c-input-iota.rb +66 -0
- data/lib/fairy/master/c-input-local-file.rb +117 -0
- data/lib/fairy/master/c-input-varray.rb +53 -0
- data/lib/fairy/master/c-input.rb +24 -0
- data/lib/fairy/master/c-inputtable.rb +31 -0
- data/lib/fairy/master/c-inputtable18.rb +36 -0
- data/lib/fairy/master/c-inputtable19.rb +35 -0
- data/lib/fairy/master/c-io-filter.rb +28 -0
- data/lib/fairy/master/c-junction.rb +54 -0
- data/lib/fairy/master/c-map.rb +27 -0
- data/lib/fairy/master/c-merge-group-by.rb +241 -0
- data/lib/fairy/master/c-output-file.rb +84 -0
- data/lib/fairy/master/c-output-local-file.rb +19 -0
- data/lib/fairy/master/c-output-null.rb +45 -0
- data/lib/fairy/master/c-output-varray.rb +57 -0
- data/lib/fairy/master/c-output.rb +20 -0
- data/lib/fairy/master/c-seg-join.rb +141 -0
- data/lib/fairy/master/c-seg-map.rb +26 -0
- data/lib/fairy/master/c-seg-shuffle.rb +87 -0
- data/lib/fairy/master/c-seg-split.rb +110 -0
- data/lib/fairy/master/c-seg-zip.rb +132 -0
- data/lib/fairy/master/c-select.rb +27 -0
- data/lib/fairy/master/c-sort.rb +108 -0
- data/lib/fairy/master/c-there.rb +57 -0
- data/lib/fairy/master/c-wc.rb +232 -0
- data/lib/fairy/master/job-interpriter.rb +19 -0
- data/lib/fairy/master/scheduler.rb +24 -0
- data/lib/fairy/master.rb +329 -0
- data/lib/fairy/node/addins.rb +19 -0
- data/lib/fairy/node/p-barrier.rb +95 -0
- data/lib/fairy/node/p-basic-group-by.rb +252 -0
- data/lib/fairy/node/p-direct-product.rb +153 -0
- data/lib/fairy/node/p-exec.rb +30 -0
- data/lib/fairy/node/p-filter.rb +363 -0
- data/lib/fairy/node/p-find.rb +111 -0
- data/lib/fairy/node/p-group-by.rb +1534 -0
- data/lib/fairy/node/p-here.rb +21 -0
- data/lib/fairy/node/p-identity.rb +24 -0
- data/lib/fairy/node/p-inject.rb +127 -0
- data/lib/fairy/node/p-input-file.rb +108 -0
- data/lib/fairy/node/p-input-iota.rb +39 -0
- data/lib/fairy/node/p-input-local-file.rb +61 -0
- data/lib/fairy/node/p-input-varray.rb +26 -0
- data/lib/fairy/node/p-io-filter.rb +28 -0
- data/lib/fairy/node/p-map.rb +40 -0
- data/lib/fairy/node/p-merger-group-by.rb +48 -0
- data/lib/fairy/node/p-output-file.rb +104 -0
- data/lib/fairy/node/p-output-local-file.rb +14 -0
- data/lib/fairy/node/p-output-null.rb +32 -0
- data/lib/fairy/node/p-output-varray.rb +41 -0
- data/lib/fairy/node/p-seg-join.rb +82 -0
- data/lib/fairy/node/p-seg-map.rb +34 -0
- data/lib/fairy/node/p-seg-split.rb +61 -0
- data/lib/fairy/node/p-seg-zip.rb +79 -0
- data/lib/fairy/node/p-select.rb +40 -0
- data/lib/fairy/node/p-single-exportable.rb +90 -0
- data/lib/fairy/node/p-sort.rb +195 -0
- data/lib/fairy/node/p-task.rb +113 -0
- data/lib/fairy/node/p-there.rb +44 -0
- data/lib/fairy/node/p-wc.rb +266 -0
- data/lib/fairy/node.rb +187 -0
- data/lib/fairy/processor.rb +510 -0
- data/lib/fairy/share/base-app.rb +114 -0
- data/lib/fairy/share/block-source.rb +234 -0
- data/lib/fairy/share/conf.rb +396 -0
- data/lib/fairy/share/debug.rb +21 -0
- data/lib/fairy/share/encoding.rb +17 -0
- data/lib/fairy/share/fast-tempfile.rb +93 -0
- data/lib/fairy/share/file-place.rb +176 -0
- data/lib/fairy/share/hash-1.rb +20 -0
- data/lib/fairy/share/hash-md5.rb +28 -0
- data/lib/fairy/share/hash-murmur.rb +69 -0
- data/lib/fairy/share/hash-rb18.rb +20 -0
- data/lib/fairy/share/hash-simple-hash.rb +28 -0
- data/lib/fairy/share/inspector.rb +16 -0
- data/lib/fairy/share/lc/exceptions.rb +82 -0
- data/lib/fairy/share/lc/ja/exceptions.rb +81 -0
- data/lib/fairy/share/locale.rb +17 -0
- data/lib/fairy/share/log.rb +215 -0
- data/lib/fairy/share/pool-dictionary.rb +53 -0
- data/lib/fairy/share/port-marshaled-queue.rb +347 -0
- data/lib/fairy/share/port.rb +1697 -0
- data/lib/fairy/share/reference.rb +45 -0
- data/lib/fairy/share/stdout.rb +56 -0
- data/lib/fairy/share/tr.rb +16 -0
- data/lib/fairy/share/varray.rb +147 -0
- data/lib/fairy/share/vfile.rb +183 -0
- data/lib/fairy/version.rb +8 -0
- data/lib/fairy.rb +206 -0
- data/sample/grep.rb +46 -0
- data/sample/ping.rb +19 -0
- data/sample/sort.rb +102 -0
- data/sample/wordcount.rb +61 -0
- data/spec/README +12 -0
- data/spec/fairy1_spec.rb +31 -0
- data/spec/fairy2_spec.rb +42 -0
- data/spec/fairy3_spec.rb +126 -0
- data/spec/fairy4_spec.rb +63 -0
- data/spec/fairy5_spec.rb +45 -0
- data/spec/fairy6_spec.rb +52 -0
- data/spec/fairy7_spec.rb +58 -0
- data/spec/fairy8_spec.rb +48 -0
- data/spec/mkdat.rb +148 -0
- data/spec/run_all.sh +65 -0
- data/test/testc.rb +7111 -0
- data/tools/cap_recipe/Capfile +144 -0
- data/tools/cap_recipe/cluster.yml.sample +14 -0
- data/tools/fairy_perf_graph.rb +444 -0
- data/tools/git-tag +44 -0
- data/tools/log-analysis.rb +62 -0
- data/tools/svn-ls-diff +38 -0
- data/tools/svn-tags +37 -0
- metadata +298 -0
data/bin/subcmd/master
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
#
|
4
|
+
# Copyright (C) 2007-2010 Rakuten, Inc.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "optparse"
|
8
|
+
|
9
|
+
require "deep-connect"
|
10
|
+
|
11
|
+
require "fairy/share/base-app"
|
12
|
+
require "fairy/share/conf"
|
13
|
+
require "fairy/share/locale"
|
14
|
+
require "fairy/share/encoding"
|
15
|
+
require "fairy/master"
|
16
|
+
|
17
|
+
$0 = "fairy master #{ARGV.join(' ')}"
|
18
|
+
|
19
|
+
module Fairy
|
20
|
+
class MasterAPP<BaseAPP
|
21
|
+
def initialize
|
22
|
+
super
|
23
|
+
@master_port = Fairy::CONF.MASTER_PORT
|
24
|
+
end
|
25
|
+
|
26
|
+
# def parse_arg
|
27
|
+
# super
|
28
|
+
# end
|
29
|
+
|
30
|
+
def option_parser
|
31
|
+
super do |opt|
|
32
|
+
opt.on("-p", "--master_port=VAL"){|val| @master_port = val}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def start
|
37
|
+
Fairy::Master.start(@master_port)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
Fairy::MasterAPP.start
|
43
|
+
sleep
|
data/bin/subcmd/node
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
#
|
4
|
+
# Copyright (C) 2007-2010 Rakuten, Inc.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "optparse"
|
8
|
+
|
9
|
+
require "deep-connect"
|
10
|
+
|
11
|
+
require "fairy/share/base-app"
|
12
|
+
require "fairy/share/conf"
|
13
|
+
require "fairy/share/locale"
|
14
|
+
require "fairy/share/encoding"
|
15
|
+
require "fairy/node"
|
16
|
+
|
17
|
+
$0 = "fairy node #{ARGV.join(' ')}"
|
18
|
+
|
19
|
+
module Fairy
|
20
|
+
class NodeAPP<BaseAPP
|
21
|
+
def initialize
|
22
|
+
super
|
23
|
+
@master_host = Fairy::CONF.MASTER_HOST
|
24
|
+
@master_port = Fairy::CONF.MASTER_PORT
|
25
|
+
end
|
26
|
+
|
27
|
+
# def parse_arg
|
28
|
+
# super
|
29
|
+
# end
|
30
|
+
|
31
|
+
|
32
|
+
def option_parser
|
33
|
+
super do |opt|
|
34
|
+
opt.on("-m VAL"){|val| @master_host = val}
|
35
|
+
opt.on("-h", "--master_host=VAL"){|val| @master_host = val}
|
36
|
+
opt.on("-p", "--master_port=VAL"){|val| @master_port = val}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def start
|
41
|
+
Fairy::Node.start(@master_host, @master_port)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Fairy::NodeAPP.start
|
47
|
+
sleep
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require "optparse"
|
5
|
+
|
6
|
+
require "deep-connect"
|
7
|
+
|
8
|
+
require "fairy/share/base-app"
|
9
|
+
require "fairy/share/conf"
|
10
|
+
require "fairy/share/locale"
|
11
|
+
require "fairy/share/encoding"
|
12
|
+
require "fairy/processor"
|
13
|
+
|
14
|
+
$0 = "fairy processor #{ARGV.join(' ')}"
|
15
|
+
|
16
|
+
module Fairy
|
17
|
+
class ProcessorAPP<BaseAPP
|
18
|
+
def initialize
|
19
|
+
super
|
20
|
+
@node_port = nil
|
21
|
+
@id = nil
|
22
|
+
@debug_trace = Fairy::CONF.DEBUG_PROCESSOR_TRACE_ON
|
23
|
+
end
|
24
|
+
|
25
|
+
def option_parser
|
26
|
+
super do |opt|
|
27
|
+
opt.on("--node=VAL"){|val| @node_port = val}
|
28
|
+
opt.on("--id=VAL"){|val| @id = val.to_i}
|
29
|
+
opt.on("--debug_trace[=VAL]") do |val|
|
30
|
+
val = true unless val
|
31
|
+
if ["FALSE", "OFF"].include?(val.upcase)
|
32
|
+
val = false
|
33
|
+
else
|
34
|
+
val = true
|
35
|
+
end
|
36
|
+
@debug_trace = val
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def start
|
42
|
+
Fairy::Processor.start(@id, @node_port)
|
43
|
+
if @debug_trace
|
44
|
+
Log::info(self, "DEBUG TRACE ON")
|
45
|
+
require "share/tr"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Fairy::ProcessorAPP.start
|
52
|
+
|
53
|
+
sleep
|
54
|
+
|
@@ -0,0 +1,240 @@
|
|
1
|
+
<?xml version="1.0" ?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
6
|
+
<head>
|
7
|
+
<title>fairy programing interface</title>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<p>fairy programming interface</p>
|
11
|
+
<p>楽天株式会社 楽天技術研究所 </p>
|
12
|
+
<h2><a name="label-0" id="label-0">["プログラミングインターフェース"]</a></h2><!-- RDLabel: "プログラミングインターフェース" -->
|
13
|
+
<h3><a name="label-1" id="label-1">["フィルタ系メソッド"]</a></h3><!-- RDLabel: "フィルタ系メソッド" -->
|
14
|
+
<dl>
|
15
|
+
<dt><a name="label-2" id="label-2"><code>Filter#map(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#map" -->
|
16
|
+
<dd>
|
17
|
+
<p><var>block_source</var>: ブロックソースコード.</p>
|
18
|
+
<p>Rubyの Enumerable#map, Enumerable#collect 相当.
|
19
|
+
ブロックに対し、要素を入力とし、評価した結果を返す</p></dd>
|
20
|
+
<dt><a name="label-3" id="label-3"><code>Filter#collect</code></a></dt><!-- RDLabel: "Filter#collect" -->
|
21
|
+
<dd>
|
22
|
+
Filter#map の alias.</dd>
|
23
|
+
<dt><a name="label-4" id="label-4"><code>Filter#select(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#select" -->
|
24
|
+
<dd>
|
25
|
+
<p><var>block_source</var>ブロックソースコード. </p>
|
26
|
+
<p>Rubyの Enumerable#select 相当.
|
27
|
+
ブロックに対し、要素を入力とし、評価した結果が真の時、その要素を返す</p></dd>
|
28
|
+
<dt><a name="label-5" id="label-5"><code>Filter#grep(<var>regexp</var>)</code></a></dt><!-- RDLabel: "Filter#grep" -->
|
29
|
+
<dd>
|
30
|
+
<p><var>regexp</var> 正規表現.</p>
|
31
|
+
<p>Rubyの Enumerable#grep 相当.
|
32
|
+
入力要素が<var>regexp</var>でマッチしたら、その要素を返す.</p></dd>
|
33
|
+
<dt><a name="label-6" id="label-6"><code>Filter#map_flatten(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#map_flatten" -->
|
34
|
+
<dd>
|
35
|
+
<p><var>block_source</var>ブロックソースコード</p>
|
36
|
+
<p>Rubyの Enumerable#map_flatten 相当.</p>
|
37
|
+
<p>mapの結果をflattenして返す.</p></dd>
|
38
|
+
<dt><a name="label-7" id="label-7"><code>Filter#mapf</code></a></dt><!-- RDLabel: "Filter#mapf" -->
|
39
|
+
<dd>
|
40
|
+
<p>Filter#map_flattenのalias</p>
|
41
|
+
<p>例:</p>
|
42
|
+
<p>filter.mapf(%{|line| line.split(/\s+/)}...</p></dd>
|
43
|
+
<dt><a name="label-8" id="label-8"><code>Filter#inject(<var>block_source</var>, :<var>init_value</var>=>...)</code></a></dt><!-- RDLabel: "Filter#inject" -->
|
44
|
+
<dd>
|
45
|
+
結合法則の保証はユーザにまかされる.
|
46
|
+
init_value は 各inject で適用される(単位元になっている必要がある).</dd>
|
47
|
+
<dt><a name="label-9" id="label-9"><code>InjectFilter#value</code></a></dt><!-- RDLabel: "InjectFilter#value" -->
|
48
|
+
<dd>
|
49
|
+
値の取り出し.</dd>
|
50
|
+
<dt><a name="label-10" id="label-10"><code>Filter#cat(<var>filter_1</var>, <var>filter_2</var>,…)</code></a></dt><!-- RDLabel: "Filter#cat" -->
|
51
|
+
<dd>
|
52
|
+
複数のストリームの結合したストリームを返す.</dd>
|
53
|
+
<dt><a name="label-11" id="label-11"><code>Filter#equijoin(<var>other_filter</var>, <var>main_column_no</var>, [<var>other_column_no</var>])</code></a></dt><!-- RDLabel: "Filter#equijoin" -->
|
54
|
+
<dd>
|
55
|
+
<p>関係演算のjoin.</p>
|
56
|
+
<p><var>filter</var>の<var>main_column_no</var>番目のカラムと、<var>other_filter
|
57
|
+
のother_column_no</var>番目の等結合を返す.</p></dd>
|
58
|
+
<dt><a name="label-12" id="label-12"><code>Filter#direct_product(<var>filter_1</var>, <var>filter_2</var>,…, <var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#direct_product" -->
|
59
|
+
<dd>
|
60
|
+
<p><var>block_source</var>ブロックソースコード. ブロックソースへのブロック
|
61
|
+
引数は<code>|e0, e1, …|</code>.</p>
|
62
|
+
<p>Rubyの Array#product 相当. </p></dd>
|
63
|
+
<dt><a name="label-13" id="label-13"><code>Filter#barrier(:<var>mode</var> => <var>mode</var>, :<var>cond</var> => <var>condition_block</var>, :<var>buffer</var> => <var>opt</var>)</code></a></dt><!-- RDLabel: "Filter#barrier" -->
|
64
|
+
<dd>
|
65
|
+
<p>ストリームを同期させるフィルタ. </p>
|
66
|
+
<p><var>mode</var></p>
|
67
|
+
<p><var>BARRIER_NODE_CREATION</var>条件が成立するまでノード作成させない.</p>
|
68
|
+
<p><var>BARRIER_STREAM</var>データを流さない.</p>
|
69
|
+
<p><var>cond</var></p>
|
70
|
+
<p>ブロックソース. ブロックを評価し, その条件が成立するまでブロック</p>
|
71
|
+
<p><var>NODE_CREATION</var> 前段のノードがすべてそろうまでブロック</p>
|
72
|
+
<p><var>DATA_ARRIVED</var> 全サブストリームからデータが来はじめるまでブロック</p>
|
73
|
+
<p><var>ALL_DATA</var> 全データが出力されるまでブロック</p>
|
74
|
+
<p><var>buffer</var></p>
|
75
|
+
<p><var>MEMORY</var>メモリにためる</p>
|
76
|
+
<p><var>FILE</var> 一時ファイルにためる</p></dd>
|
77
|
+
<dt><a name="label-14" id="label-14"><code>Filter#product</code></a></dt><!-- RDLabel: "Filter#product" -->
|
78
|
+
<dd>
|
79
|
+
direct_productのalias</dd>
|
80
|
+
<dt><a name="label-15" id="label-15"><code>Filter#*(<var>other_filter</var>)</code></a></dt><!-- RDLabel: "Filter#*" -->
|
81
|
+
<dd>
|
82
|
+
Filter#direct_product(other_filer)と同じ</dd>
|
83
|
+
<dt><a name="label-16" id="label-16"><code>Filter.group_by(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter.group_by" -->
|
84
|
+
<dd>
|
85
|
+
<p>入力された要素を<var>block_source</var>で評価し、それによりグルーピングし、後
|
86
|
+
段へは、グループされた要素のストリームを渡す。
|
87
|
+
Rubyのgroup_byと似ている.</p>
|
88
|
+
<p>例: ワードカウント</p>
|
89
|
+
<pre>finput = fairy.input(input.vf)
|
90
|
+
fmap = finput.mapf(%{|l| l.chomp.split})
|
91
|
+
fshuffle = fmap.group_by(%{|w| w})
|
92
|
+
freduce = fshuffle.map(%q{|values| "#{values.key}\t#{values.size}"})
|
93
|
+
for w in freduce.here
|
94
|
+
puts w
|
95
|
+
end</pre></dd>
|
96
|
+
<dt><a name="label-17" id="label-17"><code>Filter#basic_group_by(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#basic_group_by" -->
|
97
|
+
<dd>
|
98
|
+
group_by一族で, 一番基本的なもの.
|
99
|
+
グループがそのままセグメントになる.</dd>
|
100
|
+
<dt><a name="label-18" id="label-18"><code>Filter.basic_mgroup_by(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter.basic_mgroup_by" -->
|
101
|
+
<dd>
|
102
|
+
<var>basic_group_by</var>の複数キー版
|
103
|
+
複数のキー毎にグルーピングされる.
|
104
|
+
グループがそのままセグメント単位になる.</dd>
|
105
|
+
<dt><a name="label-19" id="label-19"><code>Filter#merge_group_by(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#merge_group_by" -->
|
106
|
+
<dd>
|
107
|
+
<var>basic_group_by</var>とは違い、後段には、上流のセグメント単位にグルー
|
108
|
+
ピングしたストリームを要素として渡す.</dd>
|
109
|
+
<dt><a name="label-20" id="label-20"><code>Filter#seg_zip(filter_1, ..., <var>filter_n</var>, <var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#seg_zip(filter_1, ..., filter_n, block_source)" -->
|
110
|
+
<dd>
|
111
|
+
複数のストリームのセグメント毎に要素を順番に付き合わせる.</dd>
|
112
|
+
<dt><a name="label-21" id="label-21"><code>Filter#seg_join(<var>filter_1</var>,…, <var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#seg_join" -->
|
113
|
+
<dd>
|
114
|
+
<p><var>block_source</var>ブロックソースコード.</p>
|
115
|
+
<p><var>block_source</var>へのブロック引数は |in0, in1, … in_n, out|
|
116
|
+
セグメント単位にjoin処理を行う.</p>
|
117
|
+
<p>オプション引数 :by -> :key を指定すると
|
118
|
+
keyごとの突合せになる.</p></dd>
|
119
|
+
<dt><a name="label-22" id="label-22"><code>Filter#seg_shuffle(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#seg_shuffle" -->
|
120
|
+
<dd>
|
121
|
+
<p><var>block_source</var> ブロックソース. ブロックソースへのブロック引数
|
122
|
+
は、入力セグメント列、出力セグメント列 <code>|in_segment_stream、
|
123
|
+
out_segment_stream|</code>
|
124
|
+
セグメント列をblock_source順に並べ替える</p>
|
125
|
+
<p><var>cond</var></p>
|
126
|
+
<pre>+ ブロックソース. ブロックを評価し, その条件が成立するまでブロック
|
127
|
+
((|NODE_CREATION|)) 前段のノードがすべてそろうまでブロック
|
128
|
+
((|DATA_ARRIVED|)) 全サブストリームからデータが来はじめるまでブロック
|
129
|
+
((|ALL_DATA|)) 全データが出力されるまでブロック</pre>
|
130
|
+
<p><var>buffer</var></p>
|
131
|
+
<pre>((|MEMORY|))メモリにためる
|
132
|
+
((|FILE|)) 一時ファイルにためる</pre></dd>
|
133
|
+
</dl>
|
134
|
+
<h3><a name="label-23" id="label-23">["入力系メソッド"]</a></h3><!-- RDLabel: "入力系メソッド" -->
|
135
|
+
<dl>
|
136
|
+
<dt><a name="label-24" id="label-24"><code>Fairy#input(<var>desc</var>)</code></a></dt><!-- RDLabel: "Fairy#input" -->
|
137
|
+
<dd>
|
138
|
+
<var>desc</var> ローカルファイルや仮想ファイルの入力を指定する.</dd>
|
139
|
+
</dl>
|
140
|
+
<h3><a name="label-25" id="label-25">["定義系メソッド"]</a></h3><!-- RDLabel: "定義系メソッド" -->
|
141
|
+
<dl>
|
142
|
+
<dt><a name="label-26" id="label-26"><code>Fairy::def_filter(<var>name</var>, [:<var>sub</var>=><var>true</var>]){|<var>input</var>, <var>optionparam</var>…| …}</code></a></dt><!-- RDLabel: "Fairy::def_filter" -->
|
143
|
+
<dd>
|
144
|
+
ユーザレベルでフィルタを定義する
|
145
|
+
<var>sub</var>が真だとサブルーチン化する</dd>
|
146
|
+
</dl>
|
147
|
+
<h3><a name="label-27" id="label-27">["フィルタ制御"]</a></h3><!-- RDLabel: "フィルタ制御" -->
|
148
|
+
<dl>
|
149
|
+
<dt><a name="label-28" id="label-28"><code>Filter#sub(%{|<var>input</var>, <var>subfairy</var>| <var>input</var>.<var>filer</var>...})</code></a></dt><!-- RDLabel: "Filter#sub" -->
|
150
|
+
<dd>
|
151
|
+
ある程度まとまった処理があったとして、その処理が終わったら後片付け
|
152
|
+
したいとき用いる.
|
153
|
+
新しい、fairyとcontrollerを立て、親とは別に処理を行う.</dd>
|
154
|
+
<dt><a name="label-29" id="label-29"><code>BEGIN/END</code></a></dt><!-- RDLabel: "BEGIN/END" -->
|
155
|
+
<dd>
|
156
|
+
<p>filter.filter(..., :BEGIN=>begin_block_source, :END=>end_block_source)</p>
|
157
|
+
<p><var>begin_block_source</var>各フィルターで最初に実行</p>
|
158
|
+
<p><var>end_block_source</var> 最後に実行</p></dd>
|
159
|
+
<dt><a name="label-30" id="label-30"><code>break</code></a></dt><!-- RDLabel: "break" -->
|
160
|
+
<dd>
|
161
|
+
フィルタリング処理をbreakする</dd>
|
162
|
+
<dt><a name="label-31" id="label-31"><code>fairy#def_pool_variable(<var>var</var>, <var>value</var>)</code></a></dt><!-- RDLabel: "fairy#def_pool_variable" -->
|
163
|
+
<dd>
|
164
|
+
<p>fairy#def_pool_variable(var, :block => %{...})</p>
|
165
|
+
<p><var>var</var>プール変数名.</p>
|
166
|
+
<p>各フィルタで共有できるプール変数を定義する.
|
167
|
+
ブロックソースが渡された場合は, コントローラ側でブロックを評価し,
|
168
|
+
その値を代入する.
|
169
|
+
<var>value</var>はディープコピーされる.</p></dd>
|
170
|
+
<dt><a name="label-32" id="label-32"><code>fairy#pool_variable[:var] = <var>value</var></code></a></dt><!-- RDLabel: "fairy#pool_variable[:var] = value" -->
|
171
|
+
<dd>
|
172
|
+
<p>プール変数に代入する.</p>
|
173
|
+
<p>ブロックソース内からアクセスする方法:</p>
|
174
|
+
<pre>...map(#{|e| @Pool.var = ...})</pre></dd>
|
175
|
+
<dt><a name="label-33" id="label-33"><code>job インスタンス変数</code></a></dt><!-- RDLabel: "job インスタンス変数" -->
|
176
|
+
<dd>
|
177
|
+
<p>...map(#{|e| @var ...})</p>
|
178
|
+
<p>複数イテレーションで共有できる変数. ただし, 各セグメント内ローカルになる.</p></dd>
|
179
|
+
<dt><a name="label-34" id="label-34"><code>VArray</code></a></dt><!-- RDLabel: "VArray" -->
|
180
|
+
<dd>
|
181
|
+
<p>仮想配列.</p>
|
182
|
+
<p>各ストリームの計算結果を仮想的な配列に保存する.
|
183
|
+
イテレーションするときに再利用できる.
|
184
|
+
複数の下位ストリームにデータを流すことが可能.</p>
|
185
|
+
<p>利用はinput/outoutで指定する. </p>
|
186
|
+
<p>配列としてのアクセスも用意されているが、 fairy的な動きはしない.</p>
|
187
|
+
<p>Fairy.input(varray)</p>
|
188
|
+
<pre>varrayを入力として指定する.</pre>
|
189
|
+
<p>filter.output(VArray)</p>
|
190
|
+
<pre>VArray に 出力する.</pre>
|
191
|
+
<p>job.to_va</p>
|
192
|
+
<pre>VArrayに出力し、それを返す.</pre>
|
193
|
+
<p>例:</p>
|
194
|
+
<pre>va = fairy.input(Fairy::Iota, 1000).to_va
|
195
|
+
10.times do {|i| va = fairy.input(va).map(%{|i| i*2}).to_va} </pre></dd>
|
196
|
+
</dl>
|
197
|
+
<h3><a name="label-35" id="label-35">["例外"]</a></h3><!-- RDLabel: "例外" -->
|
198
|
+
<pre>ブロック実行中に発生した例外を通知する</pre>
|
199
|
+
<h3><a name="label-36" id="label-36">["STDOUT"]</a></h3><!-- RDLabel: "STDOUT" -->
|
200
|
+
<pre>ブロック内で puts 等を実行すると、クライアント側に出力される。
|
201
|
+
|
202
|
+
putsは$stdoutを参照し、かつ、グローバル変数なので、スレッドセーフ
|
203
|
+
にするために、ちょっといやらしいことをした。</pre>
|
204
|
+
<h3><a name="label-37" id="label-37">["ログAPI"]</a></h3><!-- RDLabel: "ログAPI" -->
|
205
|
+
<dl>
|
206
|
+
<dt><a name="label-38" id="label-38"><code>Fairy::log(<var>sender</var>, <var>printf</var>メッセージ, <var>param</var>...)</code></a></dt><!-- RDLabel: "Fairy::log" -->
|
207
|
+
<dd>
|
208
|
+
Fairy::log(printfメッセージ, param...)
|
209
|
+
Fairy::log(sender) {|sio| ...}</dd>
|
210
|
+
<dt><a name="label-39" id="label-39"><code>Fairy::fatal, <var>error</var>, <var>nortify</var>, <var>info</var>, <var>debug</var>(.<var>log</var>と同じパラメータ)</code></a></dt><!-- RDLabel: "Fairy::fatal, error, nortify, info, debug" -->
|
211
|
+
<dd>
|
212
|
+
普段はこちらを使う。出力レベルに応じて出力する</dd>
|
213
|
+
<dt><a name="label-40" id="label-40"><code>Fairy::log_exception(<var>sender</var>, <var>exp</var>), <var>Fairy</var>::<var>log_exception</var>(<var>exp</var>)</code></a></dt><!-- RDLabel: "Fairy::log_exception" -->
|
214
|
+
<dd>
|
215
|
+
<p>例外のバックトレースをログに書き出す</p>
|
216
|
+
<p>例:</p>
|
217
|
+
<p>Log::warn(self) do |sio|</p>
|
218
|
+
<pre>sio.puts "Warn: Exception raised:"
|
219
|
+
sio.puts $!
|
220
|
+
for l in $@
|
221
|
+
sio.puts "\t#{l}"
|
222
|
+
end</pre>
|
223
|
+
<p>end</p></dd>
|
224
|
+
<dt><a name="label-41" id="label-41"><code>fairy.conf</code></a></dt><!-- RDLabel: "fairy.conf" -->
|
225
|
+
<dd>
|
226
|
+
<p>fairyの環境設定を行うファイル.</p>
|
227
|
+
<p>検索パス(存在したら上書き).</p>
|
228
|
+
<p>/etc/fairy.conf , $FAIRY_CONF, $HOME/.fiaryrc, ./etc/fairy.conf</p>
|
229
|
+
<p>グローバルな設定</p>
|
230
|
+
<pre>CONF.MASTER_HOST
|
231
|
+
CONF.MASTER_PORT
|
232
|
+
CONF.HOME
|
233
|
+
CONF.VF_ROOT</pre>
|
234
|
+
<p>ホスト固有の設定</p>
|
235
|
+
<pre>CONF[“hostname”].MASTER_HOST
|
236
|
+
VArray に 出力する</pre></dd>
|
237
|
+
</dl>
|
238
|
+
|
239
|
+
</body>
|
240
|
+
</html>
|
@@ -0,0 +1,300 @@
|
|
1
|
+
fairy programming interface
|
2
|
+
|
3
|
+
楽天株式会社 楽天技術研究所
|
4
|
+
|
5
|
+
== プログラミングインターフェース
|
6
|
+
=== フィルタ系メソッド
|
7
|
+
|
8
|
+
--- Filter#map(block_source)
|
9
|
+
((|block_source|)): ブロックソースコード.
|
10
|
+
|
11
|
+
Rubyの Enumerable#map, Enumerable#collect 相当.
|
12
|
+
ブロックに対し、要素を入力とし、評価した結果を返す
|
13
|
+
|
14
|
+
--- Filter#collect
|
15
|
+
|
16
|
+
Filter#map の alias.
|
17
|
+
|
18
|
+
--- Filter#select(block_source)
|
19
|
+
((|block_source|))ブロックソースコード.
|
20
|
+
|
21
|
+
Rubyの Enumerable#select 相当.
|
22
|
+
ブロックに対し、要素を入力とし、評価した結果が真の時、その要素を返す
|
23
|
+
|
24
|
+
--- Filter#grep(regexp)
|
25
|
+
((|regexp|)) 正規表現.
|
26
|
+
|
27
|
+
Rubyの Enumerable#grep 相当.
|
28
|
+
入力要素が((|regexp|))でマッチしたら、その要素を返す.
|
29
|
+
|
30
|
+
--- Filter#map_flatten(block_source)
|
31
|
+
((|block_source|))ブロックソースコード
|
32
|
+
|
33
|
+
Rubyの Enumerable#map_flatten 相当.
|
34
|
+
|
35
|
+
mapの結果をflattenして返す.
|
36
|
+
|
37
|
+
--- Filter#mapf
|
38
|
+
Filter#map_flattenのalias
|
39
|
+
|
40
|
+
例:
|
41
|
+
|
42
|
+
filter.mapf(%{|line| line.split(/\s+/)}...
|
43
|
+
|
44
|
+
--- Filter#inject(block_source, :init_value=>...)
|
45
|
+
|
46
|
+
結合法則の保証はユーザにまかされる.
|
47
|
+
init_value は 各inject で適用される(単位元になっている必要がある).
|
48
|
+
|
49
|
+
--- InjectFilter#value
|
50
|
+
|
51
|
+
値の取り出し.
|
52
|
+
|
53
|
+
--- Filter#cat(filter_1, filter_2,…)
|
54
|
+
|
55
|
+
複数のストリームの結合したストリームを返す.
|
56
|
+
|
57
|
+
|
58
|
+
--- Filter#equijoin(other_filter, main_column_no, [other_column_no])
|
59
|
+
関係演算のjoin.
|
60
|
+
|
61
|
+
((|filter|))の((|main_column_no|))番目のカラムと、((|other_filter
|
62
|
+
のother_column_no|))番目の等結合を返す.
|
63
|
+
|
64
|
+
--- Filter#direct_product(filter_1, filter_2,…, block_source)
|
65
|
+
|
66
|
+
((|block_source|))ブロックソースコード. ブロックソースへのブロック
|
67
|
+
引数は(({|e0, e1, …|})).
|
68
|
+
|
69
|
+
Rubyの Array#product 相当.
|
70
|
+
|
71
|
+
--- Filter#barrier(:mode => mode, :cond => condition_block, :buffer => opt)
|
72
|
+
|
73
|
+
ストリームを同期させるフィルタ.
|
74
|
+
|
75
|
+
((|mode|))
|
76
|
+
|
77
|
+
((|BARRIER_NODE_CREATION|))条件が成立するまでノード作成させない.
|
78
|
+
|
79
|
+
((|BARRIER_STREAM|))データを流さない.
|
80
|
+
|
81
|
+
((|cond|))
|
82
|
+
|
83
|
+
ブロックソース. ブロックを評価し, その条件が成立するまでブロック
|
84
|
+
|
85
|
+
((|NODE_CREATION|)) 前段のノードがすべてそろうまでブロック
|
86
|
+
|
87
|
+
((|DATA_ARRIVED|)) 全サブストリームからデータが来はじめるまでブロック
|
88
|
+
|
89
|
+
((|ALL_DATA|)) 全データが出力されるまでブロック
|
90
|
+
|
91
|
+
((|buffer|))
|
92
|
+
|
93
|
+
((|MEMORY|))メモリにためる
|
94
|
+
|
95
|
+
((|FILE|)) 一時ファイルにためる
|
96
|
+
|
97
|
+
--- Filter#product
|
98
|
+
|
99
|
+
direct_productのalias
|
100
|
+
|
101
|
+
--- Filter#*(other_filter)
|
102
|
+
|
103
|
+
Filter#direct_product(other_filer)と同じ
|
104
|
+
|
105
|
+
--- Filter.group_by(block_source)
|
106
|
+
|
107
|
+
入力された要素を((|block_source|))で評価し、それによりグルーピングし、後
|
108
|
+
段へは、グループされた要素のストリームを渡す。
|
109
|
+
Rubyのgroup_byと似ている.
|
110
|
+
|
111
|
+
例: ワードカウント
|
112
|
+
|
113
|
+
finput = fairy.input(input.vf)
|
114
|
+
fmap = finput.mapf(%{|l| l.chomp.split})
|
115
|
+
fshuffle = fmap.group_by(%{|w| w})
|
116
|
+
freduce = fshuffle.map(%q{|values| "#{values.key}\t#{values.size}"})
|
117
|
+
for w in freduce.here
|
118
|
+
puts w
|
119
|
+
end
|
120
|
+
|
121
|
+
--- Filter#basic_group_by(block_source)
|
122
|
+
|
123
|
+
group_by一族で, 一番基本的なもの.
|
124
|
+
グループがそのままセグメントになる.
|
125
|
+
|
126
|
+
--- Filter.basic_mgroup_by(block_source)
|
127
|
+
|
128
|
+
((|basic_group_by|))の複数キー版
|
129
|
+
複数のキー毎にグルーピングされる.
|
130
|
+
グループがそのままセグメント単位になる.
|
131
|
+
|
132
|
+
--- Filter#merge_group_by(block_source)
|
133
|
+
|
134
|
+
((|basic_group_by|))とは違い、後段には、上流のセグメント単位にグルー
|
135
|
+
ピングしたストリームを要素として渡す.
|
136
|
+
|
137
|
+
--- Filter#seg_zip(filter_1, ..., filter_n, block_source)
|
138
|
+
|
139
|
+
複数のストリームのセグメント毎に要素を順番に付き合わせる.
|
140
|
+
|
141
|
+
--- Filter#seg_join(filter_1,…, block_source)
|
142
|
+
((|block_source|))ブロックソースコード.
|
143
|
+
|
144
|
+
((|block_source|))へのブロック引数は |in0, in1, … in_n, out|
|
145
|
+
セグメント単位にjoin処理を行う.
|
146
|
+
|
147
|
+
オプション引数 :by -> :key を指定すると
|
148
|
+
keyごとの突合せになる.
|
149
|
+
|
150
|
+
--- Filter#seg_shuffle(block_source)
|
151
|
+
|
152
|
+
((|block_source|)) ブロックソース. ブロックソースへのブロック引数
|
153
|
+
は、入力セグメント列、出力セグメント列 (({|in_segment_stream、
|
154
|
+
out_segment_stream|}))
|
155
|
+
セグメント列をblock_source順に並べ替える
|
156
|
+
|
157
|
+
((|cond|))
|
158
|
+
+ ブロックソース. ブロックを評価し, その条件が成立するまでブロック
|
159
|
+
((|NODE_CREATION|)) 前段のノードがすべてそろうまでブロック
|
160
|
+
((|DATA_ARRIVED|)) 全サブストリームからデータが来はじめるまでブロック
|
161
|
+
((|ALL_DATA|)) 全データが出力されるまでブロック
|
162
|
+
((|buffer|))
|
163
|
+
((|MEMORY|))メモリにためる
|
164
|
+
((|FILE|)) 一時ファイルにためる
|
165
|
+
|
166
|
+
|
167
|
+
=== 入力系メソッド
|
168
|
+
|
169
|
+
--- Fairy#input(desc)
|
170
|
+
|
171
|
+
((|desc|)) ローカルファイルや仮想ファイルの入力を指定する.
|
172
|
+
|
173
|
+
=== 定義系メソッド
|
174
|
+
|
175
|
+
--- Fairy::def_filter(name, [:sub=>true]){|input, optionparam…| …}
|
176
|
+
|
177
|
+
ユーザレベルでフィルタを定義する
|
178
|
+
((|sub|))が真だとサブルーチン化する
|
179
|
+
|
180
|
+
=== フィルタ制御
|
181
|
+
--- Filter#sub(%{|input, subfairy| input.filer...})
|
182
|
+
|
183
|
+
ある程度まとまった処理があったとして、その処理が終わったら後片付け
|
184
|
+
したいとき用いる.
|
185
|
+
新しい、fairyとcontrollerを立て、親とは別に処理を行う.
|
186
|
+
|
187
|
+
--- BEGIN/END
|
188
|
+
|
189
|
+
filter.filter(..., :BEGIN=>begin_block_source, :END=>end_block_source)
|
190
|
+
|
191
|
+
((|begin_block_source|))各フィルターで最初に実行
|
192
|
+
|
193
|
+
((|end_block_source|)) 最後に実行
|
194
|
+
|
195
|
+
--- break
|
196
|
+
フィルタリング処理をbreakする
|
197
|
+
|
198
|
+
--- fairy#def_pool_variable(var, value)
|
199
|
+
fairy#def_pool_variable(var, :block => %{...})
|
200
|
+
|
201
|
+
((|var|))プール変数名.
|
202
|
+
|
203
|
+
各フィルタで共有できるプール変数を定義する.
|
204
|
+
ブロックソースが渡された場合は, コントローラ側でブロックを評価し,
|
205
|
+
その値を代入する.
|
206
|
+
((|value|))はディープコピーされる.
|
207
|
+
|
208
|
+
--- fairy#pool_variable[:var] = value
|
209
|
+
|
210
|
+
プール変数に代入する.
|
211
|
+
|
212
|
+
ブロックソース内からアクセスする方法:
|
213
|
+
|
214
|
+
...map(#{|e| @Pool.var = ...})
|
215
|
+
|
216
|
+
--- job インスタンス変数
|
217
|
+
|
218
|
+
...map(#{|e| @var ...})
|
219
|
+
|
220
|
+
複数イテレーションで共有できる変数. ただし, 各セグメント内ローカルになる.
|
221
|
+
|
222
|
+
|
223
|
+
--- VArray
|
224
|
+
仮想配列.
|
225
|
+
|
226
|
+
各ストリームの計算結果を仮想的な配列に保存する.
|
227
|
+
イテレーションするときに再利用できる.
|
228
|
+
複数の下位ストリームにデータを流すことが可能.
|
229
|
+
|
230
|
+
利用はinput/outoutで指定する.
|
231
|
+
|
232
|
+
配列としてのアクセスも用意されているが、 fairy的な動きはしない.
|
233
|
+
|
234
|
+
Fairy.input(varray)
|
235
|
+
varrayを入力として指定する.
|
236
|
+
filter.output(VArray)
|
237
|
+
VArray に 出力する.
|
238
|
+
job.to_va
|
239
|
+
VArrayに出力し、それを返す.
|
240
|
+
|
241
|
+
例:
|
242
|
+
va = fairy.input(Fairy::Iota, 1000).to_va
|
243
|
+
10.times do {|i| va = fairy.input(va).map(%{|i| i*2}).to_va}
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
=== 例外
|
248
|
+
|
249
|
+
ブロック実行中に発生した例外を通知する
|
250
|
+
|
251
|
+
=== STDOUT
|
252
|
+
|
253
|
+
ブロック内で puts 等を実行すると、クライアント側に出力される。
|
254
|
+
|
255
|
+
putsは$stdoutを参照し、かつ、グローバル変数なので、スレッドセーフ
|
256
|
+
にするために、ちょっといやらしいことをした。
|
257
|
+
|
258
|
+
|
259
|
+
=== ログAPI
|
260
|
+
|
261
|
+
--- Fairy::log(sender, printfメッセージ, param...)
|
262
|
+
Fairy::log(printfメッセージ, param...)
|
263
|
+
Fairy::log(sender) {|sio| ...}
|
264
|
+
|
265
|
+
--- Fairy::fatal, error, nortify, info, debug(.logと同じパラメータ)
|
266
|
+
|
267
|
+
普段はこちらを使う。出力レベルに応じて出力する
|
268
|
+
|
269
|
+
--- Fairy::log_exception(sender, exp), Fairy::log_exception(exp)
|
270
|
+
例外のバックトレースをログに書き出す
|
271
|
+
|
272
|
+
例:
|
273
|
+
|
274
|
+
Log::warn(self) do |sio|
|
275
|
+
sio.puts "Warn: Exception raised:"
|
276
|
+
sio.puts $!
|
277
|
+
for l in $@
|
278
|
+
sio.puts "\t#{l}"
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
--- fairy.conf
|
283
|
+
|
284
|
+
fairyの環境設定を行うファイル.
|
285
|
+
|
286
|
+
検索パス(存在したら上書き).
|
287
|
+
|
288
|
+
/etc/fairy.conf , $FAIRY_CONF, $HOME/.fiaryrc, ./etc/fairy.conf
|
289
|
+
|
290
|
+
グローバルな設定
|
291
|
+
CONF.MASTER_HOST
|
292
|
+
CONF.MASTER_PORT
|
293
|
+
CONF.HOME
|
294
|
+
CONF.VF_ROOT
|
295
|
+
|
296
|
+
ホスト固有の設定
|
297
|
+
CONF[“hostname”].MASTER_HOST
|
298
|
+
VArray に 出力する
|
299
|
+
|
300
|
+
|