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.
Files changed (186) hide show
  1. data/LICENSE +674 -0
  2. data/Makefile +116 -0
  3. data/README +15 -0
  4. data/bin/fairy +582 -0
  5. data/bin/fairy-cat +74 -0
  6. data/bin/fairy-cp +128 -0
  7. data/bin/fairy-rm +122 -0
  8. data/bin/subcmd/controller +41 -0
  9. data/bin/subcmd/inspector +81 -0
  10. data/bin/subcmd/master +43 -0
  11. data/bin/subcmd/node +47 -0
  12. data/bin/subcmd/processor +54 -0
  13. data/doc/programming-interface.html +240 -0
  14. data/doc/programming-interface.rd +300 -0
  15. data/etc/fairy.conf.tmpl +118 -0
  16. data/ext/simple_hash/extconf.rb +4 -0
  17. data/ext/simple_hash/simple_hash.c +42 -0
  18. data/fairy.gemspec +60 -0
  19. data/lib/fairy/client/addins.rb +20 -0
  20. data/lib/fairy/client/barrier.rb +29 -0
  21. data/lib/fairy/client/basic-group-by.rb +52 -0
  22. data/lib/fairy/client/cat.rb +41 -0
  23. data/lib/fairy/client/direct-product.rb +51 -0
  24. data/lib/fairy/client/equijoin.rb +79 -0
  25. data/lib/fairy/client/exec.rb +54 -0
  26. data/lib/fairy/client/filter.rb +62 -0
  27. data/lib/fairy/client/find.rb +35 -0
  28. data/lib/fairy/client/group-by.rb +194 -0
  29. data/lib/fairy/client/here.rb +84 -0
  30. data/lib/fairy/client/inject.rb +70 -0
  31. data/lib/fairy/client/input-file.rb +53 -0
  32. data/lib/fairy/client/input-iota.rb +49 -0
  33. data/lib/fairy/client/input-local-file.rb +188 -0
  34. data/lib/fairy/client/input-varray.rb +30 -0
  35. data/lib/fairy/client/input.rb +42 -0
  36. data/lib/fairy/client/io-filter.rb +26 -0
  37. data/lib/fairy/client/junction.rb +31 -0
  38. data/lib/fairy/client/map.rb +34 -0
  39. data/lib/fairy/client/merge-group-by.rb +71 -0
  40. data/lib/fairy/client/output-file.rb +64 -0
  41. data/lib/fairy/client/output-local-file.rb +60 -0
  42. data/lib/fairy/client/output-null.rb +47 -0
  43. data/lib/fairy/client/output-varray.rb +50 -0
  44. data/lib/fairy/client/output.rb +29 -0
  45. data/lib/fairy/client/roma-put.rb +62 -0
  46. data/lib/fairy/client/roma.rb +156 -0
  47. data/lib/fairy/client/seg-join.rb +61 -0
  48. data/lib/fairy/client/seg-map.rb +78 -0
  49. data/lib/fairy/client/seg-shuffle.rb +35 -0
  50. data/lib/fairy/client/seg-split.rb +27 -0
  51. data/lib/fairy/client/seg-zip.rb +60 -0
  52. data/lib/fairy/client/select.rb +38 -0
  53. data/lib/fairy/client/sort.rb +48 -0
  54. data/lib/fairy/client/sort18.rb +56 -0
  55. data/lib/fairy/client/sort19.rb +61 -0
  56. data/lib/fairy/client/there.rb +47 -0
  57. data/lib/fairy/client/top_n_into_roma.rb +34 -0
  58. data/lib/fairy/client/wc.rb +92 -0
  59. data/lib/fairy/controller.rb +1103 -0
  60. data/lib/fairy/logger.rb +107 -0
  61. data/lib/fairy/master/addins.rb +20 -0
  62. data/lib/fairy/master/atom.rb +17 -0
  63. data/lib/fairy/master/c-barrier.rb +283 -0
  64. data/lib/fairy/master/c-basic-group-by.rb +250 -0
  65. data/lib/fairy/master/c-cat.rb +159 -0
  66. data/lib/fairy/master/c-direct-product.rb +203 -0
  67. data/lib/fairy/master/c-exec.rb +68 -0
  68. data/lib/fairy/master/c-filter.rb +422 -0
  69. data/lib/fairy/master/c-find.rb +138 -0
  70. data/lib/fairy/master/c-group-by.rb +64 -0
  71. data/lib/fairy/master/c-here.rb +80 -0
  72. data/lib/fairy/master/c-inject.rb +119 -0
  73. data/lib/fairy/master/c-input-file.rb +46 -0
  74. data/lib/fairy/master/c-input-iota.rb +66 -0
  75. data/lib/fairy/master/c-input-local-file.rb +117 -0
  76. data/lib/fairy/master/c-input-varray.rb +53 -0
  77. data/lib/fairy/master/c-input.rb +24 -0
  78. data/lib/fairy/master/c-inputtable.rb +31 -0
  79. data/lib/fairy/master/c-inputtable18.rb +36 -0
  80. data/lib/fairy/master/c-inputtable19.rb +35 -0
  81. data/lib/fairy/master/c-io-filter.rb +28 -0
  82. data/lib/fairy/master/c-junction.rb +54 -0
  83. data/lib/fairy/master/c-map.rb +27 -0
  84. data/lib/fairy/master/c-merge-group-by.rb +241 -0
  85. data/lib/fairy/master/c-output-file.rb +84 -0
  86. data/lib/fairy/master/c-output-local-file.rb +19 -0
  87. data/lib/fairy/master/c-output-null.rb +45 -0
  88. data/lib/fairy/master/c-output-varray.rb +57 -0
  89. data/lib/fairy/master/c-output.rb +20 -0
  90. data/lib/fairy/master/c-seg-join.rb +141 -0
  91. data/lib/fairy/master/c-seg-map.rb +26 -0
  92. data/lib/fairy/master/c-seg-shuffle.rb +87 -0
  93. data/lib/fairy/master/c-seg-split.rb +110 -0
  94. data/lib/fairy/master/c-seg-zip.rb +132 -0
  95. data/lib/fairy/master/c-select.rb +27 -0
  96. data/lib/fairy/master/c-sort.rb +108 -0
  97. data/lib/fairy/master/c-there.rb +57 -0
  98. data/lib/fairy/master/c-wc.rb +232 -0
  99. data/lib/fairy/master/job-interpriter.rb +19 -0
  100. data/lib/fairy/master/scheduler.rb +24 -0
  101. data/lib/fairy/master.rb +329 -0
  102. data/lib/fairy/node/addins.rb +19 -0
  103. data/lib/fairy/node/p-barrier.rb +95 -0
  104. data/lib/fairy/node/p-basic-group-by.rb +252 -0
  105. data/lib/fairy/node/p-direct-product.rb +153 -0
  106. data/lib/fairy/node/p-exec.rb +30 -0
  107. data/lib/fairy/node/p-filter.rb +363 -0
  108. data/lib/fairy/node/p-find.rb +111 -0
  109. data/lib/fairy/node/p-group-by.rb +1534 -0
  110. data/lib/fairy/node/p-here.rb +21 -0
  111. data/lib/fairy/node/p-identity.rb +24 -0
  112. data/lib/fairy/node/p-inject.rb +127 -0
  113. data/lib/fairy/node/p-input-file.rb +108 -0
  114. data/lib/fairy/node/p-input-iota.rb +39 -0
  115. data/lib/fairy/node/p-input-local-file.rb +61 -0
  116. data/lib/fairy/node/p-input-varray.rb +26 -0
  117. data/lib/fairy/node/p-io-filter.rb +28 -0
  118. data/lib/fairy/node/p-map.rb +40 -0
  119. data/lib/fairy/node/p-merger-group-by.rb +48 -0
  120. data/lib/fairy/node/p-output-file.rb +104 -0
  121. data/lib/fairy/node/p-output-local-file.rb +14 -0
  122. data/lib/fairy/node/p-output-null.rb +32 -0
  123. data/lib/fairy/node/p-output-varray.rb +41 -0
  124. data/lib/fairy/node/p-seg-join.rb +82 -0
  125. data/lib/fairy/node/p-seg-map.rb +34 -0
  126. data/lib/fairy/node/p-seg-split.rb +61 -0
  127. data/lib/fairy/node/p-seg-zip.rb +79 -0
  128. data/lib/fairy/node/p-select.rb +40 -0
  129. data/lib/fairy/node/p-single-exportable.rb +90 -0
  130. data/lib/fairy/node/p-sort.rb +195 -0
  131. data/lib/fairy/node/p-task.rb +113 -0
  132. data/lib/fairy/node/p-there.rb +44 -0
  133. data/lib/fairy/node/p-wc.rb +266 -0
  134. data/lib/fairy/node.rb +187 -0
  135. data/lib/fairy/processor.rb +510 -0
  136. data/lib/fairy/share/base-app.rb +114 -0
  137. data/lib/fairy/share/block-source.rb +234 -0
  138. data/lib/fairy/share/conf.rb +396 -0
  139. data/lib/fairy/share/debug.rb +21 -0
  140. data/lib/fairy/share/encoding.rb +17 -0
  141. data/lib/fairy/share/fast-tempfile.rb +93 -0
  142. data/lib/fairy/share/file-place.rb +176 -0
  143. data/lib/fairy/share/hash-1.rb +20 -0
  144. data/lib/fairy/share/hash-md5.rb +28 -0
  145. data/lib/fairy/share/hash-murmur.rb +69 -0
  146. data/lib/fairy/share/hash-rb18.rb +20 -0
  147. data/lib/fairy/share/hash-simple-hash.rb +28 -0
  148. data/lib/fairy/share/inspector.rb +16 -0
  149. data/lib/fairy/share/lc/exceptions.rb +82 -0
  150. data/lib/fairy/share/lc/ja/exceptions.rb +81 -0
  151. data/lib/fairy/share/locale.rb +17 -0
  152. data/lib/fairy/share/log.rb +215 -0
  153. data/lib/fairy/share/pool-dictionary.rb +53 -0
  154. data/lib/fairy/share/port-marshaled-queue.rb +347 -0
  155. data/lib/fairy/share/port.rb +1697 -0
  156. data/lib/fairy/share/reference.rb +45 -0
  157. data/lib/fairy/share/stdout.rb +56 -0
  158. data/lib/fairy/share/tr.rb +16 -0
  159. data/lib/fairy/share/varray.rb +147 -0
  160. data/lib/fairy/share/vfile.rb +183 -0
  161. data/lib/fairy/version.rb +8 -0
  162. data/lib/fairy.rb +206 -0
  163. data/sample/grep.rb +46 -0
  164. data/sample/ping.rb +19 -0
  165. data/sample/sort.rb +102 -0
  166. data/sample/wordcount.rb +61 -0
  167. data/spec/README +12 -0
  168. data/spec/fairy1_spec.rb +31 -0
  169. data/spec/fairy2_spec.rb +42 -0
  170. data/spec/fairy3_spec.rb +126 -0
  171. data/spec/fairy4_spec.rb +63 -0
  172. data/spec/fairy5_spec.rb +45 -0
  173. data/spec/fairy6_spec.rb +52 -0
  174. data/spec/fairy7_spec.rb +58 -0
  175. data/spec/fairy8_spec.rb +48 -0
  176. data/spec/mkdat.rb +148 -0
  177. data/spec/run_all.sh +65 -0
  178. data/test/testc.rb +7111 -0
  179. data/tools/cap_recipe/Capfile +144 -0
  180. data/tools/cap_recipe/cluster.yml.sample +14 -0
  181. data/tools/fairy_perf_graph.rb +444 -0
  182. data/tools/git-tag +44 -0
  183. data/tools/log-analysis.rb +62 -0
  184. data/tools/svn-ls-diff +38 -0
  185. data/tools/svn-tags +37 -0
  186. 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>=&gt;...)</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> =&gt; <var>mode</var>, :<var>cond</var> =&gt; <var>condition_block</var>, :<var>buffer</var> =&gt; <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 -&gt; :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>=&gt;<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=&gt;begin_block_source, :END=&gt;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 =&gt; %{...})</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
+