fairy 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|