ruote-beanstalk 2.1.10

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/CHANGELOG.txt ADDED
@@ -0,0 +1,8 @@
1
+
2
+ = ruote-beanstalk - CHANGELOG.txt
3
+
4
+
5
+ == ruote-beanstalk 2.1.10 release 2010/06/15
6
+
7
+ - initial release
8
+
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+
2
+ Copyright (c) 2010-2010, John Mettraux, jmettraux@gmail.com
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in
12
+ all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ THE SOFTWARE.
21
+
data/README.md ADDED
@@ -0,0 +1,140 @@
1
+
2
+ # ruote-beanstalk
3
+
4
+ Beanstalk extensions for ruote 2.1 (a Ruby workflow engine).
5
+
6
+ "Beanstalk is a simple, fast workqueue service" (http://kr.github.com/beanstalkd/).
7
+
8
+ ruote-beanstalk provides a participant/receiver pair. Emitting workitems to a Beanstalk queue/tube and listening/receiving them back. Workers can connect to the Beanstalk queue, receive workitems, do some work and then (optionally) send the updated workitem back to the ruote system.
9
+
10
+ There is a bonus : Ruote::Beanstalk::BsStorage, a storage implementation for ruote. Workers and engines can connect over Beanstalk to a shared storage.
11
+
12
+ BsStorage listens to a Beanstalk queue where it receives storage orders that it conveys to a FsStorage instance.
13
+
14
+ (Initially I tried to use Beanstalk for msgs and schedules as well, but since you can't delete a delayed message in Beanstalk (as of now), I fell back to using Beanstalk as middleware, it's slightly slower, but much simpler and robust).
15
+
16
+ RDOC : http://ruote.rubyforge.org/ruote-beanstalk_rdoc/
17
+
18
+
19
+ ## usage
20
+
21
+ ### Ruote::Beanstalk::BsParticipant and BsReceiver
22
+
23
+ Registering a Beanstalk participant :
24
+
25
+ @engine.register_participant(
26
+ 'alpha',
27
+ Ruote::Beanstalk::BsParticipant,
28
+ 'beanstalk' => '127.0.0.1:11300',
29
+ 'tube' => 'ruote-workitems')
30
+
31
+
32
+ Binding a listener to a storage or an engine :
33
+
34
+ Ruote::Beanstalk::BsReceiver.new(
35
+ engine, '127.0.0.1:11300', 'tube' => 'ruote-incoming')
36
+
37
+ # or
38
+
39
+ Ruote::Beanstalk::BsReceiver.new(
40
+ storage, '127.0.0.1:11300', 'tube' => 'ruote-incoming')
41
+
42
+ The receiver manages a thread that listens to incoming messages and feeds them to ruote via the engine or directly via a storage.
43
+
44
+
45
+ ### Ruote::Beanstalk::BsStorage
46
+
47
+ There are two modes in which BsStorage can be used :
48
+
49
+ * bound to a remote storage (client)
50
+ * bound to the physical storage (server)
51
+
52
+ There should always be at least 1 server and 1 client.
53
+
54
+ <a href="http://github.com/jmettraux/ruote-beanstalk/raw/ruote2.1/doc/storages.png"><img src="http://github.com/jmettraux/ruote-beanstalk/raw/ruote2.1/doc/storages.png" /></a>
55
+
56
+ Beanstalk is the intermediary.
57
+
58
+
59
+ #### client
60
+
61
+ Pass a string of the form host:port and a hash of options :
62
+
63
+ Ruote::Beanstalk::BsStorage.new('127.0.0.1:11300', opts)
64
+
65
+ Wrapped in an engine + worker :
66
+
67
+ engine = Ruote::Engine.new(
68
+ Ruote::Worker.new(
69
+ Ruote::Beanstalk::BsStorage.new('127.0.0.1:11300', opts)))
70
+
71
+ #### server
72
+
73
+ This piece of ruby starts a Beanstalk instance (:fork => true) and starts a BsStorage 'server' coupled to an embedded FsStorage :
74
+
75
+ require 'ruote/beanstalk'
76
+
77
+ Ruote::Beanstalk::BsStorage.new(':11300', 'ruote_work', :fork => true)
78
+
79
+
80
+ ## running tests
81
+
82
+ ### Ruote::Beanstalk::BsParticipant and BsReceiver
83
+
84
+ Simply do
85
+
86
+ ruby test/test.rb
87
+
88
+ in your ruote-beanstalk/ directory.
89
+
90
+
91
+ ### Ruote::Beanstalk::BsStorage
92
+
93
+ assuming you have
94
+
95
+ ruote/
96
+ ruote-beanstalk/
97
+
98
+ In a separate terminal, go to ruote-beanstalk/ and launch
99
+
100
+ ruby serve.rb
101
+
102
+ To launch a beanstalkd + fs storage couple, then run unit or functional tests
103
+
104
+
105
+ * unit tests :
106
+
107
+ get into ruote/ and do
108
+
109
+ ruby test/unit/storage.rb --beanstalk
110
+
111
+ * functional tests :
112
+
113
+ get into ruote/ and do
114
+
115
+ ruby test/functional/test.rb --beanstalk
116
+
117
+
118
+ ## license
119
+
120
+ MIT
121
+
122
+
123
+ ## links
124
+
125
+ * http://kr.github.com/beanstalkd/
126
+
127
+ * http://ruote.rubyforge.org/
128
+ * http://github.com/jmettraux/ruote-beanstalk
129
+
130
+
131
+ ## feedback
132
+
133
+ mailing list : http://groups.google.com/group/openwferu-users
134
+ irc : irc.freenode.net #ruote
135
+
136
+
137
+ ## many thanks to
138
+
139
+ - the beanstalk authors and contributors
140
+
data/Rakefile ADDED
@@ -0,0 +1,90 @@
1
+
2
+ require 'rubygems'
3
+ require 'rake'
4
+
5
+ require 'lib/ruote/beanstalk/version.rb'
6
+
7
+ #
8
+ # CLEAN
9
+
10
+ require 'rake/clean'
11
+ CLEAN.include('pkg', 'tmp', 'html', 'rdoc')
12
+ task :default => [ :clean ]
13
+
14
+
15
+ #
16
+ # GEM
17
+
18
+ require 'jeweler'
19
+
20
+ Jeweler::Tasks.new do |gem|
21
+
22
+ gem.version = Ruote::Beanstalk::VERSION
23
+ gem.name = 'ruote-beanstalk'
24
+ gem.summary = 'Beanstalk participant/receiver/storage for ruote (a Ruby workflow engine)'
25
+ gem.description = %{
26
+ Beanstalk participant/receiver/storage for ruote (a Ruby workflow engine)
27
+ }.strip
28
+ gem.email = 'jmettraux@gmail.com'
29
+ gem.homepage = 'http://github.com/jmettraux/ruote-beanstalk'
30
+ gem.authors = [ 'John Mettraux' ]
31
+ gem.rubyforge_project = 'ruote'
32
+
33
+ gem.test_file = 'test/test.rb'
34
+
35
+ gem.add_dependency 'ruote', ">= #{Ruote::Beanstalk::VERSION}"
36
+ gem.add_dependency 'rufus-cloche', '>= 0.1.17'
37
+ gem.add_dependency 'beanstalk-client', '>= 1.0.2'
38
+ gem.add_development_dependency 'yard'
39
+ gem.add_development_dependency 'rake'
40
+ gem.add_development_dependency 'jeweler'
41
+
42
+ # gemspec spec : http://www.rubygems.org/read/chapter/20
43
+ end
44
+ Jeweler::GemcutterTasks.new
45
+
46
+
47
+ #
48
+ # DOC
49
+
50
+ #begin
51
+ #
52
+ # require 'yard'
53
+ #
54
+ # YARD::Rake::YardocTask.new do |doc|
55
+ # doc.options = [
56
+ # '-o', 'html/ruote-beanstalk', '--title',
57
+ # "ruote-beanstalk #{Ruote::Beanstalk::VERSION}"
58
+ # ]
59
+ # end
60
+ #
61
+ #rescue LoadError
62
+ #
63
+ # task :yard do
64
+ # abort "YARD is not available : sudo gem install yard"
65
+ # end
66
+ #end
67
+
68
+ #
69
+ # make sure to have rdoc 2.5.x to run that
70
+ #
71
+ require 'rake/rdoctask'
72
+ Rake::RDocTask.new do |rd|
73
+ rd.main = 'README.rdoc'
74
+ rd.rdoc_dir = 'rdoc/ruote-beanstalk_rdoc'
75
+ rd.rdoc_files.include('README.rdoc', 'CHANGELOG.txt', 'lib/**/*.rb')
76
+ rd.title = "ruote-beanstalk #{Ruote::Beanstalk::VERSION}"
77
+ end
78
+
79
+
80
+ #
81
+ # TO THE WEB
82
+
83
+ task :upload_website => [ :clean, :rdoc ] do
84
+
85
+ account = 'jmettraux@rubyforge.org'
86
+ webdir = '/var/www/gforge-projects/ruote'
87
+
88
+ sh "rsync -azv -e ssh rdoc/ruote-beanstalk_rdoc #{account}:#{webdir}/"
89
+ end
90
+
data/TODO.txt ADDED
@@ -0,0 +1,20 @@
1
+
2
+ [o] scheduled jobs : do not use delayed jobs
3
+ [x] put_back in the operate loop ?
4
+ [x] test with beanstalk -b ruote_work/beanstalk/ or something
5
+ no need for beanstalk binlog
6
+ [o] drop the msgs idiosyncrasies ?
7
+ at first try to go all the way with msgs vs commands
8
+ |
9
+ one of the disadvantages of msgs + commands is that
10
+ schedules are not stored at the same place as the exps/workitems/...
11
+ [o] fork beanstalk S(d, 'iface:port', :fork => true)
12
+ [o] operate : sign messages (tube AND timestamp)
13
+ [o] security issue in #serve (send)
14
+ [o] receiver : launchitem ?
15
+ [o] 'commands' channel : better name ?
16
+
17
+ [ ] operate : better name ?
18
+
19
+ [ ] rw : document participant / receiver (use bs as an example)
20
+
@@ -0,0 +1,809 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>ActiveLayerIndex</key>
6
+ <integer>0</integer>
7
+ <key>ApplicationVersion</key>
8
+ <array>
9
+ <string>com.omnigroup.OmniGraffle</string>
10
+ <string>138.14.0.129428</string>
11
+ </array>
12
+ <key>AutoAdjust</key>
13
+ <true/>
14
+ <key>BackgroundGraphic</key>
15
+ <dict>
16
+ <key>Bounds</key>
17
+ <string>{{0, 0}, {1118, 783}}</string>
18
+ <key>Class</key>
19
+ <string>SolidGraphic</string>
20
+ <key>ID</key>
21
+ <integer>2</integer>
22
+ <key>Style</key>
23
+ <dict>
24
+ <key>shadow</key>
25
+ <dict>
26
+ <key>Draws</key>
27
+ <string>NO</string>
28
+ </dict>
29
+ <key>stroke</key>
30
+ <dict>
31
+ <key>Draws</key>
32
+ <string>NO</string>
33
+ </dict>
34
+ </dict>
35
+ </dict>
36
+ <key>CanvasOrigin</key>
37
+ <string>{0, 0}</string>
38
+ <key>ColumnAlign</key>
39
+ <integer>1</integer>
40
+ <key>ColumnSpacing</key>
41
+ <real>36</real>
42
+ <key>CreationDate</key>
43
+ <string>2010-06-14 14:29:55 +0900</string>
44
+ <key>Creator</key>
45
+ <string>John Mettraux</string>
46
+ <key>DisplayScale</key>
47
+ <string>1 0/72 in = 1 0/72 in</string>
48
+ <key>GraphDocumentVersion</key>
49
+ <integer>6</integer>
50
+ <key>GraphicsList</key>
51
+ <array>
52
+ <dict>
53
+ <key>Bounds</key>
54
+ <string>{{13, 307}, {541, 96}}</string>
55
+ <key>Class</key>
56
+ <string>ShapedGraphic</string>
57
+ <key>ID</key>
58
+ <integer>13</integer>
59
+ <key>ImageID</key>
60
+ <integer>2</integer>
61
+ <key>Shape</key>
62
+ <string>Rectangle</string>
63
+ <key>Style</key>
64
+ <dict>
65
+ <key>fill</key>
66
+ <dict>
67
+ <key>Draws</key>
68
+ <string>NO</string>
69
+ </dict>
70
+ <key>stroke</key>
71
+ <dict>
72
+ <key>Draws</key>
73
+ <string>NO</string>
74
+ </dict>
75
+ </dict>
76
+ </dict>
77
+ <dict>
78
+ <key>Bounds</key>
79
+ <string>{{64, 93}, {195, 218}}</string>
80
+ <key>Class</key>
81
+ <string>ShapedGraphic</string>
82
+ <key>FontInfo</key>
83
+ <dict>
84
+ <key>Color</key>
85
+ <dict>
86
+ <key>w</key>
87
+ <string>0</string>
88
+ </dict>
89
+ <key>Font</key>
90
+ <string>HelveticaNeue</string>
91
+ <key>NSKern</key>
92
+ <real>0.0</real>
93
+ <key>Size</key>
94
+ <real>12</real>
95
+ </dict>
96
+ <key>ID</key>
97
+ <integer>12</integer>
98
+ <key>Shape</key>
99
+ <string>Rectangle</string>
100
+ <key>Style</key>
101
+ <dict>
102
+ <key>fill</key>
103
+ <dict>
104
+ <key>Draws</key>
105
+ <string>NO</string>
106
+ <key>GradientColor</key>
107
+ <dict>
108
+ <key>w</key>
109
+ <string>1</string>
110
+ </dict>
111
+ <key>MiddleFraction</key>
112
+ <real>0.13492070138454437</real>
113
+ </dict>
114
+ <key>stroke</key>
115
+ <dict>
116
+ <key>Cap</key>
117
+ <integer>0</integer>
118
+ <key>Color</key>
119
+ <dict>
120
+ <key>b</key>
121
+ <string>0.494118</string>
122
+ <key>g</key>
123
+ <string>0.494118</string>
124
+ <key>r</key>
125
+ <string>0.494118</string>
126
+ </dict>
127
+ <key>Join</key>
128
+ <integer>0</integer>
129
+ </dict>
130
+ </dict>
131
+ <key>Text</key>
132
+ <dict>
133
+ <key>Align</key>
134
+ <integer>0</integer>
135
+ <key>VerticalPad</key>
136
+ <integer>0</integer>
137
+ </dict>
138
+ </dict>
139
+ <dict>
140
+ <key>Bounds</key>
141
+ <string>{{13, 25}, {498, 50}}</string>
142
+ <key>Class</key>
143
+ <string>ShapedGraphic</string>
144
+ <key>ID</key>
145
+ <integer>10</integer>
146
+ <key>ImageID</key>
147
+ <integer>1</integer>
148
+ <key>Shape</key>
149
+ <string>Rectangle</string>
150
+ <key>Style</key>
151
+ <dict>
152
+ <key>fill</key>
153
+ <dict>
154
+ <key>Draws</key>
155
+ <string>NO</string>
156
+ </dict>
157
+ <key>stroke</key>
158
+ <dict>
159
+ <key>Draws</key>
160
+ <string>NO</string>
161
+ </dict>
162
+ </dict>
163
+ </dict>
164
+ <dict>
165
+ <key>Class</key>
166
+ <string>LineGraphic</string>
167
+ <key>FontInfo</key>
168
+ <dict>
169
+ <key>Font</key>
170
+ <string>Helvetica</string>
171
+ <key>Size</key>
172
+ <real>12</real>
173
+ </dict>
174
+ <key>Head</key>
175
+ <dict>
176
+ <key>ID</key>
177
+ <integer>3</integer>
178
+ </dict>
179
+ <key>ID</key>
180
+ <integer>9</integer>
181
+ <key>Points</key>
182
+ <array>
183
+ <string>{360.316, 183.523}</string>
184
+ <string>{342.116, 151.865}</string>
185
+ </array>
186
+ <key>Style</key>
187
+ <dict>
188
+ <key>shadow</key>
189
+ <dict>
190
+ <key>Draws</key>
191
+ <string>YES</string>
192
+ </dict>
193
+ <key>stroke</key>
194
+ <dict>
195
+ <key>HeadArrow</key>
196
+ <string>FilledArrow</string>
197
+ <key>LineType</key>
198
+ <integer>1</integer>
199
+ <key>TailArrow</key>
200
+ <string>0</string>
201
+ </dict>
202
+ </dict>
203
+ <key>Tail</key>
204
+ <dict>
205
+ <key>ID</key>
206
+ <integer>4</integer>
207
+ </dict>
208
+ </dict>
209
+ <dict>
210
+ <key>Class</key>
211
+ <string>LineGraphic</string>
212
+ <key>FontInfo</key>
213
+ <dict>
214
+ <key>Font</key>
215
+ <string>Helvetica</string>
216
+ <key>Size</key>
217
+ <real>12</real>
218
+ </dict>
219
+ <key>Head</key>
220
+ <dict>
221
+ <key>ID</key>
222
+ <integer>3</integer>
223
+ </dict>
224
+ <key>ID</key>
225
+ <integer>8</integer>
226
+ <key>Points</key>
227
+ <array>
228
+ <string>{230.557, 150.304}</string>
229
+ <string>{287.04, 137.081}</string>
230
+ </array>
231
+ <key>Style</key>
232
+ <dict>
233
+ <key>shadow</key>
234
+ <dict>
235
+ <key>Draws</key>
236
+ <string>YES</string>
237
+ </dict>
238
+ <key>stroke</key>
239
+ <dict>
240
+ <key>HeadArrow</key>
241
+ <string>FilledArrow</string>
242
+ <key>LineType</key>
243
+ <integer>1</integer>
244
+ <key>TailArrow</key>
245
+ <string>0</string>
246
+ </dict>
247
+ </dict>
248
+ <key>Tail</key>
249
+ <dict>
250
+ <key>ID</key>
251
+ <integer>5</integer>
252
+ </dict>
253
+ </dict>
254
+ <dict>
255
+ <key>Bounds</key>
256
+ <string>{{149, 214}, {88, 79}}</string>
257
+ <key>Class</key>
258
+ <string>ShapedGraphic</string>
259
+ <key>FontInfo</key>
260
+ <dict>
261
+ <key>Color</key>
262
+ <dict>
263
+ <key>w</key>
264
+ <string>0</string>
265
+ </dict>
266
+ <key>Font</key>
267
+ <string>HelveticaNeue</string>
268
+ <key>NSKern</key>
269
+ <real>0.0</real>
270
+ <key>Size</key>
271
+ <real>12</real>
272
+ </dict>
273
+ <key>ID</key>
274
+ <integer>7</integer>
275
+ <key>Shape</key>
276
+ <string>Circle</string>
277
+ <key>Style</key>
278
+ <dict>
279
+ <key>fill</key>
280
+ <dict>
281
+ <key>GradientColor</key>
282
+ <dict>
283
+ <key>w</key>
284
+ <string>1</string>
285
+ </dict>
286
+ <key>MiddleFraction</key>
287
+ <real>0.13492070138454437</real>
288
+ </dict>
289
+ <key>stroke</key>
290
+ <dict>
291
+ <key>Cap</key>
292
+ <integer>0</integer>
293
+ <key>Color</key>
294
+ <dict>
295
+ <key>b</key>
296
+ <string>0.494118</string>
297
+ <key>g</key>
298
+ <string>0.494118</string>
299
+ <key>r</key>
300
+ <string>0.494118</string>
301
+ </dict>
302
+ <key>Join</key>
303
+ <integer>0</integer>
304
+ <key>Width</key>
305
+ <real>2</real>
306
+ </dict>
307
+ </dict>
308
+ <key>Text</key>
309
+ <dict>
310
+ <key>Text</key>
311
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf290
312
+ {\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
313
+ {\colortbl;\red255\green255\blue255;}
314
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
315
+
316
+ \f0\fs24 \cf0 Engine}</string>
317
+ <key>VerticalPad</key>
318
+ <integer>0</integer>
319
+ </dict>
320
+ </dict>
321
+ <dict>
322
+ <key>Bounds</key>
323
+ <string>{{100, 174}, {88, 79}}</string>
324
+ <key>Class</key>
325
+ <string>ShapedGraphic</string>
326
+ <key>FontInfo</key>
327
+ <dict>
328
+ <key>Color</key>
329
+ <dict>
330
+ <key>w</key>
331
+ <string>0</string>
332
+ </dict>
333
+ <key>Font</key>
334
+ <string>HelveticaNeue</string>
335
+ <key>NSKern</key>
336
+ <real>0.0</real>
337
+ <key>Size</key>
338
+ <real>12</real>
339
+ </dict>
340
+ <key>ID</key>
341
+ <integer>6</integer>
342
+ <key>Shape</key>
343
+ <string>Circle</string>
344
+ <key>Style</key>
345
+ <dict>
346
+ <key>fill</key>
347
+ <dict>
348
+ <key>GradientColor</key>
349
+ <dict>
350
+ <key>w</key>
351
+ <string>1</string>
352
+ </dict>
353
+ <key>MiddleFraction</key>
354
+ <real>0.13492070138454437</real>
355
+ </dict>
356
+ <key>stroke</key>
357
+ <dict>
358
+ <key>Cap</key>
359
+ <integer>0</integer>
360
+ <key>Color</key>
361
+ <dict>
362
+ <key>b</key>
363
+ <string>0.494118</string>
364
+ <key>g</key>
365
+ <string>0.494118</string>
366
+ <key>r</key>
367
+ <string>0.494118</string>
368
+ </dict>
369
+ <key>Join</key>
370
+ <integer>0</integer>
371
+ <key>Width</key>
372
+ <real>2</real>
373
+ </dict>
374
+ </dict>
375
+ <key>Text</key>
376
+ <dict>
377
+ <key>Text</key>
378
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf290
379
+ {\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
380
+ {\colortbl;\red255\green255\blue255;}
381
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
382
+
383
+ \f0\fs24 \cf0 Worker}</string>
384
+ <key>VerticalPad</key>
385
+ <integer>0</integer>
386
+ </dict>
387
+ </dict>
388
+ <dict>
389
+ <key>Bounds</key>
390
+ <string>{{143, 121}, {88, 79}}</string>
391
+ <key>Class</key>
392
+ <string>ShapedGraphic</string>
393
+ <key>FontInfo</key>
394
+ <dict>
395
+ <key>Color</key>
396
+ <dict>
397
+ <key>w</key>
398
+ <string>0</string>
399
+ </dict>
400
+ <key>Font</key>
401
+ <string>HelveticaNeue</string>
402
+ <key>NSKern</key>
403
+ <real>0.0</real>
404
+ <key>Size</key>
405
+ <real>12</real>
406
+ </dict>
407
+ <key>ID</key>
408
+ <integer>5</integer>
409
+ <key>Shape</key>
410
+ <string>Circle</string>
411
+ <key>Style</key>
412
+ <dict>
413
+ <key>fill</key>
414
+ <dict>
415
+ <key>GradientColor</key>
416
+ <dict>
417
+ <key>w</key>
418
+ <string>1</string>
419
+ </dict>
420
+ <key>MiddleFraction</key>
421
+ <real>0.13492070138454437</real>
422
+ </dict>
423
+ <key>stroke</key>
424
+ <dict>
425
+ <key>Cap</key>
426
+ <integer>0</integer>
427
+ <key>Color</key>
428
+ <dict>
429
+ <key>b</key>
430
+ <string>0.494118</string>
431
+ <key>g</key>
432
+ <string>0.494118</string>
433
+ <key>r</key>
434
+ <string>0.494118</string>
435
+ </dict>
436
+ <key>Join</key>
437
+ <integer>0</integer>
438
+ <key>Width</key>
439
+ <real>2</real>
440
+ </dict>
441
+ </dict>
442
+ <key>Text</key>
443
+ <dict>
444
+ <key>Text</key>
445
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf290
446
+ {\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
447
+ {\colortbl;\red255\green255\blue255;}
448
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
449
+
450
+ \f0\fs24 \cf0 BsStorage}</string>
451
+ <key>VerticalPad</key>
452
+ <integer>0</integer>
453
+ </dict>
454
+ </dict>
455
+ <dict>
456
+ <key>Bounds</key>
457
+ <string>{{337, 180}, {88, 79}}</string>
458
+ <key>Class</key>
459
+ <string>ShapedGraphic</string>
460
+ <key>FontInfo</key>
461
+ <dict>
462
+ <key>Color</key>
463
+ <dict>
464
+ <key>w</key>
465
+ <string>0</string>
466
+ </dict>
467
+ <key>Font</key>
468
+ <string>HelveticaNeue</string>
469
+ <key>NSKern</key>
470
+ <real>0.0</real>
471
+ <key>Size</key>
472
+ <real>12</real>
473
+ </dict>
474
+ <key>ID</key>
475
+ <integer>4</integer>
476
+ <key>Shape</key>
477
+ <string>Circle</string>
478
+ <key>Style</key>
479
+ <dict>
480
+ <key>fill</key>
481
+ <dict>
482
+ <key>GradientColor</key>
483
+ <dict>
484
+ <key>w</key>
485
+ <string>1</string>
486
+ </dict>
487
+ <key>MiddleFraction</key>
488
+ <real>0.13492070138454437</real>
489
+ </dict>
490
+ <key>stroke</key>
491
+ <dict>
492
+ <key>Cap</key>
493
+ <integer>0</integer>
494
+ <key>Color</key>
495
+ <dict>
496
+ <key>b</key>
497
+ <string>0.494118</string>
498
+ <key>g</key>
499
+ <string>0.494118</string>
500
+ <key>r</key>
501
+ <string>0.494118</string>
502
+ </dict>
503
+ <key>Join</key>
504
+ <integer>0</integer>
505
+ <key>Width</key>
506
+ <real>2</real>
507
+ </dict>
508
+ </dict>
509
+ <key>Text</key>
510
+ <dict>
511
+ <key>Text</key>
512
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf290
513
+ {\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
514
+ {\colortbl;\red255\green255\blue255;}
515
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
516
+
517
+ \f0\fs24 \cf0 BsStorage}</string>
518
+ <key>VerticalPad</key>
519
+ <integer>0</integer>
520
+ </dict>
521
+ </dict>
522
+ <dict>
523
+ <key>Bounds</key>
524
+ <string>{{287, 104}, {82, 47}}</string>
525
+ <key>Class</key>
526
+ <string>ShapedGraphic</string>
527
+ <key>FontInfo</key>
528
+ <dict>
529
+ <key>Color</key>
530
+ <dict>
531
+ <key>w</key>
532
+ <string>0</string>
533
+ </dict>
534
+ <key>Font</key>
535
+ <string>HelveticaNeue</string>
536
+ <key>NSKern</key>
537
+ <real>0.0</real>
538
+ <key>Size</key>
539
+ <real>12</real>
540
+ </dict>
541
+ <key>ID</key>
542
+ <integer>3</integer>
543
+ <key>Shape</key>
544
+ <string>RoundRect</string>
545
+ <key>Style</key>
546
+ <dict>
547
+ <key>fill</key>
548
+ <dict>
549
+ <key>GradientColor</key>
550
+ <dict>
551
+ <key>w</key>
552
+ <string>1</string>
553
+ </dict>
554
+ <key>MiddleFraction</key>
555
+ <real>0.13492070138454437</real>
556
+ </dict>
557
+ <key>stroke</key>
558
+ <dict>
559
+ <key>Cap</key>
560
+ <integer>0</integer>
561
+ <key>Color</key>
562
+ <dict>
563
+ <key>b</key>
564
+ <string>0.494118</string>
565
+ <key>g</key>
566
+ <string>0.494118</string>
567
+ <key>r</key>
568
+ <string>0.494118</string>
569
+ </dict>
570
+ <key>Join</key>
571
+ <integer>0</integer>
572
+ <key>Width</key>
573
+ <real>2</real>
574
+ </dict>
575
+ </dict>
576
+ <key>Text</key>
577
+ <dict>
578
+ <key>Text</key>
579
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf290
580
+ {\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
581
+ {\colortbl;\red255\green255\blue255;}
582
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
583
+
584
+ \f0\fs24 \cf0 beanstalk}</string>
585
+ <key>VerticalPad</key>
586
+ <integer>0</integer>
587
+ </dict>
588
+ </dict>
589
+ <dict>
590
+ <key>Bounds</key>
591
+ <string>{{293, 71}, {149, 218}}</string>
592
+ <key>Class</key>
593
+ <string>ShapedGraphic</string>
594
+ <key>FontInfo</key>
595
+ <dict>
596
+ <key>Color</key>
597
+ <dict>
598
+ <key>w</key>
599
+ <string>0</string>
600
+ </dict>
601
+ <key>Font</key>
602
+ <string>HelveticaNeue</string>
603
+ <key>NSKern</key>
604
+ <real>0.0</real>
605
+ <key>Size</key>
606
+ <real>12</real>
607
+ </dict>
608
+ <key>ID</key>
609
+ <integer>11</integer>
610
+ <key>Shape</key>
611
+ <string>Rectangle</string>
612
+ <key>Style</key>
613
+ <dict>
614
+ <key>fill</key>
615
+ <dict>
616
+ <key>Draws</key>
617
+ <string>NO</string>
618
+ <key>GradientColor</key>
619
+ <dict>
620
+ <key>w</key>
621
+ <string>1</string>
622
+ </dict>
623
+ <key>MiddleFraction</key>
624
+ <real>0.13492070138454437</real>
625
+ </dict>
626
+ <key>stroke</key>
627
+ <dict>
628
+ <key>Cap</key>
629
+ <integer>0</integer>
630
+ <key>Color</key>
631
+ <dict>
632
+ <key>b</key>
633
+ <string>0.494118</string>
634
+ <key>g</key>
635
+ <string>0.494118</string>
636
+ <key>r</key>
637
+ <string>0.494118</string>
638
+ </dict>
639
+ <key>Join</key>
640
+ <integer>0</integer>
641
+ </dict>
642
+ </dict>
643
+ <key>Text</key>
644
+ <dict>
645
+ <key>Align</key>
646
+ <integer>0</integer>
647
+ <key>VerticalPad</key>
648
+ <integer>0</integer>
649
+ </dict>
650
+ </dict>
651
+ </array>
652
+ <key>GridInfo</key>
653
+ <dict/>
654
+ <key>GuidesLocked</key>
655
+ <string>NO</string>
656
+ <key>GuidesVisible</key>
657
+ <string>YES</string>
658
+ <key>HPages</key>
659
+ <integer>2</integer>
660
+ <key>ImageCounter</key>
661
+ <integer>3</integer>
662
+ <key>ImageLinkBack</key>
663
+ <array>
664
+ <dict/>
665
+ <dict/>
666
+ </array>
667
+ <key>ImageList</key>
668
+ <array>
669
+ <string>image2.png</string>
670
+ <string>image1.png</string>
671
+ </array>
672
+ <key>KeepToScale</key>
673
+ <false/>
674
+ <key>Layers</key>
675
+ <array>
676
+ <dict>
677
+ <key>Lock</key>
678
+ <string>NO</string>
679
+ <key>Name</key>
680
+ <string>Layer 1</string>
681
+ <key>Print</key>
682
+ <string>YES</string>
683
+ <key>View</key>
684
+ <string>YES</string>
685
+ </dict>
686
+ </array>
687
+ <key>LayoutInfo</key>
688
+ <dict>
689
+ <key>Animate</key>
690
+ <string>NO</string>
691
+ <key>circoMinDist</key>
692
+ <real>18</real>
693
+ <key>circoSeparation</key>
694
+ <real>0.0</real>
695
+ <key>layoutEngine</key>
696
+ <string>dot</string>
697
+ <key>neatoSeparation</key>
698
+ <real>0.0</real>
699
+ <key>twopiSeparation</key>
700
+ <real>0.0</real>
701
+ </dict>
702
+ <key>LinksVisible</key>
703
+ <string>NO</string>
704
+ <key>MagnetsVisible</key>
705
+ <string>NO</string>
706
+ <key>MasterSheets</key>
707
+ <array/>
708
+ <key>ModificationDate</key>
709
+ <string>2010-06-14 14:38:47 +0900</string>
710
+ <key>Modifier</key>
711
+ <string>John Mettraux</string>
712
+ <key>NotesVisible</key>
713
+ <string>NO</string>
714
+ <key>Orientation</key>
715
+ <integer>2</integer>
716
+ <key>OriginVisible</key>
717
+ <string>NO</string>
718
+ <key>PageBreaks</key>
719
+ <string>YES</string>
720
+ <key>PrintInfo</key>
721
+ <dict>
722
+ <key>NSBottomMargin</key>
723
+ <array>
724
+ <string>float</string>
725
+ <string>41</string>
726
+ </array>
727
+ <key>NSLeftMargin</key>
728
+ <array>
729
+ <string>float</string>
730
+ <string>18</string>
731
+ </array>
732
+ <key>NSPaperSize</key>
733
+ <array>
734
+ <string>size</string>
735
+ <string>{595, 842}</string>
736
+ </array>
737
+ <key>NSRightMargin</key>
738
+ <array>
739
+ <string>float</string>
740
+ <string>18</string>
741
+ </array>
742
+ <key>NSTopMargin</key>
743
+ <array>
744
+ <string>float</string>
745
+ <string>18</string>
746
+ </array>
747
+ </dict>
748
+ <key>PrintOnePage</key>
749
+ <false/>
750
+ <key>ReadOnly</key>
751
+ <string>NO</string>
752
+ <key>RowAlign</key>
753
+ <integer>1</integer>
754
+ <key>RowSpacing</key>
755
+ <real>36</real>
756
+ <key>SheetTitle</key>
757
+ <string>Canvas 1</string>
758
+ <key>SmartAlignmentGuidesActive</key>
759
+ <string>YES</string>
760
+ <key>SmartDistanceGuidesActive</key>
761
+ <string>YES</string>
762
+ <key>UniqueID</key>
763
+ <integer>1</integer>
764
+ <key>UseEntirePage</key>
765
+ <false/>
766
+ <key>VPages</key>
767
+ <integer>1</integer>
768
+ <key>WindowInfo</key>
769
+ <dict>
770
+ <key>CurrentSheet</key>
771
+ <integer>0</integer>
772
+ <key>ExpandedCanvases</key>
773
+ <array>
774
+ <dict>
775
+ <key>name</key>
776
+ <string>Canvas 1</string>
777
+ </dict>
778
+ </array>
779
+ <key>Frame</key>
780
+ <string>{{633, 88}, {1140, 1070}}</string>
781
+ <key>ListView</key>
782
+ <true/>
783
+ <key>OutlineWidth</key>
784
+ <integer>142</integer>
785
+ <key>RightSidebar</key>
786
+ <false/>
787
+ <key>ShowRuler</key>
788
+ <true/>
789
+ <key>Sidebar</key>
790
+ <true/>
791
+ <key>SidebarWidth</key>
792
+ <integer>120</integer>
793
+ <key>VisibleRegion</key>
794
+ <string>{{0, -59}, {1005, 901}}</string>
795
+ <key>Zoom</key>
796
+ <real>1</real>
797
+ <key>ZoomValues</key>
798
+ <array>
799
+ <array>
800
+ <string>Canvas 1</string>
801
+ <real>1</real>
802
+ <real>1</real>
803
+ </array>
804
+ </array>
805
+ </dict>
806
+ <key>saveQuickLookFiles</key>
807
+ <string>YES</string>
808
+ </dict>
809
+ </plist>