ruote-beanstalk 2.1.10

Sign up to get free protection for your applications and to get access to all the features.
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>