summaryrefslogtreecommitdiff
path: root/plac/doc/plac.pdf
diff options
context:
space:
mode:
Diffstat (limited to 'plac/doc/plac.pdf')
-rw-r--r--plac/doc/plac.pdf4142
1 files changed, 2138 insertions, 2004 deletions
diff --git a/plac/doc/plac.pdf b/plac/doc/plac.pdf
index 86a9e54..527b867 100644
--- a/plac/doc/plac.pdf
+++ b/plac/doc/plac.pdf
@@ -86,12 +86,12 @@ endobj
<< /Annots [ 4 0 R
5 0 R
6 0 R ]
- /Contents 347 0 R
+ /Contents 351 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -540,7 +540,7 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 211 0 R
+ /Dest [ 214 0 R
/XYZ
62.69291
705.0236
@@ -558,7 +558,7 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 211 0 R
+ /Dest [ 214 0 R
/XYZ
62.69291
705.0236
@@ -576,10 +576,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 211 0 R
+ /Dest [ 214 0 R
/XYZ
62.69291
- 435.0236
+ 411.0236
0 ]
/Rect [ 82.69291
489.7736
@@ -594,10 +594,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 211 0 R
+ /Dest [ 214 0 R
/XYZ
62.69291
- 435.0236
+ 411.0236
0 ]
/Rect [ 521.4627
489.7736
@@ -612,10 +612,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 211 0 R
+ /Dest [ 214 0 R
/XYZ
62.69291
- 231.0236
+ 207.0236
0 ]
/Rect [ 82.69291
471.7736
@@ -630,10 +630,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 211 0 R
+ /Dest [ 214 0 R
/XYZ
62.69291
- 231.0236
+ 207.0236
0 ]
/Rect [ 521.4627
471.7736
@@ -648,10 +648,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 228 0 R
+ /Dest [ 231 0 R
/XYZ
62.69291
- 597.0236
+ 585.0236
0 ]
/Rect [ 62.69291
453.7736
@@ -666,10 +666,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 228 0 R
+ /Dest [ 231 0 R
/XYZ
62.69291
- 597.0236
+ 585.0236
0 ]
/Rect [ 521.4627
453.7736
@@ -684,10 +684,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 228 0 R
+ /Dest [ 231 0 R
/XYZ
62.69291
- 564.0236
+ 552.0236
0 ]
/Rect [ 82.69291
435.7736
@@ -702,10 +702,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 228 0 R
+ /Dest [ 231 0 R
/XYZ
62.69291
- 564.0236
+ 552.0236
0 ]
/Rect [ 521.4627
435.7736
@@ -720,10 +720,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 228 0 R
+ /Dest [ 231 0 R
/XYZ
62.69291
- 342.0236
+ 330.0236
0 ]
/Rect [ 82.69291
417.7736
@@ -738,10 +738,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 228 0 R
+ /Dest [ 231 0 R
/XYZ
62.69291
- 342.0236
+ 330.0236
0 ]
/Rect [ 521.4627
417.7736
@@ -756,10 +756,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 231 0 R
+ /Dest [ 234 0 R
/XYZ
62.69291
- 545.8236
+ 533.8236
0 ]
/Rect [ 82.69291
399.7736
@@ -774,10 +774,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 231 0 R
+ /Dest [ 234 0 R
/XYZ
62.69291
- 545.8236
+ 533.8236
0 ]
/Rect [ 521.4627
399.7736
@@ -792,10 +792,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 234 0 R
+ /Dest [ 237 0 R
/XYZ
62.69291
- 509.8236
+ 497.8236
0 ]
/Rect [ 82.69291
381.7736
@@ -810,10 +810,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 234 0 R
+ /Dest [ 237 0 R
/XYZ
62.69291
- 509.8236
+ 497.8236
0 ]
/Rect [ 521.4627
381.7736
@@ -828,10 +828,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 245 0 R
+ /Dest [ 247 0 R
/XYZ
62.69291
- 215.8485
+ 171.0642
0 ]
/Rect [ 82.69291
363.7736
@@ -846,10 +846,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 245 0 R
+ /Dest [ 247 0 R
/XYZ
62.69291
- 215.8485
+ 171.0642
0 ]
/Rect [ 521.4627
363.7736
@@ -864,10 +864,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 250 0 R
+ /Dest [ 253 0 R
/XYZ
62.69291
- 322.6236
+ 256.6236
0 ]
/Rect [ 82.69291
345.7736
@@ -882,10 +882,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 250 0 R
+ /Dest [ 253 0 R
/XYZ
62.69291
- 322.6236
+ 256.6236
0 ]
/Rect [ 521.4627
345.7736
@@ -900,10 +900,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 255 0 R
+ /Dest [ 260 0 R
/XYZ
62.69291
- 310.0679
+ 765.0236
0 ]
/Rect [ 82.69291
327.7736
@@ -918,10 +918,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 255 0 R
+ /Dest [ 260 0 R
/XYZ
62.69291
- 310.0679
+ 765.0236
0 ]
/Rect [ 521.4627
327.7736
@@ -936,10 +936,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 258 0 R
+ /Dest [ 262 0 R
/XYZ
62.69291
- 681.0236
+ 468.6236
0 ]
/Rect [ 82.69291
309.7736
@@ -954,10 +954,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 258 0 R
+ /Dest [ 262 0 R
/XYZ
62.69291
- 681.0236
+ 468.6236
0 ]
/Rect [ 521.4627
309.7736
@@ -972,10 +972,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 275 0 R
+ /Dest [ 279 0 R
/XYZ
62.69291
- 765.0236
+ 566.6236
0 ]
/Rect [ 82.69291
291.7736
@@ -990,10 +990,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 275 0 R
+ /Dest [ 279 0 R
/XYZ
62.69291
- 765.0236
+ 566.6236
0 ]
/Rect [ 521.4627
291.7736
@@ -1008,10 +1008,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 278 0 R
+ /Dest [ 283 0 R
/XYZ
62.69291
- 242.2236
+ 729.0236
0 ]
/Rect [ 82.69291
273.7736
@@ -1026,10 +1026,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 278 0 R
+ /Dest [ 283 0 R
/XYZ
62.69291
- 242.2236
+ 729.0236
0 ]
/Rect [ 521.4627
273.7736
@@ -1044,10 +1044,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 281 0 R
+ /Dest [ 286 0 R
/XYZ
62.69291
- 229.4236
+ 729.0236
0 ]
/Rect [ 82.69291
255.7736
@@ -1062,10 +1062,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 281 0 R
+ /Dest [ 286 0 R
/XYZ
62.69291
- 229.4236
+ 729.0236
0 ]
/Rect [ 521.4627
255.7736
@@ -1080,10 +1080,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 287 0 R
+ /Dest [ 290 0 R
/XYZ
62.69291
- 729.0236
+ 555.8236
0 ]
/Rect [ 82.69291
237.7736
@@ -1098,10 +1098,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 287 0 R
+ /Dest [ 290 0 R
/XYZ
62.69291
- 729.0236
+ 555.8236
0 ]
/Rect [ 521.4627
237.7736
@@ -1116,10 +1116,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 287 0 R
+ /Dest [ 293 0 R
/XYZ
62.69291
- 178.6236
+ 659.8236
0 ]
/Rect [ 82.69291
219.7736
@@ -1134,10 +1134,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 287 0 R
+ /Dest [ 293 0 R
/XYZ
62.69291
- 178.6236
+ 659.8236
0 ]
/Rect [ 521.4627
219.7736
@@ -1152,10 +1152,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 292 0 R
+ /Dest [ 298 0 R
/XYZ
62.69291
- 290.6236
+ 765.0236
0 ]
/Rect [ 82.69291
201.7736
@@ -1170,10 +1170,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 292 0 R
+ /Dest [ 298 0 R
/XYZ
62.69291
- 290.6236
+ 765.0236
0 ]
/Rect [ 521.4627
201.7736
@@ -1188,10 +1188,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 294 0 R
+ /Dest [ 298 0 R
/XYZ
62.69291
- 479.8236
+ 297.8236
0 ]
/Rect [ 82.69291
183.7736
@@ -1206,10 +1206,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 294 0 R
+ /Dest [ 298 0 R
/XYZ
62.69291
- 479.8236
+ 297.8236
0 ]
/Rect [ 521.4627
183.7736
@@ -1224,10 +1224,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 297 0 R
+ /Dest [ 300 0 R
/XYZ
62.69291
- 607.8236
+ 427.8236
0 ]
/Rect [ 82.69291
165.7736
@@ -1242,10 +1242,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 297 0 R
+ /Dest [ 300 0 R
/XYZ
62.69291
- 607.8236
+ 427.8236
0 ]
/Rect [ 521.4627
165.7736
@@ -1260,10 +1260,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 297 0 R
+ /Dest [ 302 0 R
/XYZ
62.69291
- 242.6236
+ 717.0236
0 ]
/Rect [ 82.69291
147.7736
@@ -1278,10 +1278,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 297 0 R
+ /Dest [ 302 0 R
/XYZ
62.69291
- 242.6236
+ 717.0236
0 ]
/Rect [ 521.4627
147.7736
@@ -1296,10 +1296,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 303 0 R
+ /Dest [ 306 0 R
/XYZ
62.69291
- 765.0236
+ 553.2159
0 ]
/Rect [ 82.69291
129.7736
@@ -1314,10 +1314,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 303 0 R
+ /Dest [ 306 0 R
/XYZ
62.69291
- 765.0236
+ 553.2159
0 ]
/Rect [ 521.4627
129.7736
@@ -1332,10 +1332,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 303 0 R
+ /Dest [ 309 0 R
/XYZ
62.69291
- 294.6236
+ 765.0236
0 ]
/Rect [ 82.69291
111.7736
@@ -1350,10 +1350,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 303 0 R
+ /Dest [ 309 0 R
/XYZ
62.69291
- 294.6236
+ 765.0236
0 ]
/Rect [ 521.4627
111.7736
@@ -1368,10 +1368,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 305 0 R
+ /Dest [ 309 0 R
/XYZ
62.69291
- 652.6772
+ 454.6772
0 ]
/Rect [ 82.69291
93.77362
@@ -1386,10 +1386,10 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 305 0 R
+ /Dest [ 309 0 R
/XYZ
62.69291
- 652.6772
+ 454.6772
0 ]
/Rect [ 521.4627
93.77362
@@ -1473,12 +1473,12 @@ endobj
78 0 R
79 0 R
80 0 R ]
- /Contents 348 0 R
+ /Contents 352 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1725,12 +1725,12 @@ endobj
93 0 R
94 0 R
95 0 R ]
- /Contents 349 0 R
+ /Contents 353 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1888,12 +1888,12 @@ endobj
104 0 R
105 0 R
106 0 R ]
- /Contents 350 0 R
+ /Contents 354 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1971,12 +1971,12 @@ endobj
109 0 R
110 0 R
111 0 R ]
- /Contents 351 0 R
+ /Contents 355 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2038,12 +2038,12 @@ endobj
<< /Annots [ 113 0 R
114 0 R
115 0 R ]
- /Contents 352 0 R
+ /Contents 356 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2137,12 +2137,12 @@ endobj
119 0 R
120 0 R
121 0 R ]
- /Contents 353 0 R
+ /Contents 357 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2156,12 +2156,12 @@ endobj
% 'Page8': class PDFPage
123 0 obj
% Page dictionary
-<< /Contents 354 0 R
+<< /Contents 358 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2207,12 +2207,12 @@ endobj
% Page dictionary
<< /Annots [ 124 0 R
125 0 R ]
- /Contents 355 0 R
+ /Contents 359 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2338,12 +2338,12 @@ endobj
131 0 R
132 0 R
133 0 R ]
- /Contents 356 0 R
+ /Contents 360 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2357,12 +2357,12 @@ endobj
% 'Page11': class PDFPage
135 0 obj
% Page dictionary
-<< /Contents 357 0 R
+<< /Contents 361 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2424,12 +2424,12 @@ endobj
<< /Annots [ 136 0 R
137 0 R
138 0 R ]
- /Contents 358 0 R
+ /Contents 362 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2475,12 +2475,12 @@ endobj
% Page dictionary
<< /Annots [ 140 0 R
141 0 R ]
- /Contents 359 0 R
+ /Contents 363 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2510,12 +2510,12 @@ endobj
144 0 obj
% Page dictionary
<< /Annots [ 143 0 R ]
- /Contents 360 0 R
+ /Contents 364 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2561,12 +2561,12 @@ endobj
% Page dictionary
<< /Annots [ 145 0 R
146 0 R ]
- /Contents 361 0 R
+ /Contents 365 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2756,12 +2756,12 @@ endobj
156 0 R
157 0 R
158 0 R ]
- /Contents 362 0 R
+ /Contents 366 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2999,12 +2999,12 @@ endobj
171 0 R
172 0 R
173 0 R ]
- /Contents 363 0 R
+ /Contents 367 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -3308,9 +3308,9 @@ endobj
/Border [ 0
0
0 ]
- /Rect [ 274.4129
+ /Rect [ 276.5607
447.7736
- 295.5329
+ 297.9876
459.7736 ]
/Subtype /Link
/Type /Annot >>
@@ -3323,9 +3323,9 @@ endobj
/Border [ 0
0
0 ]
- /Rect [ 423.3729
+ /Rect [ 427.9754
447.7736
- 465.6129
+ 470.5222
459.7736 ]
/Subtype /Link
/Type /Annot >>
@@ -3334,19 +3334,64 @@ endobj
196 0 obj
<< /A << /S /URI
/Type /Action
+ /URI (http://packages.python.org/argh) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 497.8158
+ 447.7736
+ 522.0227
+ 459.7736 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER175': class PDFDictionary
+197 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://argparse.googlecode.com) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 357.7489
+ 435.7736
+ 397.2089
+ 447.7736 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER176': class PDFDictionary
+198 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 462.971
+ 435.7736
+ 484.6916
+ 447.7736 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER177': class PDFDictionary
+199 0 obj
+<< /A << /S /URI
+ /Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
/Border [ 0
0
0 ]
/Rect [ 156.6051
- 399.7736
+ 375.7736
177.8606
- 411.7736 ]
+ 387.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER175': class PDFDictionary
-197 0 obj
+% 'Annot.NUMBER178': class PDFDictionary
+200 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -3354,14 +3399,14 @@ endobj
0
0 ]
/Rect [ 186.6535
- 375.7736
+ 351.7736
226.1135
- 387.7736 ]
+ 363.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER176': class PDFDictionary
-198 0 obj
+% 'Annot.NUMBER179': class PDFDictionary
+201 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -3369,14 +3414,14 @@ endobj
0
0 ]
/Rect [ 493.1227
- 375.7736
+ 351.7736
532.4646
- 387.7736 ]
+ 363.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER177': class PDFDictionary
-199 0 obj
+% 'Annot.NUMBER180': class PDFDictionary
+202 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3384,14 +3429,14 @@ endobj
0
0 ]
/Rect [ 72.7804
- 363.7736
+ 339.7736
96.20788
- 375.7736 ]
+ 351.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER178': class PDFDictionary
-200 0 obj
+% 'Annot.NUMBER181': class PDFDictionary
+203 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3399,14 +3444,14 @@ endobj
0
0 ]
/Rect [ 149.2229
- 333.7736
+ 309.7736
171.2704
- 345.7736 ]
+ 321.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER179': class PDFDictionary
-201 0 obj
+% 'Annot.NUMBER182': class PDFDictionary
+204 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3414,14 +3459,14 @@ endobj
0
0 ]
/Rect [ 128.0309
- 291.7736
+ 267.7736
149.4369
- 303.7736 ]
+ 279.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER180': class PDFDictionary
-202 0 obj
+% 'Annot.NUMBER183': class PDFDictionary
+205 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3429,14 +3474,14 @@ endobj
0
0 ]
/Rect [ 502.8367
- 291.7736
+ 267.7736
524.2427
- 303.7736 ]
+ 279.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER181': class PDFDictionary
-203 0 obj
+% 'Annot.NUMBER184': class PDFDictionary
+206 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3444,14 +3489,14 @@ endobj
0
0 ]
/Rect [ 187.4797
- 267.7736
+ 243.7736
209.0991
- 279.7736 ]
+ 255.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER182': class PDFDictionary
-204 0 obj
+% 'Annot.NUMBER185': class PDFDictionary
+207 0 obj
<< /A << /S /URI
/Type /Action
/URI (file:///home/micheles/Dropbox/md/gcodedev/plac/doc/in-writing) >>
@@ -3459,14 +3504,14 @@ endobj
0
0 ]
/Rect [ 301.6965
- 267.7736
+ 243.7736
426.0446
- 279.7736 ]
+ 255.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER183': class PDFDictionary
-205 0 obj
+% 'Annot.NUMBER186': class PDFDictionary
+208 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3474,14 +3519,14 @@ endobj
0
0 ]
/Rect [ 83.6829
- 195.7736
+ 171.7736
105.7829
- 207.7736 ]
+ 183.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER184': class PDFDictionary
-206 0 obj
+% 'Annot.NUMBER187': class PDFDictionary
+209 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://code.activestate.com/recipes/278844-parsing-the-command-line/) >>
@@ -3489,14 +3534,14 @@ endobj
0
0 ]
/Rect [ 446.5627
- 195.7736
+ 171.7736
502.5727
- 207.7736 ]
+ 183.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER185': class PDFDictionary
-207 0 obj
+% 'Annot.NUMBER188': class PDFDictionary
+210 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3504,14 +3549,14 @@ endobj
0
0 ]
/Rect [ 275.6828
- 183.7736
+ 159.7736
297.3688
- 195.7736 ]
+ 171.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER186': class PDFDictionary
-208 0 obj
+% 'Annot.NUMBER189': class PDFDictionary
+211 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/optparse.html?highlight=optionparser#optparse.OptionParser) >>
@@ -3519,14 +3564,14 @@ endobj
0
0 ]
/Rect [ 77.19665
- 171.7736
+ 147.7736
139.4904
- 183.7736 ]
+ 159.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER187': class PDFDictionary
-209 0 obj
+% 'Annot.NUMBER190': class PDFDictionary
+212 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -3534,14 +3579,14 @@ endobj
0
0 ]
/Rect [ 96.54131
- 159.7736
+ 135.7736
139.0255
- 171.7736 ]
+ 147.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER188': class PDFDictionary
-210 0 obj
+% 'Annot.NUMBER191': class PDFDictionary
+213 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -3549,14 +3594,14 @@ endobj
0
0 ]
/Rect [ 203.5016
- 126.7736
+ 102.7736
245.8453
- 138.7736 ]
+ 114.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page18': class PDFPage
-211 0 obj
+214 0 obj
% Page dictionary
<< /Annots [ 175 0 R
176 0 R
@@ -3593,13 +3638,16 @@ endobj
207 0 R
208 0 R
209 0 R
- 210 0 R ]
- /Contents 364 0 R
+ 210 0 R
+ 211 0 R
+ 212 0 R
+ 213 0 R ]
+ /Contents 368 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -3610,8 +3658,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER189': class PDFDictionary
-212 0 obj
+% 'Annot.NUMBER192': class PDFDictionary
+215 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com/svn/tags/r11/doc/ArgumentParser.html) >>
@@ -3625,8 +3673,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER190': class PDFDictionary
-213 0 obj
+% 'Annot.NUMBER193': class PDFDictionary
+216 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -3640,8 +3688,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER191': class PDFDictionary
-214 0 obj
+% 'Annot.NUMBER194': class PDFDictionary
+217 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -3655,8 +3703,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER192': class PDFDictionary
-215 0 obj
+% 'Annot.NUMBER195': class PDFDictionary
+218 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/Clap/0.7) >>
@@ -3670,23 +3718,23 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER193': class PDFDictionary
-216 0 obj
+% 'Annot.NUMBER196': class PDFDictionary
+219 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
/Border [ 0
0
0 ]
- /Rect [ 258.5629
+ /Rect [ 298.1928
609.7736
- 276.9029
+ 316.5328
621.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER194': class PDFDictionary
-217 0 obj
+% 'Annot.NUMBER197': class PDFDictionary
+220 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3694,14 +3742,14 @@ endobj
0
0 ]
/Rect [ 185.4471
- 528.7736
+ 516.7736
207.1062
- 540.7736 ]
+ 528.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER195': class PDFDictionary
-218 0 obj
+% 'Annot.NUMBER198': class PDFDictionary
+221 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3709,14 +3757,14 @@ endobj
0
0 ]
/Rect [ 177.6784
- 516.7736
+ 504.7736
199.6123
- 528.7736 ]
+ 516.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER196': class PDFDictionary
-219 0 obj
+% 'Annot.NUMBER199': class PDFDictionary
+222 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3724,14 +3772,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 462.7736
+ 450.7736
83.81291
- 474.7736 ]
+ 462.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER197': class PDFDictionary
-220 0 obj
+% 'Annot.NUMBER200': class PDFDictionary
+223 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3739,14 +3787,14 @@ endobj
0
0 ]
/Rect [ 278.4678
- 444.7736
+ 432.7736
300.0328
- 456.7736 ]
+ 444.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER198': class PDFDictionary
-221 0 obj
+% 'Annot.NUMBER201': class PDFDictionary
+224 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3754,14 +3802,14 @@ endobj
0
0 ]
/Rect [ 117.3573
- 432.7736
+ 420.7736
138.5845
- 444.7736 ]
+ 432.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER199': class PDFDictionary
-222 0 obj
+% 'Annot.NUMBER202': class PDFDictionary
+225 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://twill.idyll.org/) >>
@@ -3769,14 +3817,14 @@ endobj
0
0 ]
/Rect [ 82.74466
- 390.7736
+ 378.7736
104.4564
- 402.7736 ]
+ 390.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER200': class PDFDictionary
-223 0 obj
+% 'Annot.NUMBER203': class PDFDictionary
+226 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3784,14 +3832,14 @@ endobj
0
0 ]
/Rect [ 127.2882
- 390.7736
+ 378.7736
145.6282
- 402.7736 ]
+ 390.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER201': class PDFDictionary
-224 0 obj
+% 'Annot.NUMBER204': class PDFDictionary
+227 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3799,14 +3847,14 @@ endobj
0
0 ]
/Rect [ 410.1674
- 390.7736
+ 378.7736
433.5592
- 402.7736 ]
+ 390.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER202': class PDFDictionary
-225 0 obj
+% 'Annot.NUMBER205': class PDFDictionary
+228 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3814,14 +3862,14 @@ endobj
0
0 ]
/Rect [ 265.9578
- 366.7736
+ 354.7736
284.2978
- 378.7736 ]
+ 366.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER203': class PDFDictionary
-226 0 obj
+% 'Annot.NUMBER206': class PDFDictionary
+229 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3829,14 +3877,14 @@ endobj
0
0 ]
/Rect [ 487.7492
- 366.7736
+ 354.7736
506.0892
- 378.7736 ]
+ 366.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER204': class PDFDictionary
-227 0 obj
+% 'Annot.NUMBER207': class PDFDictionary
+230 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://plac.googlecode.com/hg/doc/plac.html) >>
@@ -3844,19 +3892,16 @@ endobj
0
0 ]
/Rect [ 62.69291
- 210.7736
+ 198.7736
157.1829
- 222.7736 ]
+ 210.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page19': class PDFPage
-228 0 obj
+231 0 obj
% Page dictionary
-<< /Annots [ 212 0 R
- 213 0 R
- 214 0 R
- 215 0 R
+<< /Annots [ 215 0 R
216 0 R
217 0 R
218 0 R
@@ -3868,13 +3913,16 @@ endobj
224 0 R
225 0 R
226 0 R
- 227 0 R ]
- /Contents 365 0 R
+ 227 0 R
+ 228 0 R
+ 229 0 R
+ 230 0 R ]
+ /Contents 369 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -3886,14 +3934,14 @@ endobj
/Type /Page >>
endobj
% 'Page20': class PDFPage
-229 0 obj
+232 0 obj
% Page dictionary
-<< /Contents 366 0 R
+<< /Contents 370 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -3904,8 +3952,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER205': class PDFDictionary
-230 0 obj
+% 'Annot.NUMBER208': class PDFDictionary
+233 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3913,22 +3961,22 @@ endobj
0
0 ]
/Rect [ 383.9329
- 588.5736
+ 576.5736
405.0529
- 600.5736 ]
+ 588.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page21': class PDFPage
-231 0 obj
+234 0 obj
% Page dictionary
-<< /Annots [ 230 0 R ]
- /Contents 367 0 R
+<< /Annots [ 233 0 R ]
+ /Contents 371 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -3939,8 +3987,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER206': class PDFDictionary
-232 0 obj
+% 'Annot.NUMBER209': class PDFDictionary
+235 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3948,14 +3996,14 @@ endobj
0
0 ]
/Rect [ 370.6785
- 211.3736
+ 199.3736
392.4956
- 223.3736 ]
+ 211.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER207': class PDFDictionary
-233 0 obj
+% 'Annot.NUMBER210': class PDFDictionary
+236 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3963,23 +4011,23 @@ endobj
0
0 ]
/Rect [ 455.8742
- 211.3736
+ 199.3736
477.6913
- 223.3736 ]
+ 211.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page22': class PDFPage
-234 0 obj
+237 0 obj
% Page dictionary
-<< /Annots [ 232 0 R
- 233 0 R ]
- /Contents 368 0 R
+<< /Annots [ 235 0 R
+ 236 0 R ]
+ /Contents 372 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -3990,8 +4038,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER208': class PDFDictionary
-235 0 obj
+% 'Annot.NUMBER211': class PDFDictionary
+238 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -3999,14 +4047,14 @@ endobj
0
0 ]
/Rect [ 185.9351
- 669.7736
+ 624.9893
207.4695
- 681.7736 ]
+ 636.9893 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER209': class PDFDictionary
-236 0 obj
+% 'Annot.NUMBER212': class PDFDictionary
+239 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/shlex.html) >>
@@ -4014,14 +4062,14 @@ endobj
0
0 ]
/Rect [ 369.8905
- 669.7736
+ 624.9893
396.425
- 681.7736 ]
+ 636.9893 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER210': class PDFDictionary
-237 0 obj
+% 'Annot.NUMBER213': class PDFDictionary
+240 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4029,14 +4077,14 @@ endobj
0
0 ]
/Rect [ 408.8916
- 657.7736
+ 612.9893
427.2316
- 669.7736 ]
+ 624.9893 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER211': class PDFDictionary
-238 0 obj
+% 'Annot.NUMBER214': class PDFDictionary
+241 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/shlex.html) >>
@@ -4044,14 +4092,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 645.7736
+ 600.9893
86.03291
- 657.7736 ]
+ 612.9893 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER212': class PDFDictionary
-239 0 obj
+% 'Annot.NUMBER215': class PDFDictionary
+242 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4059,14 +4107,14 @@ endobj
0
0 ]
/Rect [ 92.4689
- 645.7736
+ 600.9893
114.4649
- 657.7736 ]
+ 612.9893 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER213': class PDFDictionary
-240 0 obj
+% 'Annot.NUMBER216': class PDFDictionary
+243 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/shlex.html) >>
@@ -4074,14 +4122,14 @@ endobj
0
0 ]
/Rect [ 149.3204
- 633.7736
+ 588.9893
176.9472
- 645.7736 ]
+ 600.9893 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER214': class PDFDictionary
-241 0 obj
+% 'Annot.NUMBER217': class PDFDictionary
+244 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4089,14 +4137,14 @@ endobj
0
0 ]
/Rect [ 129.6923
- 537.7736
+ 492.9893
151.4655
- 549.7736 ]
+ 504.9893 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER215': class PDFDictionary
-242 0 obj
+% 'Annot.NUMBER218': class PDFDictionary
+245 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4104,14 +4152,14 @@ endobj
0
0 ]
/Rect [ 173.8529
- 525.7736
+ 480.9893
194.9729
- 537.7736 ]
+ 492.9893 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER216': class PDFDictionary
-243 0 obj
+% 'Annot.NUMBER219': class PDFDictionary
+246 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4119,46 +4167,30 @@ endobj
0
0 ]
/Rect [ 460.388
- 168.5985
+ 123.8142
482.0127
- 180.5985 ]
- /Subtype /Link
- /Type /Annot >>
-endobj
-% 'Annot.NUMBER217': class PDFDictionary
-244 0 obj
-<< /A << /S /URI
- /Type /Action
- /URI (http://pypi.python.org/pypi/plac) >>
- /Border [ 0
- 0
- 0 ]
- /Rect [ 95.32996
- 102.5985
- 116.857
- 114.5985 ]
+ 135.8142 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page23': class PDFPage
-245 0 obj
+247 0 obj
% Page dictionary
-<< /Annots [ 235 0 R
- 236 0 R
- 237 0 R
- 238 0 R
+<< /Annots [ 238 0 R
239 0 R
240 0 R
241 0 R
242 0 R
243 0 R
- 244 0 R ]
- /Contents 369 0 R
+ 244 0 R
+ 245 0 R
+ 246 0 R ]
+ /Contents 373 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4169,8 +4201,23 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER218': class PDFDictionary
-246 0 obj
+% 'Annot.NUMBER220': class PDFDictionary
+248 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 95.32996
+ 717.7736
+ 116.857
+ 729.7736 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER221': class PDFDictionary
+249 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://plac.googlecode.com/hg/doc/plac.html) >>
@@ -4178,14 +4225,14 @@ endobj
0
0 ]
/Rect [ 316.3528
- 287.3736
+ 221.3736
409.2453
- 299.3736 ]
+ 233.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER219': class PDFDictionary
-247 0 obj
+% 'Annot.NUMBER222': class PDFDictionary
+250 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4193,14 +4240,14 @@ endobj
0
0 ]
/Rect [ 419.1694
- 275.3736
+ 209.3736
440.4061
- 287.3736 ]
+ 221.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER220': class PDFDictionary
-248 0 obj
+% 'Annot.NUMBER223': class PDFDictionary
+251 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4208,14 +4255,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 245.3736
+ 179.3736
84.70395
- 257.3736 ]
+ 191.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER221': class PDFDictionary
-249 0 obj
+% 'Annot.NUMBER224': class PDFDictionary
+252 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4223,25 +4270,26 @@ endobj
0
0 ]
/Rect [ 293.2359
- 167.3736
+ 101.3736
316.4697
- 179.3736 ]
+ 113.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page24': class PDFPage
-250 0 obj
+253 0 obj
% Page dictionary
-<< /Annots [ 246 0 R
- 247 0 R
- 248 0 R
- 249 0 R ]
- /Contents 370 0 R
+<< /Annots [ 248 0 R
+ 249 0 R
+ 250 0 R
+ 251 0 R
+ 252 0 R ]
+ /Contents 374 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4252,8 +4300,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER222': class PDFDictionary
-251 0 obj
+% 'Annot.NUMBER225': class PDFDictionary
+254 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4261,14 +4309,34 @@ endobj
0
0 ]
/Rect [ 431.7904
- 180.5736
+ 118.5736
453.7245
- 192.5736 ]
+ 130.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER223': class PDFDictionary
-252 0 obj
+% 'Page25': class PDFPage
+255 0 obj
+% Page dictionary
+<< /Annots [ 254 0 R ]
+ /Contents 375 0 R
+ /MediaBox [ 0
+ 0
+ 595.2756
+ 841.8898 ]
+ /Parent 350 0 R
+ /Resources << /Font 1 0 R
+ /ProcSet [ /PDF
+ /Text
+ /ImageB
+ /ImageC
+ /ImageI ] >>
+ /Rotate 0
+ /Trans << >>
+ /Type /Page >>
+endobj
+% 'Annot.NUMBER226': class PDFDictionary
+256 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4276,14 +4344,14 @@ endobj
0
0 ]
/Rect [ 255.5885
- 150.5736
+ 753.7736
278.2757
- 162.5736 ]
+ 765.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER224': class PDFDictionary
-253 0 obj
+% 'Annot.NUMBER227': class PDFDictionary
+257 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/cmd.html) >>
@@ -4291,43 +4359,39 @@ endobj
0
0 ]
/Rect [ 513.6927
- 126.5736
+ 729.7736
532.1846
- 138.5736 ]
+ 741.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Page25': class PDFPage
-254 0 obj
-% Page dictionary
-<< /Annots [ 251 0 R
- 252 0 R
- 253 0 R ]
- /Contents 371 0 R
- /MediaBox [ 0
+% 'Annot.NUMBER228': class PDFDictionary
+258 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
0
- 595.2756
- 841.8898 ]
- /Parent 346 0 R
- /Resources << /Font 1 0 R
- /ProcSet [ /PDF
- /Text
- /ImageB
- /ImageC
- /ImageI ] >>
- /Rotate 0
- /Trans << >>
- /Type /Page >>
+ 0 ]
+ /Rect [ 323.3
+ 226.8179
+ 344.4661
+ 238.8179 ]
+ /Subtype /Link
+ /Type /Annot >>
endobj
% 'Page26': class PDFPage
-255 0 obj
+259 0 obj
% Page dictionary
-<< /Contents 372 0 R
+<< /Annots [ 256 0 R
+ 257 0 R
+ 258 0 R ]
+ /Contents 376 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4339,14 +4403,14 @@ endobj
/Type /Page >>
endobj
% 'Page27': class PDFPage
-256 0 obj
+260 0 obj
% Page dictionary
-<< /Contents 373 0 R
+<< /Contents 377 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4357,8 +4421,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER225': class PDFDictionary
-257 0 obj
+% 'Annot.NUMBER229': class PDFDictionary
+261 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4366,22 +4430,22 @@ endobj
0
0 ]
/Rect [ 179.0529
- 645.7736
+ 433.3736
201.1953
- 657.7736 ]
+ 445.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page28': class PDFPage
-258 0 obj
+262 0 obj
% Page dictionary
-<< /Annots [ 257 0 R ]
- /Contents 374 0 R
+<< /Annots [ 261 0 R ]
+ /Contents 378 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4392,8 +4456,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER226': class PDFDictionary
-259 0 obj
+% 'Annot.NUMBER230': class PDFDictionary
+263 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://freshmeat.net/projects/rlwrap/) >>
@@ -4401,14 +4465,14 @@ endobj
0
0 ]
/Rect [ 377.8504
- 735.7736
+ 481.3736
409.861
- 747.7736 ]
+ 493.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER227': class PDFDictionary
-260 0 obj
+% 'Annot.NUMBER231': class PDFDictionary
+264 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4416,14 +4480,14 @@ endobj
0
0 ]
/Rect [ 242.4466
- 723.7736
+ 469.3736
263.7922
- 735.7736 ]
+ 481.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER228': class PDFDictionary
-261 0 obj
+% 'Annot.NUMBER232': class PDFDictionary
+265 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://ipython.scipy.org/moin/PyReadline/Intro) >>
@@ -4431,14 +4495,14 @@ endobj
0
0 ]
/Rect [ 456.2271
- 723.7736
+ 469.3736
505.3627
- 735.7736 ]
+ 481.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER229': class PDFDictionary
-262 0 obj
+% 'Annot.NUMBER233': class PDFDictionary
+266 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4446,14 +4510,14 @@ endobj
0
0 ]
/Rect [ 363.1739
- 699.7736
+ 445.3736
386.5004
- 711.7736 ]
+ 457.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER230': class PDFDictionary
-263 0 obj
+% 'Annot.NUMBER234': class PDFDictionary
+267 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4461,14 +4525,14 @@ endobj
0
0 ]
/Rect [ 479.7508
- 687.7736
+ 433.3736
501.4627
- 699.7736 ]
+ 445.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER231': class PDFDictionary
-264 0 obj
+% 'Annot.NUMBER235': class PDFDictionary
+268 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/cmd.html) >>
@@ -4476,29 +4540,55 @@ endobj
0
0 ]
/Rect [ 366.9454
- 657.7736
+ 403.3736
388.8033
- 669.7736 ]
+ 415.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER232': class PDFDictionary
-265 0 obj
+% 'Annot.NUMBER236': class PDFDictionary
+269 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/cmd.html) >>
/Border [ 0
0
0 ]
- /Rect [ 170.8855
- 645.7736
- 189.7755
- 657.7736 ]
+ /Rect [ 172.4855
+ 391.3736
+ 191.3755
+ 403.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER233': class PDFDictionary
-266 0 obj
+% 'Page29': class PDFPage
+270 0 obj
+% Page dictionary
+<< /Annots [ 263 0 R
+ 264 0 R
+ 265 0 R
+ 266 0 R
+ 267 0 R
+ 268 0 R
+ 269 0 R ]
+ /Contents 379 0 R
+ /MediaBox [ 0
+ 0
+ 595.2756
+ 841.8898 ]
+ /Parent 350 0 R
+ /Resources << /Font 1 0 R
+ /ProcSet [ /PDF
+ /Text
+ /ImageB
+ /ImageC
+ /ImageI ] >>
+ /Rotate 0
+ /Trans << >>
+ /Type /Page >>
+endobj
+% 'Annot.NUMBER237': class PDFDictionary
+271 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -4506,14 +4596,14 @@ endobj
0
0 ]
/Rect [ 390.8027
- 304.5736
+ 708.5736
435.0027
- 316.5736 ]
+ 720.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER234': class PDFDictionary
-267 0 obj
+% 'Annot.NUMBER238': class PDFDictionary
+272 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4521,14 +4611,14 @@ endobj
0
0 ]
/Rect [ 213.451
- 292.5736
+ 696.5736
237.5255
- 304.5736 ]
+ 708.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER235': class PDFDictionary
-268 0 obj
+% 'Annot.NUMBER239': class PDFDictionary
+273 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -4536,14 +4626,14 @@ endobj
0
0 ]
/Rect [ 114.9429
- 268.5736
+ 672.5736
157.1829
- 280.5736 ]
+ 684.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER236': class PDFDictionary
-269 0 obj
+% 'Annot.NUMBER240': class PDFDictionary
+274 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4551,14 +4641,14 @@ endobj
0
0 ]
/Rect [ 385.0429
- 268.5736
+ 672.5736
403.3829
- 280.5736 ]
+ 684.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER237': class PDFDictionary
-270 0 obj
+% 'Annot.NUMBER241': class PDFDictionary
+275 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4566,14 +4656,14 @@ endobj
0
0 ]
/Rect [ 350.6129
- 238.5736
+ 642.5736
371.7329
- 250.5736 ]
+ 654.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER238': class PDFDictionary
-271 0 obj
+% 'Annot.NUMBER242': class PDFDictionary
+276 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4581,46 +4671,14 @@ endobj
0
0 ]
/Rect [ 256.6729
- 220.5736
+ 624.5736
277.7929
- 232.5736 ]
+ 636.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Page29': class PDFPage
-272 0 obj
-% Page dictionary
-<< /Annots [ 259 0 R
- 260 0 R
- 261 0 R
- 262 0 R
- 263 0 R
- 264 0 R
- 265 0 R
- 266 0 R
- 267 0 R
- 268 0 R
- 269 0 R
- 270 0 R
- 271 0 R ]
- /Contents 375 0 R
- /MediaBox [ 0
- 0
- 595.2756
- 841.8898 ]
- /Parent 346 0 R
- /Resources << /Font 1 0 R
- /ProcSet [ /PDF
- /Text
- /ImageB
- /ImageC
- /ImageI ] >>
- /Rotate 0
- /Trans << >>
- /Type /Page >>
-endobj
-% 'Annot.NUMBER239': class PDFDictionary
-273 0 obj
+% 'Annot.NUMBER243': class PDFDictionary
+277 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4628,14 +4686,14 @@ endobj
0
0 ]
/Rect [ 149.5469
- 729.7736
+ 531.3736
172.1982
- 741.7736 ]
+ 543.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER240': class PDFDictionary
-274 0 obj
+% 'Annot.NUMBER244': class PDFDictionary
+278 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/distutils/) >>
@@ -4643,23 +4701,29 @@ endobj
0
0 ]
/Rect [ 224.3178
- 717.7736
+ 519.3736
260.8853
- 729.7736 ]
+ 531.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page30': class PDFPage
-275 0 obj
+279 0 obj
% Page dictionary
-<< /Annots [ 273 0 R
- 274 0 R ]
- /Contents 376 0 R
+<< /Annots [ 271 0 R
+ 272 0 R
+ 273 0 R
+ 274 0 R
+ 275 0 R
+ 276 0 R
+ 277 0 R
+ 278 0 R ]
+ /Contents 380 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4670,8 +4734,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER241': class PDFDictionary
-276 0 obj
+% 'Annot.NUMBER245': class PDFDictionary
+280 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -4679,14 +4743,34 @@ endobj
0
0 ]
/Rect [ 381.1529
- 612.5736
+ 415.3736
423.3929
- 624.5736 ]
+ 427.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER242': class PDFDictionary
-277 0 obj
+% 'Page31': class PDFPage
+281 0 obj
+% Page dictionary
+<< /Annots [ 280 0 R ]
+ /Contents 381 0 R
+ /MediaBox [ 0
+ 0
+ 595.2756
+ 841.8898 ]
+ /Parent 350 0 R
+ /Resources << /Font 1 0 R
+ /ProcSet [ /PDF
+ /Text
+ /ImageB
+ /ImageC
+ /ImageI ] >>
+ /Rotate 0
+ /Trans << >>
+ /Type /Page >>
+endobj
+% 'Annot.NUMBER246': class PDFDictionary
+282 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4694,23 +4778,22 @@ endobj
0
0 ]
/Rect [ 62.69291
- 206.9736
+ 693.7736
84.72012
- 218.9736 ]
+ 705.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Page31': class PDFPage
-278 0 obj
+% 'Page32': class PDFPage
+283 0 obj
% Page dictionary
-<< /Annots [ 276 0 R
- 277 0 R ]
- /Contents 377 0 R
+<< /Annots [ 282 0 R ]
+ /Contents 382 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4721,15 +4804,15 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Page32': class PDFPage
-279 0 obj
+% 'Page33': class PDFPage
+284 0 obj
% Page dictionary
-<< /Contents 378 0 R
+<< /Contents 383 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4740,8 +4823,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER243': class PDFDictionary
-280 0 obj
+% 'Annot.NUMBER247': class PDFDictionary
+285 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4749,22 +4832,22 @@ endobj
0
0 ]
/Rect [ 182.479
- 194.1736
+ 693.7736
203.7662
- 206.1736 ]
+ 705.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Page33': class PDFPage
-281 0 obj
+% 'Page34': class PDFPage
+286 0 obj
% Page dictionary
-<< /Annots [ 280 0 R ]
- /Contents 379 0 R
+<< /Annots [ 285 0 R ]
+ /Contents 384 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4775,8 +4858,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER244': class PDFDictionary
-282 0 obj
+% 'Annot.NUMBER248': class PDFDictionary
+287 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4784,34 +4867,14 @@ endobj
0
0 ]
/Rect [ 255.1228
- 239.3736
+ 723.7736
276.5028
- 251.3736 ]
+ 735.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Page34': class PDFPage
-283 0 obj
-% Page dictionary
-<< /Annots [ 282 0 R ]
- /Contents 380 0 R
- /MediaBox [ 0
- 0
- 595.2756
- 841.8898 ]
- /Parent 346 0 R
- /Resources << /Font 1 0 R
- /ProcSet [ /PDF
- /Text
- /ImageB
- /ImageC
- /ImageI ] >>
- /Rotate 0
- /Trans << >>
- /Type /Page >>
-endobj
-% 'Annot.NUMBER245': class PDFDictionary
-284 0 obj
+% 'Annot.NUMBER249': class PDFDictionary
+288 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/multiprocessing.html) >>
@@ -4819,14 +4882,14 @@ endobj
0
0 ]
/Rect [ 295.0229
- 741.7736
+ 568.5736
367.2629
- 753.7736 ]
+ 580.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER246': class PDFDictionary
-285 0 obj
+% 'Annot.NUMBER250': class PDFDictionary
+289 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4834,39 +4897,24 @@ endobj
0
0 ]
/Rect [ 179.1295
- 693.7736
+ 520.5736
201.6839
- 705.7736 ]
- /Subtype /Link
- /Type /Annot >>
-endobj
-% 'Annot.NUMBER247': class PDFDictionary
-286 0 obj
-<< /A << /S /URI
- /Type /Action
- /URI (http://pypi.python.org/pypi/plac) >>
- /Border [ 0
- 0
- 0 ]
- /Rect [ 414.8874
- 203.3736
- 436.9487
- 215.3736 ]
+ 532.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page35': class PDFPage
-287 0 obj
+290 0 obj
% Page dictionary
-<< /Annots [ 284 0 R
- 285 0 R
- 286 0 R ]
- /Contents 381 0 R
+<< /Annots [ 287 0 R
+ 288 0 R
+ 289 0 R ]
+ /Contents 385 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4877,8 +4925,23 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER248': class PDFDictionary
-288 0 obj
+% 'Annot.NUMBER251': class PDFDictionary
+291 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 414.8874
+ 684.5736
+ 436.9487
+ 696.5736 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER252': class PDFDictionary
+292 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4886,22 +4949,23 @@ endobj
0
0 ]
/Rect [ 122.7054
- 735.7736
+ 540.5736
145.2085
- 747.7736 ]
+ 552.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page36': class PDFPage
-289 0 obj
+293 0 obj
% Page dictionary
-<< /Annots [ 288 0 R ]
- /Contents 382 0 R
+<< /Annots [ 291 0 R
+ 292 0 R ]
+ /Contents 386 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4912,8 +4976,27 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER249': class PDFDictionary
-290 0 obj
+% 'Page37': class PDFPage
+294 0 obj
+% Page dictionary
+<< /Contents 387 0 R
+ /MediaBox [ 0
+ 0
+ 595.2756
+ 841.8898 ]
+ /Parent 350 0 R
+ /Resources << /Font 1 0 R
+ /ProcSet [ /PDF
+ /Text
+ /ImageB
+ /ImageC
+ /ImageI ] >>
+ /Rotate 0
+ /Trans << >>
+ /Type /Page >>
+endobj
+% 'Annot.NUMBER253': class PDFDictionary
+295 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4921,14 +5004,14 @@ endobj
0
0 ]
/Rect [ 183.3657
- 243.3736
+ 717.7736
207.8364
- 255.3736 ]
+ 729.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER250': class PDFDictionary
-291 0 obj
+% 'Annot.NUMBER254': class PDFDictionary
+296 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/multiprocessing.html) >>
@@ -4936,35 +5019,14 @@ endobj
0
0 ]
/Rect [ 254.9929
- 219.3736
+ 693.7736
327.2329
- 231.3736 ]
+ 705.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Page37': class PDFPage
-292 0 obj
-% Page dictionary
-<< /Annots [ 290 0 R
- 291 0 R ]
- /Contents 383 0 R
- /MediaBox [ 0
- 0
- 595.2756
- 841.8898 ]
- /Parent 346 0 R
- /Resources << /Font 1 0 R
- /ProcSet [ /PDF
- /Text
- /ImageB
- /ImageC
- /ImageI ] >>
- /Rotate 0
- /Trans << >>
- /Type /Page >>
-endobj
-% 'Annot.NUMBER251': class PDFDictionary
-293 0 obj
+% 'Annot.NUMBER255': class PDFDictionary
+297 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -4972,22 +5034,24 @@ endobj
0
0 ]
/Rect [ 62.69291
- 444.5736
+ 262.5736
85.70846
- 456.5736 ]
+ 274.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page38': class PDFPage
-294 0 obj
+298 0 obj
% Page dictionary
-<< /Annots [ 293 0 R ]
- /Contents 384 0 R
+<< /Annots [ 295 0 R
+ 296 0 R
+ 297 0 R ]
+ /Contents 388 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -4998,8 +5062,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER252': class PDFDictionary
-295 0 obj
+% 'Annot.NUMBER256': class PDFDictionary
+299 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -5007,38 +5071,22 @@ endobj
0
0 ]
/Rect [ 176.9371
- 572.5736
+ 392.5736
198.5507
- 584.5736 ]
- /Subtype /Link
- /Type /Annot >>
-endobj
-% 'Annot.NUMBER253': class PDFDictionary
-296 0 obj
-<< /A << /S /URI
- /Type /Action
- /URI (http://pypi.python.org/pypi/plac) >>
- /Border [ 0
- 0
- 0 ]
- /Rect [ 62.69291
- 207.3736
- 84.98766
- 219.3736 ]
+ 404.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page39': class PDFPage
-297 0 obj
+300 0 obj
% Page dictionary
-<< /Annots [ 295 0 R
- 296 0 R ]
- /Contents 385 0 R
+<< /Annots [ 299 0 R ]
+ /Contents 389 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -5049,15 +5097,31 @@ endobj
/Trans << >>
/Type /Page >>
endobj
+% 'Annot.NUMBER257': class PDFDictionary
+301 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 62.69291
+ 681.7736
+ 84.98766
+ 693.7736 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
% 'Page40': class PDFPage
-298 0 obj
+302 0 obj
% Page dictionary
-<< /Contents 386 0 R
+<< /Annots [ 301 0 R ]
+ /Contents 390 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -5068,31 +5132,15 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER254': class PDFDictionary
-299 0 obj
-<< /A << /S /URI
- /Type /Action
- /URI (http://pypi.python.org/pypi/plac) >>
- /Border [ 0
- 0
- 0 ]
- /Rect [ 473.5049
- 211.3736
- 494.7927
- 223.3736 ]
- /Subtype /Link
- /Type /Annot >>
-endobj
% 'Page41': class PDFPage
-300 0 obj
+303 0 obj
% Page dictionary
-<< /Annots [ 299 0 R ]
- /Contents 387 0 R
+<< /Contents 391 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -5103,47 +5151,47 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER255': class PDFDictionary
-301 0 obj
+% 'Annot.NUMBER258': class PDFDictionary
+304 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
/Border [ 0
0
0 ]
- /Rect [ 172.4311
- 645.7736
- 194.7087
- 657.7736 ]
+ /Rect [ 473.5049
+ 678.5736
+ 494.7927
+ 690.5736 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER256': class PDFDictionary
-302 0 obj
+% 'Annot.NUMBER259': class PDFDictionary
+305 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
/Border [ 0
0
0 ]
- /Rect [ 91.57623
- 259.3736
- 114.8995
- 271.3736 ]
+ /Rect [ 172.4311
+ 433.9659
+ 194.7087
+ 445.9659 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page42': class PDFPage
-303 0 obj
+306 0 obj
% Page dictionary
-<< /Annots [ 301 0 R
- 302 0 R ]
- /Contents 388 0 R
+<< /Annots [ 304 0 R
+ 305 0 R ]
+ /Contents 392 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -5154,8 +5202,23 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER257': class PDFDictionary
-304 0 obj
+% 'Annot.NUMBER260': class PDFDictionary
+307 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 91.57623
+ 729.7736
+ 114.8995
+ 741.7736 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER261': class PDFDictionary
+308 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -5163,22 +5226,23 @@ endobj
0
0 ]
/Rect [ 106.6216
- 617.4272
+ 419.4272
128.3202
- 629.4272 ]
+ 431.4272 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page43': class PDFPage
-305 0 obj
+309 0 obj
% Page dictionary
-<< /Annots [ 304 0 R ]
- /Contents 389 0 R
+<< /Annots [ 307 0 R
+ 308 0 R ]
+ /Contents 393 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -5190,14 +5254,14 @@ endobj
/Type /Page >>
endobj
% 'Page44': class PDFPage
-306 0 obj
+310 0 obj
% Page dictionary
-<< /Contents 390 0 R
+<< /Contents 394 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 346 0 R
+ /Parent 350 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -5208,466 +5272,466 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'R307': class PDFCatalog
-307 0 obj
+% 'R311': class PDFCatalog
+311 0 obj
% Document Root
-<< /Outlines 309 0 R
- /PageLabels 391 0 R
+<< /Outlines 313 0 R
+ /PageLabels 395 0 R
/PageMode /UseNone
- /Pages 346 0 R
+ /Pages 350 0 R
/Type /Catalog >>
endobj
-% 'R308': class PDFInfo
-308 0 obj
+% 'R312': class PDFInfo
+312 0 obj
<< /Author ()
- /CreationDate (D:20110529090657-01'00')
+ /CreationDate (D:20110605055423-01'00')
/Creator (\(unspecified\))
/Keywords ()
/Producer (ReportLab PDF Library - www.reportlab.com)
/Subject (\(unspecified\))
/Title () >>
endobj
-% 'R309': class PDFOutlines
-309 0 obj
+% 'R313': class PDFOutlines
+313 0 obj
<< /Count 38
- /First 310 0 R
- /Last 325 0 R
+ /First 314 0 R
+ /Last 329 0 R
/Type /Outlines >>
endobj
% 'Outline.0': class OutlineEntryObject
-310 0 obj
+314 0 obj
<< /Count 14
/Dest [ 8 0 R
/XYZ
62.69291
765.0236
0 ]
- /First 311 0 R
- /Last 324 0 R
- /Next 325 0 R
- /Parent 309 0 R
+ /First 315 0 R
+ /Last 328 0 R
+ /Next 329 0 R
+ /Parent 313 0 R
/Title (Plac: Parsing the Command Line the Easy Way) >>
endobj
% 'Outline.37.0': class OutlineEntryObject
-311 0 obj
+315 0 obj
<< /Dest [ 97 0 R
/XYZ
62.69291
765.0236
0 ]
- /Next 312 0 R
- /Parent 310 0 R
+ /Next 316 0 R
+ /Parent 314 0 R
/Title (The importance of scaling down) >>
endobj
% 'Outline.37.1': class OutlineEntryObject
-312 0 obj
+316 0 obj
<< /Dest [ 97 0 R
/XYZ
62.69291
411.0236
0 ]
- /Next 313 0 R
- /Parent 310 0 R
- /Prev 311 0 R
+ /Next 317 0 R
+ /Parent 314 0 R
+ /Prev 315 0 R
/Title (Scripts with required arguments) >>
endobj
% 'Outline.37.2': class OutlineEntryObject
-313 0 obj
+317 0 obj
<< /Dest [ 112 0 R
/XYZ
62.69291
765.0236
0 ]
- /Next 314 0 R
- /Parent 310 0 R
- /Prev 312 0 R
+ /Next 318 0 R
+ /Parent 314 0 R
+ /Prev 316 0 R
/Title (Scripts with default arguments) >>
endobj
% 'Outline.37.3': class OutlineEntryObject
-314 0 obj
+318 0 obj
<< /Dest [ 122 0 R
/XYZ
62.69291
707.8236
0 ]
- /Next 315 0 R
- /Parent 310 0 R
- /Prev 313 0 R
+ /Next 319 0 R
+ /Parent 314 0 R
+ /Prev 317 0 R
/Title (Scripts with options \(and smart options\)) >>
endobj
% 'Outline.37.4': class OutlineEntryObject
-315 0 obj
+319 0 obj
<< /Dest [ 126 0 R
/XYZ
62.69291
715.8236
0 ]
- /Next 316 0 R
- /Parent 310 0 R
- /Prev 314 0 R
+ /Next 320 0 R
+ /Parent 314 0 R
+ /Prev 318 0 R
/Title (Scripts with flags) >>
endobj
% 'Outline.37.5': class OutlineEntryObject
-316 0 obj
+320 0 obj
<< /Dest [ 126 0 R
/XYZ
62.69291
216.5299
0 ]
- /Next 317 0 R
- /Parent 310 0 R
- /Prev 315 0 R
+ /Next 321 0 R
+ /Parent 314 0 R
+ /Prev 319 0 R
/Title (plac for Python 2.X users) >>
endobj
% 'Outline.37.6': class OutlineEntryObject
-317 0 obj
+321 0 obj
<< /Dest [ 134 0 R
/XYZ
62.69291
457.4236
0 ]
- /Next 318 0 R
- /Parent 310 0 R
- /Prev 316 0 R
+ /Next 322 0 R
+ /Parent 314 0 R
+ /Prev 320 0 R
/Title (More features) >>
endobj
% 'Outline.37.7': class OutlineEntryObject
-318 0 obj
+322 0 obj
<< /Dest [ 139 0 R
/XYZ
62.69291
478.6236
0 ]
- /Next 319 0 R
- /Parent 310 0 R
- /Prev 317 0 R
+ /Next 323 0 R
+ /Parent 314 0 R
+ /Prev 321 0 R
/Title (A realistic example) >>
endobj
% 'Outline.37.8': class OutlineEntryObject
-319 0 obj
+323 0 obj
<< /Dest [ 142 0 R
/XYZ
62.69291
420.6236
0 ]
- /Next 320 0 R
- /Parent 310 0 R
- /Prev 318 0 R
+ /Next 324 0 R
+ /Parent 314 0 R
+ /Prev 322 0 R
/Title (Keyword arguments) >>
endobj
% 'Outline.37.9': class OutlineEntryObject
-320 0 obj
+324 0 obj
<< /Dest [ 144 0 R
/XYZ
62.69291
409.4236
0 ]
- /Next 321 0 R
- /Parent 310 0 R
- /Prev 319 0 R
+ /Next 325 0 R
+ /Parent 314 0 R
+ /Prev 323 0 R
/Title (Final example: a shelve interface) >>
endobj
% 'Outline.37.10': class OutlineEntryObject
-321 0 obj
+325 0 obj
<< /Dest [ 159 0 R
/XYZ
62.69291
357.4236
0 ]
- /Next 322 0 R
- /Parent 310 0 R
- /Prev 320 0 R
+ /Next 326 0 R
+ /Parent 314 0 R
+ /Prev 324 0 R
/Title (plac vs argparse) >>
endobj
% 'Outline.37.11': class OutlineEntryObject
-322 0 obj
-<< /Dest [ 211 0 R
+326 0 obj
+<< /Dest [ 214 0 R
/XYZ
62.69291
705.0236
0 ]
- /Next 323 0 R
- /Parent 310 0 R
- /Prev 321 0 R
+ /Next 327 0 R
+ /Parent 314 0 R
+ /Prev 325 0 R
/Title (plac vs the rest of the world) >>
endobj
% 'Outline.37.12': class OutlineEntryObject
-323 0 obj
-<< /Dest [ 211 0 R
+327 0 obj
+<< /Dest [ 214 0 R
/XYZ
62.69291
- 435.0236
+ 411.0236
0 ]
- /Next 324 0 R
- /Parent 310 0 R
- /Prev 322 0 R
+ /Next 328 0 R
+ /Parent 314 0 R
+ /Prev 326 0 R
/Title (The future) >>
endobj
% 'Outline.37.13': class OutlineEntryObject
-324 0 obj
-<< /Dest [ 211 0 R
+328 0 obj
+<< /Dest [ 214 0 R
/XYZ
62.69291
- 231.0236
+ 207.0236
0 ]
- /Parent 310 0 R
- /Prev 323 0 R
+ /Parent 314 0 R
+ /Prev 327 0 R
/Title (Trivia: the story behind the name) >>
endobj
% 'Outline.1': class OutlineEntryObject
-325 0 obj
+329 0 obj
<< /Count 20
- /Dest [ 228 0 R
+ /Dest [ 231 0 R
/XYZ
62.69291
- 597.0236
+ 585.0236
0 ]
- /First 326 0 R
- /Last 345 0 R
- /Parent 309 0 R
- /Prev 310 0 R
+ /First 330 0 R
+ /Last 349 0 R
+ /Parent 313 0 R
+ /Prev 314 0 R
/Title (Advanced usages of plac) >>
endobj
% 'Outline.38.0': class OutlineEntryObject
-326 0 obj
-<< /Dest [ 228 0 R
+330 0 obj
+<< /Dest [ 231 0 R
/XYZ
62.69291
- 564.0236
+ 552.0236
0 ]
- /Next 327 0 R
- /Parent 325 0 R
+ /Next 331 0 R
+ /Parent 329 0 R
/Title (Introduction) >>
endobj
% 'Outline.38.1': class OutlineEntryObject
-327 0 obj
-<< /Dest [ 228 0 R
+331 0 obj
+<< /Dest [ 231 0 R
/XYZ
62.69291
- 342.0236
+ 330.0236
0 ]
- /Next 328 0 R
- /Parent 325 0 R
- /Prev 326 0 R
+ /Next 332 0 R
+ /Parent 329 0 R
+ /Prev 330 0 R
/Title (From scripts to interactive applications) >>
endobj
% 'Outline.38.2': class OutlineEntryObject
-328 0 obj
-<< /Dest [ 231 0 R
+332 0 obj
+<< /Dest [ 234 0 R
/XYZ
62.69291
- 545.8236
+ 533.8236
0 ]
- /Next 329 0 R
- /Parent 325 0 R
- /Prev 327 0 R
+ /Next 333 0 R
+ /Parent 329 0 R
+ /Prev 331 0 R
/Title (Testing a plac application) >>
endobj
% 'Outline.38.3': class OutlineEntryObject
-329 0 obj
-<< /Dest [ 234 0 R
+333 0 obj
+<< /Dest [ 237 0 R
/XYZ
62.69291
- 509.8236
+ 497.8236
0 ]
- /Next 330 0 R
- /Parent 325 0 R
- /Prev 328 0 R
+ /Next 334 0 R
+ /Parent 329 0 R
+ /Prev 332 0 R
/Title (Plac easy tests) >>
endobj
% 'Outline.38.4': class OutlineEntryObject
-330 0 obj
-<< /Dest [ 245 0 R
+334 0 obj
+<< /Dest [ 247 0 R
/XYZ
62.69291
- 215.8485
+ 171.0642
0 ]
- /Next 331 0 R
- /Parent 325 0 R
- /Prev 329 0 R
+ /Next 335 0 R
+ /Parent 329 0 R
+ /Prev 333 0 R
/Title (Plac batch scripts) >>
endobj
% 'Outline.38.5': class OutlineEntryObject
-331 0 obj
-<< /Dest [ 250 0 R
+335 0 obj
+<< /Dest [ 253 0 R
/XYZ
62.69291
- 322.6236
+ 256.6236
0 ]
- /Next 332 0 R
- /Parent 325 0 R
- /Prev 330 0 R
+ /Next 336 0 R
+ /Parent 329 0 R
+ /Prev 334 0 R
/Title (Implementing subcommands) >>
endobj
% 'Outline.38.6': class OutlineEntryObject
-332 0 obj
-<< /Dest [ 255 0 R
+336 0 obj
+<< /Dest [ 260 0 R
/XYZ
62.69291
- 310.0679
+ 765.0236
0 ]
- /Next 333 0 R
- /Parent 325 0 R
- /Prev 331 0 R
+ /Next 337 0 R
+ /Parent 329 0 R
+ /Prev 335 0 R
/Title (plac.Interpreter.call) >>
endobj
% 'Outline.38.7': class OutlineEntryObject
-333 0 obj
-<< /Dest [ 258 0 R
+337 0 obj
+<< /Dest [ 262 0 R
/XYZ
62.69291
- 681.0236
+ 468.6236
0 ]
- /Next 334 0 R
- /Parent 325 0 R
- /Prev 332 0 R
+ /Next 338 0 R
+ /Parent 329 0 R
+ /Prev 336 0 R
/Title (Readline support) >>
endobj
% 'Outline.38.8': class OutlineEntryObject
-334 0 obj
-<< /Dest [ 275 0 R
+338 0 obj
+<< /Dest [ 279 0 R
/XYZ
62.69291
- 765.0236
+ 566.6236
0 ]
- /Next 335 0 R
- /Parent 325 0 R
- /Prev 333 0 R
+ /Next 339 0 R
+ /Parent 329 0 R
+ /Prev 337 0 R
/Title (The plac runner) >>
endobj
% 'Outline.38.9': class OutlineEntryObject
-335 0 obj
-<< /Dest [ 278 0 R
+339 0 obj
+<< /Dest [ 283 0 R
/XYZ
62.69291
- 242.2236
+ 729.0236
0 ]
- /Next 336 0 R
- /Parent 325 0 R
- /Prev 334 0 R
+ /Next 340 0 R
+ /Parent 329 0 R
+ /Prev 338 0 R
/Title (A non class-based example) >>
endobj
% 'Outline.38.10': class OutlineEntryObject
-336 0 obj
-<< /Dest [ 281 0 R
+340 0 obj
+<< /Dest [ 286 0 R
/XYZ
62.69291
- 229.4236
+ 729.0236
0 ]
- /Next 337 0 R
- /Parent 325 0 R
- /Prev 335 0 R
+ /Next 341 0 R
+ /Parent 329 0 R
+ /Prev 339 0 R
/Title (Writing your own plac runner) >>
endobj
% 'Outline.38.11': class OutlineEntryObject
-337 0 obj
-<< /Dest [ 287 0 R
+341 0 obj
+<< /Dest [ 290 0 R
/XYZ
62.69291
- 729.0236
+ 555.8236
0 ]
- /Next 338 0 R
- /Parent 325 0 R
- /Prev 336 0 R
+ /Next 342 0 R
+ /Parent 329 0 R
+ /Prev 340 0 R
/Title (Long running commands) >>
endobj
% 'Outline.38.12': class OutlineEntryObject
-338 0 obj
-<< /Dest [ 287 0 R
+342 0 obj
+<< /Dest [ 293 0 R
/XYZ
62.69291
- 178.6236
+ 659.8236
0 ]
- /Next 339 0 R
- /Parent 325 0 R
- /Prev 337 0 R
+ /Next 343 0 R
+ /Parent 329 0 R
+ /Prev 341 0 R
/Title (Threaded commands) >>
endobj
% 'Outline.38.13': class OutlineEntryObject
-339 0 obj
-<< /Dest [ 292 0 R
+343 0 obj
+<< /Dest [ 298 0 R
/XYZ
62.69291
- 290.6236
+ 765.0236
0 ]
- /Next 340 0 R
- /Parent 325 0 R
- /Prev 338 0 R
+ /Next 344 0 R
+ /Parent 329 0 R
+ /Prev 342 0 R
/Title (Running commands as external processes) >>
endobj
% 'Outline.38.14': class OutlineEntryObject
-340 0 obj
-<< /Dest [ 294 0 R
+344 0 obj
+<< /Dest [ 298 0 R
/XYZ
62.69291
- 479.8236
+ 297.8236
0 ]
- /Next 341 0 R
- /Parent 325 0 R
- /Prev 339 0 R
+ /Next 345 0 R
+ /Parent 329 0 R
+ /Prev 343 0 R
/Title (Managing the output of concurrent commands) >>
endobj
% 'Outline.38.15': class OutlineEntryObject
-341 0 obj
-<< /Dest [ 297 0 R
+345 0 obj
+<< /Dest [ 300 0 R
/XYZ
62.69291
- 607.8236
+ 427.8236
0 ]
- /Next 342 0 R
- /Parent 325 0 R
- /Prev 340 0 R
+ /Next 346 0 R
+ /Parent 329 0 R
+ /Prev 344 0 R
/Title (Monitor support) >>
endobj
% 'Outline.38.16': class OutlineEntryObject
-342 0 obj
-<< /Dest [ 297 0 R
+346 0 obj
+<< /Dest [ 302 0 R
/XYZ
62.69291
- 242.6236
+ 717.0236
0 ]
- /Next 343 0 R
- /Parent 325 0 R
- /Prev 341 0 R
+ /Next 347 0 R
+ /Parent 329 0 R
+ /Prev 345 0 R
/Title (Parallel computing with plac) >>
endobj
% 'Outline.38.17': class OutlineEntryObject
-343 0 obj
-<< /Dest [ 303 0 R
+347 0 obj
+<< /Dest [ 306 0 R
/XYZ
62.69291
- 765.0236
+ 553.2159
0 ]
- /Next 344 0 R
- /Parent 325 0 R
- /Prev 342 0 R
+ /Next 348 0 R
+ /Parent 329 0 R
+ /Prev 346 0 R
/Title (The plac server) >>
endobj
% 'Outline.38.18': class OutlineEntryObject
-344 0 obj
-<< /Dest [ 303 0 R
+348 0 obj
+<< /Dest [ 309 0 R
/XYZ
62.69291
- 294.6236
+ 765.0236
0 ]
- /Next 345 0 R
- /Parent 325 0 R
- /Prev 343 0 R
+ /Next 349 0 R
+ /Parent 329 0 R
+ /Prev 347 0 R
/Title (Summary) >>
endobj
% 'Outline.38.19': class OutlineEntryObject
-345 0 obj
-<< /Dest [ 305 0 R
+349 0 obj
+<< /Dest [ 309 0 R
/XYZ
62.69291
- 652.6772
+ 454.6772
0 ]
- /Parent 325 0 R
- /Prev 344 0 R
+ /Parent 329 0 R
+ /Prev 348 0 R
/Title (Appendix: custom annotation objects) >>
endobj
-% 'R346': class PDFPages
-346 0 obj
+% 'R350': class PDFPages
+350 0 obj
% page tree
<< /Count 44
/Kids [ 8 0 R
@@ -5687,39 +5751,39 @@ endobj
147 0 R
159 0 R
174 0 R
- 211 0 R
- 228 0 R
- 229 0 R
+ 214 0 R
231 0 R
+ 232 0 R
234 0 R
- 245 0 R
- 250 0 R
- 254 0 R
+ 237 0 R
+ 247 0 R
+ 253 0 R
255 0 R
- 256 0 R
- 258 0 R
- 272 0 R
- 275 0 R
- 278 0 R
+ 259 0 R
+ 260 0 R
+ 262 0 R
+ 270 0 R
279 0 R
281 0 R
283 0 R
- 287 0 R
- 289 0 R
- 292 0 R
+ 284 0 R
+ 286 0 R
+ 290 0 R
+ 293 0 R
294 0 R
- 297 0 R
298 0 R
300 0 R
+ 302 0 R
303 0 R
- 305 0 R
- 306 0 R ]
+ 306 0 R
+ 309 0 R
+ 310 0 R ]
/Type /Pages >>
endobj
-% 'R347': class PDFStream
-347 0 obj
+% 'R351': class PDFStream
+351 0 obj
% page stream
-<< /Length 2935 >>
+<< /Length 2933 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -5789,7 +5853,7 @@ q
1 0 0 1 91.03937 3 cm
q
0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (August 2010) Tj T* ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (June 2011) Tj T* ET
Q
Q
q
@@ -5912,8 +5976,8 @@ Q
endstream
endobj
-% 'R348': class PDFStream
-348 0 obj
+% 'R352': class PDFStream
+352 0 obj
% page stream
<< /Length 9629 >>
stream
@@ -6247,7 +6311,7 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (26) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (27) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -6289,7 +6353,7 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (31) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (32) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -6303,7 +6367,7 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (33) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (34) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -6331,7 +6395,7 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (35) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (36) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -6345,7 +6409,7 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (37) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (38) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -6387,7 +6451,7 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (39) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (40) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -6415,7 +6479,7 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (42) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (43) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -6445,8 +6509,8 @@ Q
endstream
endobj
-% 'R349': class PDFStream
-349 0 obj
+% 'R353': class PDFStream
+353 0 obj
% page stream
<< /Length 5956 >>
stream
@@ -6530,8 +6594,8 @@ Q
endstream
endobj
-% 'R350': class PDFStream
-350 0 obj
+% 'R354': class PDFStream
+354 0 obj
% page stream
<< /Length 4163 >>
stream
@@ -6661,8 +6725,8 @@ Q
endstream
endobj
-% 'R351': class PDFStream
-351 0 obj
+% 'R355': class PDFStream
+355 0 obj
% page stream
<< /Length 4211 >>
stream
@@ -6792,8 +6856,8 @@ Q
endstream
endobj
-% 'R352': class PDFStream
-352 0 obj
+% 'R356': class PDFStream
+356 0 obj
% page stream
<< /Length 3873 >>
stream
@@ -6923,8 +6987,8 @@ Q
endstream
endobj
-% 'R353': class PDFStream
-353 0 obj
+% 'R357': class PDFStream
+357 0 obj
% page stream
<< /Length 5179 >>
stream
@@ -7081,8 +7145,8 @@ Q
endstream
endobj
-% 'R354': class PDFStream
-354 0 obj
+% 'R358': class PDFStream
+358 0 obj
% page stream
<< /Length 4058 >>
stream
@@ -7255,8 +7319,8 @@ Q
endstream
endobj
-% 'R355': class PDFStream
-355 0 obj
+% 'R359': class PDFStream
+359 0 obj
% page stream
<< /Length 4742 >>
stream
@@ -7397,8 +7461,8 @@ Q
endstream
endobj
-% 'R356': class PDFStream
-356 0 obj
+% 'R360': class PDFStream
+360 0 obj
% page stream
<< /Length 6254 >>
stream
@@ -7579,8 +7643,8 @@ Q
endstream
endobj
-% 'R357': class PDFStream
-357 0 obj
+% 'R361': class PDFStream
+361 0 obj
% page stream
<< /Length 3696 >>
stream
@@ -7723,8 +7787,8 @@ Q
endstream
endobj
-% 'R358': class PDFStream
-358 0 obj
+% 'R362': class PDFStream
+362 0 obj
% page stream
<< /Length 4537 >>
stream
@@ -7845,8 +7909,8 @@ Q
endstream
endobj
-% 'R359': class PDFStream
-359 0 obj
+% 'R363': class PDFStream
+363 0 obj
% page stream
<< /Length 3815 >>
stream
@@ -7963,8 +8027,8 @@ Q
endstream
endobj
-% 'R360': class PDFStream
-360 0 obj
+% 'R364': class PDFStream
+364 0 obj
% page stream
<< /Length 4073 >>
stream
@@ -8094,8 +8158,8 @@ Q
endstream
endobj
-% 'R361': class PDFStream
-361 0 obj
+% 'R365': class PDFStream
+365 0 obj
% page stream
<< /Length 6068 >>
stream
@@ -8334,8 +8398,8 @@ Q
endstream
endobj
-% 'R362': class PDFStream
-362 0 obj
+% 'R366': class PDFStream
+366 0 obj
% page stream
<< /Length 5938 >>
stream
@@ -8512,8 +8576,8 @@ Q
endstream
endobj
-% 'R363': class PDFStream
-363 0 obj
+% 'R367': class PDFStream
+367 0 obj
% page stream
<< /Length 7614 >>
stream
@@ -8720,10 +8784,10 @@ Q
endstream
endobj
-% 'R364': class PDFStream
-364 0 obj
+% 'R368': class PDFStream
+368 0 obj
% page stream
-<< /Length 8150 >>
+<< /Length 8496 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -8838,55 +8902,55 @@ BT 1 0 0 1 0 26 Tm .622488 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg
Q
Q
q
-1 0 0 1 62.69291 447.0236 cm
+1 0 0 1 62.69291 423.0236 cm
q
-BT 1 0 0 1 0 14 Tm .449982 Tw 12 TL /F1 10 Tf 0 0 0 rg (Command-line argument parsers keep coming out; between the newcomers I will notice ) Tj 0 0 .501961 rg (marrow.script ) Tj 0 0 0 rg (by) Tj T* 0 Tw (Alice Bevan-McGregor, which is quite similar to ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (in spirit, but does not rely on ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (at all.) Tj T* ET
+BT 1 0 0 1 0 38 Tm .449982 Tw 12 TL /F1 10 Tf 0 0 0 rg (Command-line argument parsers keep coming out; between the newcomers I will notice ) Tj 0 0 .501961 rg (marrow.script ) Tj 0 0 0 rg (by) Tj T* 0 Tw .30683 Tw (Alice Bevan-McGregor, which is quite similar to ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (in spirit, but does not rely on ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (at all. ) Tj 0 0 .501961 rg (Argh ) Tj 0 0 0 rg (by) Tj T* 0 Tw .600542 Tw (Andrey Mikhaylenko is also worth mentioning: it is also based on ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (, it came after ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (and I must) Tj T* 0 Tw (give credit to the author for the choice of the name, much funnier than plac!) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 417.0236 cm
+1 0 0 1 62.69291 393.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (The future) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 351.0236 cm
+1 0 0 1 62.69291 327.0236 cm
q
BT 1 0 0 1 0 50 Tm .135542 Tw 12 TL /F1 10 Tf 0 0 0 rg (Currently the core of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is around 200 lines of code, not counting blanks, comments and docstrings. I do) Tj T* 0 Tw .968626 Tw (not plan to extend the core much in the future. The idea is to keep the module short: it is and it should) Tj T* 0 Tw .11811 Tw (remain a little wrapper over ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (. Actually I have thought about contributing the core back to ) Tj 0 0 .501961 rg (argparse) Tj T* 0 Tw 2.307485 Tw 0 0 0 rg (if ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (becomes successfull and gains a reasonable number of users. For the moment it should be) Tj T* 0 Tw (considered in alpha status.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 309.0236 cm
+1 0 0 1 62.69291 285.0236 cm
q
BT 1 0 0 1 0 26 Tm .927488 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that even if ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (has been designed to be simple to use for simple stuff, its power should not be) Tj T* 0 Tw 1.02186 Tw (underestimated; it is actually a quite advanced tool with a domain of applicability which far exceeds the) Tj T* 0 Tw (realm of command-line arguments parsers.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 243.0236 cm
+1 0 0 1 62.69291 219.0236 cm
q
BT 1 0 0 1 0 50 Tm .285988 Tw 12 TL /F1 10 Tf 0 0 0 rg (Version 0.5 of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (doubled the code base and the documentation: it is based on the idea of using ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (to) Tj T* 0 Tw .408555 Tw (implement command-line interpreters, i.e. something akin to the ) Tj /F3 10 Tf (cmd ) Tj /F1 10 Tf (module in the standard library, only) Tj T* 0 Tw .49936 Tw (better. The new features of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (are described in the ) Tj 0 0 .501961 rg (advanced usage document ) Tj 0 0 0 rg (. They are implemented) Tj T* 0 Tw .313828 Tw (in a separated module \() Tj /F3 10 Tf (plac_ext.py) Tj /F1 10 Tf (\), since they require Python 2.5 to work, whereas ) Tj /F3 10 Tf (plac_core.py) Tj T* 0 Tw /F1 10 Tf (only requires Python 2.3.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 213.0236 cm
+1 0 0 1 62.69291 189.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Trivia: the story behind the name) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 147.0236 cm
+1 0 0 1 62.69291 123.0236 cm
q
BT 1 0 0 1 0 50 Tm .979984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (project started very humbly: I just wanted to make easy_installable my old ) Tj 0 0 .501961 rg (optionparse ) Tj 0 0 0 rg (recipe,) Tj T* 0 Tw .565988 Tw (and to publish it on PyPI. The original name of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (was optionparser and the idea behind it was to build) Tj T* 0 Tw .603735 Tw (an ) Tj 0 0 .501961 rg (OptionParser ) Tj 0 0 0 rg (object from the docstring of the module. However, before doing that, I decided to check) Tj T* 0 Tw .244198 Tw (out the ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (module, since I knew it was going into Python 2.7 and Python 2.7 was coming out. Soon) Tj T* 0 Tw (enough I realized two things:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 141.0236 cm
+1 0 0 1 62.69291 117.0236 cm
Q
q
-1 0 0 1 62.69291 141.0236 cm
+1 0 0 1 62.69291 117.0236 cm
Q
q
-1 0 0 1 62.69291 117.0236 cm
+1 0 0 1 62.69291 93.02362 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -8906,7 +8970,7 @@ q
Q
Q
q
-1 0 0 1 62.69291 111.0236 cm
+1 0 0 1 62.69291 88.86614 cm
Q
q
1 0 0 1 56.69291 56.69291 cm
@@ -8918,10 +8982,10 @@ Q
endstream
endobj
-% 'R365': class PDFStream
-365 0 obj
+% 'R369': class PDFStream
+369 0 obj
% page stream
-<< /Length 6620 >>
+<< /Length 6685 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -8968,67 +9032,67 @@ BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .877209 Tw (Having little imagination, I deci
Q
Q
q
-1 0 0 1 62.69291 609.0236 cm
+1 0 0 1 62.69291 597.0236 cm
q
-BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (That's all, I hope you will enjoy working with ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (!) Tj T* ET
+BT 1 0 0 1 0 14 Tm .225542 Tw 12 TL /F1 10 Tf 0 0 0 rg (That concludes the section about the basic usage of ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (. You are now ready to read about the advanced) Tj T* 0 Tw (usage.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 576.0236 cm
+1 0 0 1 62.69291 564.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Advanced usages of plac) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 546.0236 cm
+1 0 0 1 62.69291 534.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Introduction) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 504.0236 cm
+1 0 0 1 62.69291 492.0236 cm
q
BT 1 0 0 1 0 26 Tm .539036 Tw 12 TL /F1 10 Tf 0 0 0 rg (One of the design goals of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is to make it dead easy to write a scriptable and testable interface for an) Tj T* 0 Tw .813876 Tw (application. You can use ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (whenever you have an API with strings in input and strings in output, and) Tj T* 0 Tw (that includes a ) Tj /F4 10 Tf (huge ) Tj /F1 10 Tf (domain of applications.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 462.0236 cm
+1 0 0 1 62.69291 450.0236 cm
q
BT 1 0 0 1 0 26 Tm 1.756651 Tw 12 TL /F1 10 Tf 0 0 0 rg (A string-oriented interface is a scriptable interface by construction. That means that you can define a) Tj T* 0 Tw .918735 Tw (command language for your application and that it is possible to write scripts which are interpretable by) Tj T* 0 Tw 0 0 .501961 rg (plac ) Tj 0 0 0 rg (and can be run as batch scripts.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 420.0236 cm
+1 0 0 1 62.69291 408.0236 cm
q
BT 1 0 0 1 0 26 Tm .444987 Tw 12 TL /F1 10 Tf 0 0 0 rg (Actually, at the most general level, you can see ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (as a generic tool to write domain specific languages) Tj T* 0 Tw .107209 Tw (\(DSL\). With ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (you can test your application interactively as well as with batch scripts, and even with the) Tj T* 0 Tw (analogous of Python doctests for your defined language.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 354.0236 cm
+1 0 0 1 62.69291 342.0236 cm
q
BT 1 0 0 1 0 50 Tm .694104 Tw 12 TL /F1 10 Tf 0 0 0 rg (You can easily replace the ) Tj /F3 10 Tf (cmd ) Tj /F1 10 Tf (module of the standard library and you could easily write an application) Tj T* 0 Tw 2.271751 Tw (like ) Tj 0 0 .501961 rg (twill ) Tj 0 0 0 rg (with ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (. Or you could use it to script your building procedure. ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (also supports parallel) Tj T* 0 Tw .907765 Tw (execution of multiple commands and can be used as task manager and monitor. It is also quite easy to) Tj T* 0 Tw 1.483488 Tw (build a GUI or a Web application on top of ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (. When speaking of things you can do with ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (, your) Tj T* 0 Tw (imagination is the only limit!) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 324.0236 cm
+1 0 0 1 62.69291 312.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (From scripts to interactive applications) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 270.0236 cm
+1 0 0 1 62.69291 258.0236 cm
q
BT 1 0 0 1 0 38 Tm 1.300751 Tw 12 TL /F1 10 Tf 0 0 0 rg (Command-line scripts have many advantages, but they are no substitute for interactive applications. In) Tj T* 0 Tw .088171 Tw (particular, if you have a script with a large startup time which must be run multiple times, it is best to turn it) Tj T* 0 Tw 4.582126 Tw (into an interactive application, so that the startup is performed only once. ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (provides an) Tj T* 0 Tw /F3 10 Tf (Interpreter ) Tj /F1 10 Tf (class just for this purpose.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 240.0236 cm
+1 0 0 1 62.69291 228.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.293984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf (Interpreter ) Tj /F1 10 Tf (class wraps the main function of a script and provides an ) Tj /F3 10 Tf (.interact ) Tj /F1 10 Tf (method to) Tj T* 0 Tw (start an interactive interpreter reading commands from the console.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 210.0236 cm
+1 0 0 1 62.69291 198.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.49436 Tw 12 TL /F1 10 Tf 0 0 0 rg (For instance, you can define an interactive interpreter on top of the ) Tj /F3 10 Tf (ishelve ) Tj /F1 10 Tf (script introduced in the) Tj T* 0 Tw 0 0 .501961 rg (basic documentation ) Tj 0 0 0 rg (as follows:) Tj T* ET
Q
@@ -9044,11 +9108,11 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 108 re B*
+n -6 -6 468.6898 96 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 86 Tm /F3 10 Tf 12 TL (# shelve_interpreter.py) Tj T* (import plac, ishelve) Tj T* T* (@plac.annotations\() Tj T* ( interactive=\('start interactive interface', 'flag'\),) Tj T* ( subcommands='the commands of the underlying ishelve interpreter'\)) Tj T* (def main\(interactive, *subcommands\):) Tj T* ( """) Tj T* ET
+BT 1 0 0 1 0 74 Tm /F3 10 Tf 12 TL (# shelve_interpreter.py) Tj T* (import plac, ishelve) Tj T* T* (@plac.annotations\() Tj T* ( interactive=\('start interactive interface', 'flag'\),) Tj T* ( subcommands='the commands of the underlying ishelve interpreter'\)) Tj T* (def main\(interactive, *subcommands\):) Tj T* ET
Q
Q
Q
@@ -9064,14 +9128,14 @@ Q
endstream
endobj
-% 'R366': class PDFStream
-366 0 obj
+% 'R370': class PDFStream
+370 0 obj
% page stream
-<< /Length 3706 >>
+<< /Length 3712 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 619.8236 cm
+1 0 0 1 62.69291 607.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -9081,24 +9145,24 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 144 re B*
+n -6 -6 468.6898 156 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 122 Tm /F3 10 Tf 12 TL ( This script works both interactively and non-interactively.) Tj T* ( Use .help to see the internal commands.) Tj T* ( """) Tj T* ( if interactive:) Tj T* ( plac.Interpreter\(ishelve.main\).interact\(\)) Tj T* ( else:) Tj T* ( for out in plac.call\(ishelve.main, subcommands\):) Tj T* ( print\(out\)) Tj T* T* (if __name__ == '__main__':) Tj T* ( plac.call\(main\)) Tj T* ET
+BT 1 0 0 1 0 134 Tm /F3 10 Tf 12 TL ( """) Tj T* ( This script works both interactively and non-interactively.) Tj T* ( Use .help to see the internal commands.) Tj T* ( """) Tj T* ( if interactive:) Tj T* ( plac.Interpreter\(ishelve.main\).interact\(\)) Tj T* ( else:) Tj T* ( for out in plac.call\(ishelve.main, subcommands\):) Tj T* ( print\(out\)) Tj T* T* (if __name__ == '__main__':) Tj T* ( plac.call\(main\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 575.8236 cm
+1 0 0 1 62.69291 563.8236 cm
q
BT 1 0 0 1 0 26 Tm 2.200651 Tw 12 TL /F1 10 Tf 0 0 0 rg (A trick has been used here: the ishelve command-line interface has been hidden inside an external) Tj T* 0 Tw .917674 Tw (interface. They are distinct: for instance the external interface recognizes the ) Tj /F3 10 Tf (-h/--help ) Tj /F1 10 Tf (flag whereas) Tj T* 0 Tw (the internal interface only recognizes the ) Tj /F3 10 Tf (.help ) Tj /F1 10 Tf (command:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 542.6236 cm
+1 0 0 1 62.69291 530.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -9119,7 +9183,7 @@ Q
Q
Q
q
-1 0 0 1 62.69291 365.4236 cm
+1 0 0 1 62.69291 353.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -9140,14 +9204,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 345.4236 cm
+1 0 0 1 62.69291 333.4236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Thanks to this ingenuous trick, the script can be run both interactively and non-interactively:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 300.2236 cm
+1 0 0 1 62.69291 288.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -9168,7 +9232,7 @@ Q
Q
Q
q
-1 0 0 1 62.69291 280.2236 cm
+1 0 0 1 62.69291 268.2236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is an usage session:) Tj T* ET
@@ -9185,10 +9249,10 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 180 re B*
+n -6 -6 468.6898 168 re B*
Q
q
-BT 1 0 0 1 0 158 Tm 12 TL /F3 10 Tf 0 0 0 rg ($ python shelve_interpreter.py -i # interactive use) Tj T* (A simple interface to a shelve. Use .help to see the available commands.) Tj T* (i) Tj (>) Tj ( .help) Tj T* (Commands: .help, .showall, .clear, .delete) Tj T* (<) Tj (param) Tj (>) Tj ( ...) Tj T* (<) Tj (param=value) Tj (>) Tj ( ...) Tj T* (i) Tj (>) Tj ( a=1) Tj T* (setting a=1) Tj T* (i) Tj (>) Tj ( a) Tj T* (1) Tj T* (i) Tj (>) Tj ( b=2) Tj T* (setting b=2) Tj T* (i) Tj (>) Tj ( a b) Tj T* (1) Tj T* ET
+BT 1 0 0 1 0 146 Tm 12 TL /F3 10 Tf 0 0 0 rg ($ python shelve_interpreter.py -i # interactive use) Tj T* (A simple interface to a shelve. Use .help to see the available commands.) Tj T* (i) Tj (>) Tj ( .help) Tj T* (Commands: .help, .showall, .clear, .delete) Tj T* (<) Tj (param) Tj (>) Tj ( ...) Tj T* (<) Tj (param=value) Tj (>) Tj ( ...) Tj T* (i) Tj (>) Tj ( a=1) Tj T* (setting a=1) Tj T* (i) Tj (>) Tj ( a) Tj T* (1) Tj T* (i) Tj (>) Tj ( b=2) Tj T* (setting b=2) Tj T* (i) Tj (>) Tj ( a b) Tj T* ET
Q
Q
Q
@@ -9204,14 +9268,14 @@ Q
endstream
endobj
-% 'R367': class PDFStream
-367 0 obj
+% 'R371': class PDFStream
+371 0 obj
% page stream
-<< /Length 4887 >>
+<< /Length 4861 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 655.8236 cm
+1 0 0 1 62.69291 643.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -9221,48 +9285,48 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 108 re B*
+n -6 -6 468.6898 120 re B*
Q
q
-BT 1 0 0 1 0 86 Tm 12 TL /F3 10 Tf 0 0 0 rg (2) Tj T* (i) Tj (>) Tj ( .del a) Tj T* (deleted a) Tj T* (i) Tj (>) Tj ( a) Tj T* (a: not found) Tj T* (i) Tj (>) Tj ( .show) Tj T* (b=2) Tj T* (i) Tj (>) Tj ( [CTRL-D]) Tj T* ET
+BT 1 0 0 1 0 98 Tm 12 TL /F3 10 Tf 0 0 0 rg (1) Tj T* (2) Tj T* (i) Tj (>) Tj ( .del a) Tj T* (deleted a) Tj T* (i) Tj (>) Tj ( a) Tj T* (a: not found) Tj T* (i) Tj (>) Tj ( .show) Tj T* (b=2) Tj T* (i) Tj (>) Tj ( [CTRL-D]) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 587.8236 cm
+1 0 0 1 62.69291 575.8236 cm
q
BT 1 0 0 1 0 50 Tm .256412 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf (.interact ) Tj /F1 10 Tf (method reads commands from the console and send them to the underlying interpreter,) Tj T* 0 Tw .065984 Tw (until the user send a CTRL-D command \(CTRL-Z in Windows\). There is a default argument ) Tj /F3 10 Tf (prompt='i) Tj (>) Tj T* 0 Tw .41832 Tw (' ) Tj /F1 10 Tf (which can be used to change the prompt. The text displayed at the beginning of the interactive session) Tj T* 0 Tw 1.407126 Tw (is the docstring of the main function. ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (also understands command abbreviations: in this example) Tj T* 0 Tw /F3 10 Tf (del ) Tj /F1 10 Tf (is an abbreviation for ) Tj /F3 10 Tf (delete) Tj /F1 10 Tf (. In case of ambiguous abbreviations ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (raises a ) Tj /F3 10 Tf (NameError) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 557.8236 cm
+1 0 0 1 62.69291 545.8236 cm
q
BT 1 0 0 1 0 14 Tm .847045 Tw 12 TL /F1 10 Tf 0 0 0 rg (Finally I must notice that the ) Tj /F3 10 Tf (plac.Interpreter ) Tj /F1 10 Tf (is available only if you are using a recent version of) Tj T* 0 Tw (Python \() Tj (>) Tj (= 2.5\), because it is a context manager object which uses extended generators internally.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 527.8236 cm
+1 0 0 1 62.69291 515.8236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Testing a plac application) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 497.8236 cm
+1 0 0 1 62.69291 485.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 3.034269 Tw (You can conveniently test your application in interactive mode. However manual testing is a poor) Tj T* 0 Tw (substitute for automatic testing.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 479.8236 cm
+1 0 0 1 62.69291 467.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (In principle, one could write automatic tests for the ) Tj /F3 10 Tf (ishelve ) Tj /F1 10 Tf (application by using ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (directly:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 314.6236 cm
+1 0 0 1 62.69291 302.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -9283,13 +9347,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 270.6236 cm
+1 0 0 1 62.69291 258.6236 cm
q
BT 1 0 0 1 0 26 Tm .390651 Tw 12 TL /F1 10 Tf 0 0 0 rg (However, using ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (is not especially nice. The big issue is that ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (responds to invalid) Tj T* 0 Tw 1.249987 Tw (input by printing an error message on stderr and by raising a ) Tj /F3 10 Tf (SystemExit) Tj /F1 10 Tf (: this is certainly not a nice) Tj T* 0 Tw (thing to do in a test.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 228.6236 cm
+1 0 0 1 62.69291 216.6236 cm
q
BT 1 0 0 1 0 26 Tm 1.616457 Tw 12 TL /F1 10 Tf 0 0 0 rg (As a consequence of this behavior it is impossible to test for invalid commands, unless you wrap the) Tj T* 0 Tw .259985 Tw /F3 10 Tf (SystemExit ) Tj /F1 10 Tf (exception by hand each time \(a possibly you do something with the error message in stderr) Tj T* 0 Tw (too\). Luckily, ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (offers a better testing support through the ) Tj /F3 10 Tf (check ) Tj /F1 10 Tf (method of ) Tj /F3 10 Tf (Interpreter ) Tj /F1 10 Tf (objects:) Tj T* ET
Q
@@ -9305,11 +9369,11 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 120 re B*
+n -6 -6 468.6898 108 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 98 Tm /F3 10 Tf 12 TL (# test_ishelve_more.py) Tj T* (from __future__ import with_statement) Tj T* (import plac, ishelve) Tj T* T* (def test\(\):) Tj T* ( with plac.Interpreter\(ishelve.main\) as i:) Tj T* ( i.check\('.clear', 'cleared the shelve'\)) Tj T* ( i.check\('a=1', 'setting a=1'\)) Tj T* ( i.check\('a', '1'\)) Tj T* ET
+BT 1 0 0 1 0 86 Tm /F3 10 Tf 12 TL (# test_ishelve_more.py) Tj T* (from __future__ import with_statement) Tj T* (import plac, ishelve) Tj T* T* (def test\(\):) Tj T* ( with plac.Interpreter\(ishelve.main\) as i:) Tj T* ( i.check\('.clear', 'cleared the shelve'\)) Tj T* ( i.check\('a=1', 'setting a=1'\)) Tj T* ET
Q
Q
Q
@@ -9325,14 +9389,14 @@ Q
endstream
endobj
-% 'R368': class PDFStream
-368 0 obj
+% 'R372': class PDFStream
+372 0 obj
% page stream
-<< /Length 6116 >>
+<< /Length 5767 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 727.8236 cm
+1 0 0 1 62.69291 715.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -9342,39 +9406,39 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 36 re B*
+n -6 -6 468.6898 48 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 14 Tm /F3 10 Tf 12 TL ( i.check\('.delete=a', 'deleted a'\)) Tj T* ( i.check\('a', 'a: not found'\)) Tj T* ET
+BT 1 0 0 1 0 26 Tm /F3 10 Tf 12 TL ( i.check\('a', '1'\)) Tj T* ( i.check\('.delete=a', 'deleted a'\)) Tj T* ( i.check\('a', 'a: not found'\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 671.8236 cm
+1 0 0 1 62.69291 659.8236 cm
q
BT 1 0 0 1 0 38 Tm 6.299974 Tw 12 TL /F1 10 Tf 0 0 0 rg (The method ) Tj /F3 10 Tf (.check\(given_input, expected_output\) ) Tj /F1 10 Tf (works on strings and raises an) Tj T* 0 Tw .971318 Tw /F3 10 Tf (AssertionError ) Tj /F1 10 Tf (if the output produced by the interpreter is different from the expected output for the) Tj T* 0 Tw 2.186905 Tw (given input. Notice that ) Tj /F3 10 Tf (AssertionError ) Tj /F1 10 Tf (is catched by tools like ) Tj /F3 10 Tf (py.test ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (nosetests ) Tj /F1 10 Tf (and) Tj T* 0 Tw (actually ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (tests are intended to be run with such tools.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 617.8236 cm
+1 0 0 1 62.69291 605.8236 cm
q
BT 1 0 0 1 0 38 Tm .239984 Tw 12 TL /F1 10 Tf 0 0 0 rg (Interpreters offer a minor syntactic advantage with respect to calling ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (directly, but they offer a) Tj T* 0 Tw .96748 Tw /F4 10 Tf (major ) Tj /F1 10 Tf (semantic advantage when things go wrong \(read exceptions\): an ) Tj /F3 10 Tf (Interpreter ) Tj /F1 10 Tf (object internally) Tj T* 0 Tw 1.181318 Tw (invokes something like ) Tj /F3 10 Tf (plac.call) Tj /F1 10 Tf (, but it wraps all exceptions, so that ) Tj /F3 10 Tf (i.check ) Tj /F1 10 Tf (is guaranteed not to) Tj T* 0 Tw (raise any exception except ) Tj /F3 10 Tf (AssertionError) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 599.8236 cm
+1 0 0 1 62.69291 587.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Even the ) Tj /F3 10 Tf (SystemExit ) Tj /F1 10 Tf (exception is captured and you can write your test as) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 593.8236 cm
+1 0 0 1 62.69291 581.8236 cm
Q
q
-1 0 0 1 62.69291 581.8236 cm
+1 0 0 1 62.69291 569.8236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -9389,41 +9453,41 @@ q
Q
Q
q
-1 0 0 1 62.69291 581.8236 cm
+1 0 0 1 62.69291 569.8236 cm
Q
q
-1 0 0 1 62.69291 563.8236 cm
+1 0 0 1 62.69291 551.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (without risk of exiting from the Python interpreter.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 521.8236 cm
+1 0 0 1 62.69291 509.8236 cm
q
BT 1 0 0 1 0 26 Tm 1.422651 Tw 12 TL /F1 10 Tf 0 0 0 rg (There is a second advantage of interpreters: if the main function contains some initialization code and) Tj T* 0 Tw .454651 Tw (finalization code \() Tj /F3 10 Tf (__enter__ ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (__exit__ ) Tj /F1 10 Tf (functions\) they will be run only once at the beginning and) Tj T* 0 Tw (at the end of the interpreter loop. ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (instead ignores the initialization/finalization code.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 491.8236 cm
+1 0 0 1 62.69291 479.8236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Plac easy tests) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 449.8236 cm
+1 0 0 1 62.69291 437.8236 cm
q
BT 1 0 0 1 0 26 Tm 1.517126 Tw 12 TL /F1 10 Tf 0 0 0 rg (Writing your tests in terms of ) Tj /F3 10 Tf (Interpreter.check ) Tj /F1 10 Tf (is certainly an improvement over writing them in) Tj T* 0 Tw 1.807318 Tw (terms of ) Tj /F3 10 Tf (plac.call) Tj /F1 10 Tf (, but they are still too low-level for my taste. The ) Tj /F3 10 Tf (Interpreter ) Tj /F1 10 Tf (class provides) Tj T* 0 Tw (support for doctest-style tests, a.k.a. ) Tj /F4 10 Tf (plac easy tests) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 407.8236 cm
+1 0 0 1 62.69291 395.8236 cm
q
BT 1 0 0 1 0 26 Tm 2.142209 Tw 12 TL /F1 10 Tf 0 0 0 rg (By using plac easy tests you can cut and paste your interactive session and turn it into a runnable) Tj T* 0 Tw .519213 Tw (automatics test. Consider for instance the following file ) Tj /F3 10 Tf (ishelve.placet ) Tj /F1 10 Tf (\(the ) Tj /F3 10 Tf (.placet ) Tj /F1 10 Tf (extension is a) Tj T* 0 Tw (mnemonic for plac easy tests\):) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 230.6236 cm
+1 0 0 1 62.69291 218.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -9443,19 +9507,35 @@ Q
Q
Q
q
-1 0 0 1 62.69291 174.6236 cm
+1 0 0 1 62.69291 162.6236 cm
q
BT 1 0 0 1 0 38 Tm .697132 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice the precence of the shebang line containing the name of the ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (tool to test \(a ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (tool is just a) Tj T* 0 Tw 1.511751 Tw (Python module with a function called ) Tj /F3 10 Tf (main) Tj /F1 10 Tf (\). The shebang is ignored by the interpreter \(it looks like a) Tj T* 0 Tw .487608 Tw (comment to it\) but it is there so that external tools \(say a test runner\) can infer the plac interpreter to use) Tj T* 0 Tw (to test the file.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 144.6236 cm
+1 0 0 1 62.69291 132.6236 cm
q
BT 1 0 0 1 0 14 Tm 2.419984 Tw 12 TL /F1 10 Tf 0 0 0 rg (You can test ) Tj /F3 10 Tf (ishelve.placet ) Tj /F1 10 Tf (file by calling the ) Tj /F3 10 Tf (.doctest ) Tj /F1 10 Tf (method of the interpreter, as in this) Tj T* 0 Tw (example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 99.83932 cm
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (22) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R373': class PDFStream
+373 0 obj
+% page stream
+<< /Length 6371 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 728.2393 cm
q
q
.988825 0 0 .988825 0 0 cm
@@ -9476,59 +9556,43 @@ Q
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (22) Tj T* -235.3849 0 Td ET
-Q
-Q
-
-endstream
-endobj
-% 'R369': class PDFStream
-369 0 obj
-% page stream
-<< /Length 6740 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 729.0236 cm
+1 0 0 1 62.69291 684.2393 cm
q
BT 1 0 0 1 0 26 Tm 4.007109 Tw 12 TL /F1 10 Tf 0 0 0 rg (Internally ) Tj /F3 10 Tf (Interpreter.doctests ) Tj /F1 10 Tf (invokes something like ) Tj /F3 10 Tf (Interpreter.check ) Tj /F1 10 Tf (multiple times) Tj T* 0 Tw .226654 Tw (inside the same context and compare the output with the expected output: if even a check fails, the whole) Tj T* 0 Tw (test fail.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 687.0236 cm
+1 0 0 1 62.69291 642.2393 cm
q
BT 1 0 0 1 0 26 Tm .175868 Tw 12 TL /F1 10 Tf 0 0 0 rg (You should realize tha the easy tests supported by ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (are ) Tj /F4 10 Tf (not ) Tj /F1 10 Tf (unittests: they are functional tests. They) Tj T* 0 Tw 1.22936 Tw (model then user interaction and the order of the operations generally matters. The single subtests in a) Tj T* 0 Tw /F3 10 Tf (.placet ) Tj /F1 10 Tf (file are not independent and it makes sense to exit immediately at the first failure.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 609.0236 cm
+1 0 0 1 62.69291 564.2393 cm
q
BT 1 0 0 1 0 62 Tm .414431 Tw 12 TL /F1 10 Tf 0 0 0 rg (The support for doctests in ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (comes nearly for free, thanks to the ) Tj 0 0 .501961 rg (shlex ) Tj 0 0 0 rg (module in the standard library,) Tj T* 0 Tw .352765 Tw (which is able to parse simple languages as the ones you can implement with ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (. In particular, thanks to) Tj T* 0 Tw .875984 Tw 0 0 .501961 rg (shlex) Tj 0 0 0 rg (, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is able to recognize comments \(the default comment character is ) Tj /F3 10 Tf (#) Tj /F1 10 Tf (\), escape sequences and) Tj T* 0 Tw 1.50686 Tw (more. Look at the ) Tj 0 0 .501961 rg (shlex ) Tj 0 0 0 rg (documentation if you need to customize how the language is interpreted. For) Tj T* 0 Tw 2.794985 Tw (more flexibility, it is even possible to pass to the interpreter a custom split function with signature) Tj T* 0 Tw /F3 10 Tf (split\(line, commentchar\)) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 555.0236 cm
+1 0 0 1 62.69291 510.2393 cm
q
BT 1 0 0 1 0 38 Tm .136654 Tw 12 TL /F1 10 Tf 0 0 0 rg (In addition, I have implemented from scratch some support for line number recognition, so that if a test fail) Tj T* 0 Tw .042093 Tw (you get the line number of the failing command. This is especially useful if your tests are stored in external) Tj T* 0 Tw .610898 Tw (files, even if plac easy tests does not need to be in a file: you can just pass to the ) Tj /F3 10 Tf (.doctest ) Tj /F1 10 Tf (method a) Tj T* 0 Tw (list of strings corresponding to the lines of the file.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 525.0236 cm
+1 0 0 1 62.69291 480.2393 cm
q
BT 1 0 0 1 0 14 Tm .653145 Tw 12 TL /F1 10 Tf 0 0 0 rg (At the present ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (does not use any code from the doctest module, but the situation may change in the) Tj T* 0 Tw (future \(it would be nice if ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (could reuse doctests directives like ELLIPSIS\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 495.0236 cm
+1 0 0 1 62.69291 450.2393 cm
q
BT 1 0 0 1 0 14 Tm 1.447318 Tw 12 TL /F1 10 Tf 0 0 0 rg (It is straighforward to integrate your ) Tj /F3 10 Tf (.placet ) Tj /F1 10 Tf (tests with standard testing tools. For instance, you can) Tj T* 0 Tw (integrate your doctests with ) Tj /F3 10 Tf (nose ) Tj /F1 10 Tf (or ) Tj /F3 10 Tf (py.test ) Tj /F1 10 Tf (as follow:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 307.8485 cm
+1 0 0 1 62.69291 263.0642 cm
q
q
.988825 0 0 .988825 0 0 cm
@@ -9549,30 +9613,24 @@ Q
Q
Q
q
-1 0 0 1 62.69291 227.8485 cm
+1 0 0 1 62.69291 183.0642 cm
q
BT 1 0 0 1 0 62 Tm 1.44811 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here you should notice that usage of ) Tj /F3 10 Tf (plac.import_main) Tj /F1 10 Tf (, an utility which is able to import the main) Tj T* 0 Tw .775703 Tw (function of the script specified in the shebang line. You can use both the full path name of the tool, or a) Tj T* 0 Tw .87686 Tw (relative path name. In this case the runner look at the environment variable ) Tj /F3 10 Tf (PLACPATH ) Tj /F1 10 Tf (and it searches) Tj T* 0 Tw 1.900651 Tw (the plac tool in the directories specified there \() Tj /F3 10 Tf (PLACPATH ) Tj /F1 10 Tf (is just a string containing directory names) Tj T* 0 Tw .56332 Tw (separated by colons\). If the variable ) Tj /F3 10 Tf (PLACPATH ) Tj /F1 10 Tf (is not defined, it just looks in the current directory. If the) Tj T* 0 Tw (plac tool is not found, an ) Tj /F3 10 Tf (ImportError ) Tj /F1 10 Tf (is raised.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 197.8485 cm
+1 0 0 1 62.69291 153.0642 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Plac batch scripts) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 155.8485 cm
+1 0 0 1 62.69291 111.0642 cm
q
BT 1 0 0 1 0 26 Tm .772093 Tw 12 TL /F1 10 Tf 0 0 0 rg (It is pretty easy to realize that an interactive interpreter can also be used to run batch scripts: instead of) Tj T* 0 Tw .504692 Tw (reading the commands from the console, it is enough to read the commands from a file. ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (interpreters) Tj T* 0 Tw (provide an ) Tj /F3 10 Tf (.execute ) Tj /F1 10 Tf (method to perform just that.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 89.84848 cm
-q
-BT 1 0 0 1 0 50 Tm .098935 Tw 12 TL /F1 10 Tf 0 0 0 rg (There is just a subtle point to notice: whereas in an interactive loop one wants to manage all exceptions, a) Tj T* 0 Tw 3.866412 Tw (batch script should not in the background in case of unexpected errors. The implementation of) Tj T* 0 Tw .103059 Tw /F3 10 Tf (Interpreter.execute ) Tj /F1 10 Tf (makes sure that any error raised by ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (internally is re-raised. In other) Tj T* 0 Tw .407045 Tw (words, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (interpreters ) Tj /F4 10 Tf (wrap the errors, but does not eat them) Tj /F1 10 Tf (: the errors are always accessible and can) Tj T* 0 Tw (be re-raised on demand.) Tj T* ET
-Q
-Q
-q
1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
@@ -9582,20 +9640,26 @@ Q
endstream
endobj
-% 'R370': class PDFStream
-370 0 obj
+% 'R374': class PDFStream
+374 0 obj
% page stream
-<< /Length 4637 >>
+<< /Length 4903 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 741.0236 cm
+1 0 0 1 62.69291 705.0236 cm
+q
+BT 1 0 0 1 0 50 Tm .098935 Tw 12 TL /F1 10 Tf 0 0 0 rg (There is just a subtle point to notice: whereas in an interactive loop one wants to manage all exceptions, a) Tj T* 0 Tw 3.866412 Tw (batch script should not in the background in case of unexpected errors. The implementation of) Tj T* 0 Tw .103059 Tw /F3 10 Tf (Interpreter.execute ) Tj /F1 10 Tf (makes sure that any error raised by ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (internally is re-raised. In other) Tj T* 0 Tw .407045 Tw (words, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (interpreters ) Tj /F4 10 Tf (wrap the errors, but does not eat them) Tj /F1 10 Tf (: the errors are always accessible and can) Tj T* 0 Tw (be re-raised on demand.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 675.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.239318 Tw 12 TL /F1 10 Tf 0 0 0 rg (The exception is the case of invalid commands, which are skipped. Consider for instance the following) Tj T* 0 Tw (batch file, which contains a mispelled command \() Tj /F3 10 Tf (.dl ) Tj /F1 10 Tf (instead of ) Tj /F3 10 Tf (.del) Tj /F1 10 Tf (\):) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 635.8236 cm
+1 0 0 1 62.69291 569.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -9616,13 +9680,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 603.8236 cm
+1 0 0 1 62.69291 537.8236 cm
q
BT 1 0 0 1 0 14 Tm 1.939461 Tw 12 TL /F1 10 Tf 0 0 0 rg (If you execute the batch file, the interpreter will print a ) Tj /F3 10 Tf (.dl: not found ) Tj /F1 10 Tf (at the ) Tj /F3 10 Tf (.dl ) Tj /F1 10 Tf (line and will) Tj T* 0 Tw (continue:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 378.6236 cm
+1 0 0 1 62.69291 312.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -9642,81 +9706,67 @@ Q
Q
Q
q
-1 0 0 1 62.69291 334.6236 cm
+1 0 0 1 62.69291 268.6236 cm
q
BT 1 0 0 1 0 26 Tm .159988 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf (verbose ) Tj /F1 10 Tf (flag is there to show the lines which are being interpreted \(prefixed by ) Tj /F3 10 Tf (i) Tj (>) Tj /F1 10 Tf (\). This is done on) Tj T* 0 Tw 1.359988 Tw (purpose, so that you can cut and paste the output of the batch script and turn it into a ) Tj /F3 10 Tf (.placet ) Tj /F1 10 Tf (test) Tj T* 0 Tw (\(cool, isn't it?\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 304.6236 cm
+1 0 0 1 62.69291 238.6236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Implementing subcommands) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 262.6236 cm
+1 0 0 1 62.69291 196.6236 cm
q
BT 1 0 0 1 0 26 Tm 1.182485 Tw 12 TL /F1 10 Tf 0 0 0 rg (When I discussed the ) Tj /F3 10 Tf (ishelve ) Tj /F1 10 Tf (implementation in the ) Tj 0 0 .501961 rg (basic documentation) Tj 0 0 0 rg (, I said that it looked like a) Tj T* 0 Tw .116655 Tw (poor man implementation of an object system as a chain of elifs; I also said that ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (was able to do much) Tj T* 0 Tw (better than that. Here I will substantiate my claim.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 220.6236 cm
+1 0 0 1 62.69291 154.6236 cm
q
BT 1 0 0 1 0 26 Tm .89104 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is actually able to infer a set of subparsers from a generic container of commands. This is useful if) Tj T* 0 Tw 3.125814 Tw (you want to implement ) Tj /F4 10 Tf (subcommands ) Tj /F1 10 Tf (\(a familiar example of a command-line application featuring) Tj T* 0 Tw (subcommands is subversion\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 154.6236 cm
+1 0 0 1 62.69291 100.6236 cm
q
-BT 1 0 0 1 0 50 Tm .015868 Tw 12 TL /F1 10 Tf 0 0 0 rg (Technically a container of commands is any object with a ) Tj /F3 10 Tf (.commands ) Tj /F1 10 Tf (attribute listing a set of functions or) Tj T* 0 Tw 2.550888 Tw (methods which are valid commands. A command container may have initialization/finalization hooks) Tj T* 0 Tw 2.55664 Tw (\() Tj /F3 10 Tf (__enter__/__exit__) Tj /F1 10 Tf (\) and dispatch hooks \() Tj /F3 10 Tf (__missing__) Tj /F1 10 Tf (, invoked for invalid command names\).) Tj T* 0 Tw 2.113828 Tw (Moreover, only when using command containers ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is able to provide automatic autocompletion of) Tj T* 0 Tw (commands.) Tj T* ET
+BT 1 0 0 1 0 38 Tm .015868 Tw 12 TL /F1 10 Tf 0 0 0 rg (Technically a container of commands is any object with a ) Tj /F3 10 Tf (.commands ) Tj /F1 10 Tf (attribute listing a set of functions or ) Tj T* 0 Tw 2.550888 Tw (methods which are valid commands. A command container may have initialization/finalization hooks ) Tj T* 0 Tw 2.55664 Tw (\() Tj /F3 10 Tf (__enter__/__exit__) Tj /F1 10 Tf (\) and dispatch hooks \() Tj /F3 10 Tf (__missing__) Tj /F1 10 Tf (, invoked for invalid command names\). ) Tj T* 0 Tw 2.113828 Tw (Moreover, only when using command containers ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is able to provide automatic autocompletion of) Tj T* 0 Tw ET
Q
Q
q
-1 0 0 1 62.69291 136.6236 cm
+1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The shelve interface can be rewritten in an object-oriented way as follows:) Tj T* ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (24) Tj T* -235.3849 0 Td ET
Q
Q
+
+endstream
+endobj
+% 'R375': class PDFStream
+375 0 obj
+% page stream
+<< /Length 3734 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 91.42362 cm
-q
-q
-1 0 0 1 0 0 cm
-q
-1 0 0 1 6.6 6.6 cm
-q
-.662745 .662745 .662745 RG
-.5 w
-.960784 .960784 .862745 rg
-n -6 -6 468.6898 36 re B*
-Q
+1 0 0 1 62.69291 753.0236 cm
q
0 0 0 rg
-BT 1 0 0 1 0 14 Tm /F3 10 Tf 12 TL (# ishelve2.py) Tj T* (import shelve, os, sys, plac) Tj T* ET
-Q
-Q
-Q
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (commands.) Tj T* ET
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
+1 0 0 1 62.69291 735.0236 cm
q
0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (24) Tj T* -235.3849 0 Td ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The shelve interface can be rewritten in an object-oriented way as follows:) Tj T* ET
Q
Q
-
-endstream
-endobj
-% 'R371': class PDFStream
-371 0 obj
-% page stream
-<< /Length 4327 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 259.8236 cm
+1 0 0 1 62.69291 197.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -9726,29 +9776,23 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 504 re B*
+n -6 -6 468.6898 528 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 482 Tm /F3 10 Tf 12 TL T* (class ShelveInterface\(object\):) Tj T* ( "A minimal interface over a shelve object.") Tj T* ( commands = 'set', 'show', 'showall', 'delete') Tj T* ( @plac.annotations\() Tj T* ( configfile=\('path name of the shelve', 'option'\)\)) Tj T* ( def __init__\(self, configfile\):) Tj T* ( self.configfile = configfile or '~/conf.shelve') Tj T* ( self.fname = os.path.expanduser\(self.configfile\)) Tj T* ( self.__doc__ += '\\nOperating on %s.\\n.help to see '\\) Tj T* ( 'the available commands.\\n' % self.fname) Tj T* ( def __enter__\(self\):) Tj T* ( self.sh = shelve.open\(self.fname\)) Tj T* ( return self) Tj T* ( def __exit__\(self, etype, exc, tb\):) Tj T* ( self.sh.close\(\)) Tj T* ( def set\(self, name, value\):) Tj T* ( "set name value") Tj T* ( yield 'setting %s=%s' % \(name, value\)) Tj T* ( self.sh[name] = value) Tj T* ( def show\(self, *names\):) Tj T* ( "show given parameters") Tj T* ( for name in names:) Tj T* ( yield '%s = %s' % \(name, self.sh[name]\) # no error checking) Tj T* ( def showall\(self\):) Tj T* ( "show all parameters") Tj T* ( for name in self.sh:) Tj T* ( yield '%s = %s' % \(name, self.sh[name]\)) Tj T* ( def delete\(self, name=None\):) Tj T* ( "delete given parameter \(or everything\)") Tj T* ( if name is None:) Tj T* ( yield 'deleting everything') Tj T* ( self.sh.clear\(\)) Tj T* ( else:) Tj T* ( yield 'deleting %s' % name) Tj T* ( del self.sh[name] # no error checking) Tj T* T* (main = ShelveInterface # useful for the tests) Tj T* T* (if __name__ == '__main__':) Tj T* ( plac.Interpreter.call\(ShelveInterface\)) Tj T* ET
+BT 1 0 0 1 0 506 Tm /F3 10 Tf 12 TL (# ishelve2.py) Tj T* (import shelve, os, sys, plac) Tj T* T* (class ShelveInterface\(object\):) Tj T* ( "A minimal interface over a shelve object.") Tj T* ( commands = 'set', 'show', 'showall', 'delete') Tj T* ( @plac.annotations\() Tj T* ( configfile=\('path name of the shelve', 'option'\)\)) Tj T* ( def __init__\(self, configfile\):) Tj T* ( self.configfile = configfile or '~/conf.shelve') Tj T* ( self.fname = os.path.expanduser\(self.configfile\)) Tj T* ( self.__doc__ += '\\nOperating on %s.\\nUse help to see '\\) Tj T* ( 'the available commands.\\n' % self.fname) Tj T* ( def __enter__\(self\):) Tj T* ( self.sh = shelve.open\(self.fname\)) Tj T* ( return self) Tj T* ( def __exit__\(self, etype, exc, tb\):) Tj T* ( self.sh.close\(\)) Tj T* ( def set\(self, name, value\):) Tj T* ( "set name value") Tj T* ( yield 'setting %s=%s' % \(name, value\)) Tj T* ( self.sh[name] = value) Tj T* ( def show\(self, *names\):) Tj T* ( "show given parameters") Tj T* ( for name in names:) Tj T* ( yield '%s = %s' % \(name, self.sh[name]\) # no error checking) Tj T* ( def showall\(self\):) Tj T* ( "show all parameters") Tj T* ( for name in self.sh:) Tj T* ( yield '%s = %s' % \(name, self.sh[name]\)) Tj T* ( def delete\(self, name=None\):) Tj T* ( "delete given parameter \(or everything\)") Tj T* ( if name is None:) Tj T* ( yield 'deleting everything') Tj T* ( self.sh.clear\(\)) Tj T* ( else:) Tj T* ( yield 'deleting %s' % name) Tj T* ( del self.sh[name] # no error checking) Tj T* T* (main = ShelveInterface # useful for the tests) Tj T* T* (if __name__ == '__main__':) Tj T* ( plac.Interpreter.call\(ShelveInterface\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 167.8236 cm
+1 0 0 1 62.69291 105.8236 cm
q
BT 1 0 0 1 0 74 Tm .885366 Tw 12 TL /F3 10 Tf 0 0 0 rg (plac.Interpreter ) Tj /F1 10 Tf (objects wrap context manager objects consistently. In other words, if you wrap an) Tj T* 0 Tw 2.323828 Tw (object with ) Tj /F3 10 Tf (__enter__ ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (__exit__ ) Tj /F1 10 Tf (methods, they are invoked in the right order \() Tj /F3 10 Tf (__enter__) Tj T* 0 Tw .23528 Tw /F1 10 Tf (before the interpreter loop starts and ) Tj /F3 10 Tf (__exit__ ) Tj /F1 10 Tf (after the interpreter loop ends, both in the regular and in) Tj T* 0 Tw 1.916412 Tw (the exceptional case\). In our example, the methods ) Tj /F3 10 Tf (__enter__ ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (__exit__ ) Tj /F1 10 Tf (make sure the the) Tj T* 0 Tw .339398 Tw (shelve is opened and closed correctly even in the case of exceptions. Notice that I have not implemented) Tj T* 0 Tw .814104 Tw (any error checking in the ) Tj /F3 10 Tf (show ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (delete ) Tj /F1 10 Tf (methods on purpose, to verify that ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (works correctly in) Tj T* 0 Tw (the presence of exceptions.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 89.82362 cm
-q
-BT 1 0 0 1 0 62 Tm 1.567126 Tw 12 TL /F1 10 Tf 0 0 0 rg (When working with command containers, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (automatically adds two special commands to the set of) Tj T* 0 Tw 1.176136 Tw (provided commands: ) Tj /F3 10 Tf (.help ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (.last_tb) Tj /F1 10 Tf (. The ) Tj /F3 10 Tf (.help ) Tj /F1 10 Tf (command is the easier to understand: when) Tj T* 0 Tw .39811 Tw (invoked without arguments it displays the list of available commands with the same formatting of the ) Tj 0 0 .501961 rg (cmd) Tj T* 0 Tw 1.19561 Tw 0 0 0 rg (module; when invoked with the name of a command it displays the usage message for that command.) Tj T* 0 Tw 2.33686 Tw (The ) Tj /F3 10 Tf (.last_tb ) Tj /F1 10 Tf (command is useful when debugging: in case of errors, it allows you to display the) Tj T* 0 Tw (traceback of the last executed command.) Tj T* ET
-Q
-Q
-q
1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
@@ -9758,21 +9802,27 @@ Q
endstream
endobj
-% 'R372': class PDFStream
-372 0 obj
+% 'R376': class PDFStream
+376 0 obj
% page stream
-<< /Length 4010 >>
+<< /Length 4389 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 753.0236 cm
+1 0 0 1 62.69291 693.0236 cm
+q
+BT 1 0 0 1 0 62 Tm 1.567126 Tw 12 TL /F1 10 Tf 0 0 0 rg (When working with command containers, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (automatically adds two special commands to the set of) Tj T* 0 Tw 2.099213 Tw (provided commands: ) Tj /F3 10 Tf (help ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (.last_tb) Tj /F1 10 Tf (. The ) Tj /F3 10 Tf (help ) Tj /F1 10 Tf (command is the easier to understand: when) Tj T* 0 Tw .39811 Tw (invoked without arguments it displays the list of available commands with the same formatting of the ) Tj 0 0 .501961 rg (cmd) Tj T* 0 Tw 1.19561 Tw 0 0 0 rg (module; when invoked with the name of a command it displays the usage message for that command.) Tj T* 0 Tw 2.33686 Tw (The ) Tj /F3 10 Tf (.last_tb ) Tj /F1 10 Tf (command is useful when debugging: in case of errors, it allows you to display the) Tj T* 0 Tw (traceback of the last executed command.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 675.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is a session of usage on an Unix-like operating system:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 354.0679 cm
+1 0 0 1 62.69291 276.0679 cm
q
q
.773863 0 0 .773863 0 0 cm
@@ -9785,32 +9835,54 @@ q
n -6 -6 606 504 re B*
Q
q
-BT 1 0 0 1 0 482 Tm 12 TL /F3 10 Tf 0 0 0 rg ($ python ishelve2.py) Tj T* (A minimal interface over a shelve object.) Tj T* (Operating on /home/micheles/conf.shelve.) Tj T* (.help to see the available commands.) Tj T* (i) Tj (>) Tj ( .help) Tj T* T* (special commands) Tj T* (================) Tj T* (.help .last_tb) Tj T* T* (custom commands) Tj T* (===============) Tj T* (delete set show showall) Tj T* T* (i) Tj (>) Tj ( delete) Tj T* (deleting everything) Tj T* (i) Tj (>) Tj ( set a pippo) Tj T* (setting a=pippo) Tj T* (i) Tj (>) Tj ( set b lippo) Tj T* (setting b=lippo) Tj T* (i) Tj (>) Tj ( showall) Tj T* (b = lippo) Tj T* (a = pippo) Tj T* (i) Tj (>) Tj ( show a b) Tj T* (a = pippo) Tj T* (b = lippo) Tj T* (i) Tj (>) Tj ( del a) Tj T* (deleting a) Tj T* (i) Tj (>) Tj ( showall) Tj T* (b = lippo) Tj T* (i) Tj (>) Tj ( delete a) Tj T* (deleting a) Tj T* (KeyError: 'a') Tj T* (i) Tj (>) Tj ( .last_tb) Tj T* ( File "/usr/local/lib/python2.6/dist-packages/plac-0.6.0-py2.6.egg/plac_ext.py", line 190, in _wrap) Tj T* ( for value in genobj:) Tj T* ( File "./ishelve2.py", line 37, in delete) Tj T* ( del self.sh[name] # no error checking) Tj T* ( File "/usr/lib/python2.6/shelve.py", line 136, in __delitem__) Tj T* ( del self.dict[key]) Tj T* (i) Tj (>) Tj T* ET
+BT 1 0 0 1 0 482 Tm 12 TL /F3 10 Tf 0 0 0 rg ($ python ishelve2.py) Tj T* (A minimal interface over a shelve object.) Tj T* (Operating on /home/micheles/conf.shelve.) Tj T* (Use help to see the available commands.) Tj T* (i) Tj (>) Tj ( help) Tj T* T* (special commands) Tj T* (================) Tj T* (last_tb) Tj T* T* (custom commands) Tj T* (===============) Tj T* (delete set show showall) Tj T* T* (i) Tj (>) Tj ( delete) Tj T* (deleting everything) Tj T* (i) Tj (>) Tj ( set a pippo) Tj T* (setting a=pippo) Tj T* (i) Tj (>) Tj ( set b lippo) Tj T* (setting b=lippo) Tj T* (i) Tj (>) Tj ( showall) Tj T* (b = lippo) Tj T* (a = pippo) Tj T* (i) Tj (>) Tj ( show a b) Tj T* (a = pippo) Tj T* (b = lippo) Tj T* (i) Tj (>) Tj ( del a) Tj T* (deleting a) Tj T* (i) Tj (>) Tj ( showall) Tj T* (b = lippo) Tj T* (i) Tj (>) Tj ( delete a) Tj T* (deleting a) Tj T* (KeyError: 'a') Tj T* (i) Tj (>) Tj ( .last_tb) Tj T* ( File "/usr/local/lib/python2.6/dist-packages/plac-0.6.0-py2.6.egg/plac_ext.py", line 190, in _wrap) Tj T* ( for value in genobj:) Tj T* ( File "./ishelve2.py", line 37, in delete) Tj T* ( del self.sh[name] # no error checking) Tj T* ( File "/usr/lib/python2.6/shelve.py", line 136, in __delitem__) Tj T* ( del self.dict[key]) Tj T* (i) Tj (>) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 322.0679 cm
+1 0 0 1 62.69291 244.0679 cm
q
BT 1 0 0 1 0 14 Tm 2.571235 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that in interactive mode the traceback is hidden, unless you pass the ) Tj /F3 10 Tf (verbose ) Tj /F1 10 Tf (flag to the) Tj T* 0 Tw /F3 10 Tf (Interpreter.interact ) Tj /F1 10 Tf (method.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 292.0679 cm
+1 0 0 1 62.69291 142.0679 cm
+q
+BT 1 0 0 1 0 86 Tm .046098 Tw 12 TL /F1 10 Tf 0 0 0 rg (CHANGED IN VERSION 0.9: if you have an old version of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (the ) Tj /F3 10 Tf (help ) Tj /F1 10 Tf (command must be prefixed with) Tj T* 0 Tw 1.096303 Tw (a dot, i.e. you must write ) Tj /F3 10 Tf (.help) Tj /F1 10 Tf (. The old behavior was more consistent in my opinion, since it made it) Tj T* 0 Tw .416412 Tw (clear that the ) Tj /F3 10 Tf (help ) Tj /F1 10 Tf (command was special and threated differently from the regular commands. However) Tj T* 0 Tw .011654 Tw (many users complained against the dot, so I changed it to make them happy. Starting from release 0.9 the) Tj T* 0 Tw .077209 Tw /F3 10 Tf (help ) Tj /F1 10 Tf (command is just an alias for ) Tj /F3 10 Tf (--help) Tj /F1 10 Tf (, in the sense that there is a preprocessor step replacing ) Tj /F3 10 Tf (help) Tj T* 0 Tw 2.914985 Tw /F1 10 Tf (with ) Tj /F3 10 Tf (--help ) Tj /F1 10 Tf (in the argument list. Notice that if you implement a custom ) Tj /F3 10 Tf (help ) Tj /F1 10 Tf (command in the) Tj T* 0 Tw .299269 Tw (commander class the preprocessor will be automatically disabled: passing ) Tj /F3 10 Tf (help ) Tj /F1 10 Tf (will call the custom help) Tj T* 0 Tw (command, just as you would expect.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (26) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R377': class PDFStream
+377 0 obj
+% page stream
+<< /Length 4852 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 747.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (plac.Interpreter.call) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 250.0679 cm
+1 0 0 1 62.69291 705.0236 cm
q
BT 1 0 0 1 0 26 Tm .10104 Tw 12 TL /F1 10 Tf 0 0 0 rg (At the core of ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (there is the ) Tj /F3 10 Tf (call ) Tj /F1 10 Tf (function which invokes a callable with the list of arguments passed) Tj T* 0 Tw 1.238443 Tw (at the command-line \() Tj /F3 10 Tf (sys.argv[1:]) Tj /F1 10 Tf (\). Thanks to ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (you can launch your module by simply) Tj T* 0 Tw (adding the lines:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 204.8679 cm
+1 0 0 1 62.69291 659.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -9831,13 +9903,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 148.8679 cm
+1 0 0 1 62.69291 603.8236 cm
q
BT 1 0 0 1 0 38 Tm .50436 Tw 12 TL /F1 10 Tf 0 0 0 rg (Everything works fine if ) Tj /F3 10 Tf (main ) Tj /F1 10 Tf (is a simple callable performing some action; however, in many cases, one) Tj T* 0 Tw .087633 Tw (has a ) Tj /F3 10 Tf (main ) Tj /F1 10 Tf ("function" which is a actually a factory returning a command container object. For instance, in) Tj T* 0 Tw .573318 Tw (my second shelve example the main function is the class ) Tj /F3 10 Tf (ShelveInterface) Tj /F1 10 Tf (, and the two lines needed) Tj T* 0 Tw (to run the module are a bit ugly:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 103.6679 cm
+1 0 0 1 62.69291 558.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -9858,29 +9930,13 @@ Q
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (26) Tj T* -235.3849 0 Td ET
-Q
-Q
-
-endstream
-endobj
-% 'R373': class PDFStream
-373 0 obj
-% page stream
-<< /Length 4449 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 669.0236 cm
+1 0 0 1 62.69291 454.6236 cm
q
BT 1 0 0 1 0 86 Tm .873988 Tw 12 TL /F1 10 Tf 0 0 0 rg (Moreover, now the program runs, but only in interactive mode, i.e. it is not possible to run it as a script.) Tj T* 0 Tw .097882 Tw (Instead, it would be nice to be able to specify the command to execute on the command-line and have the) Tj T* 0 Tw 4.08229 Tw (interpreter start, execute the command and finish properly \(I mean by calling ) Tj /F3 10 Tf (__enter__ ) Tj /F1 10 Tf (and) Tj T* 0 Tw .100574 Tw /F3 10 Tf (__exit__) Tj /F1 10 Tf (\) without needing user input. Then the script could be called from a batch shell script working in) Tj T* 0 Tw 2.26816 Tw (the background. In order to provide such functionality ) Tj /F3 10 Tf (plac.Interpreter ) Tj /F1 10 Tf (provides a classmethod) Tj T* 0 Tw 1.173318 Tw (named ) Tj /F3 10 Tf (.call ) Tj /F1 10 Tf (which takes the factory, instantiates it with the arguments read from the command line,) Tj T* 0 Tw 1.517045 Tw (wraps the resulting container object as an interpreter and runs it with the rest arguments found in the) Tj T* 0 Tw (command line. Here is the code to turn the ) Tj /F3 10 Tf (ShelveInterface ) Tj /F1 10 Tf (into a script) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 587.8236 cm
+1 0 0 1 62.69291 373.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -9901,14 +9957,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 567.8236 cm
+1 0 0 1 62.69291 353.4236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (and here are a few examples of usage:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 354.6236 cm
+1 0 0 1 62.69291 140.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -9929,13 +9985,29 @@ Q
Q
Q
q
-1 0 0 1 62.69291 322.6236 cm
+1 0 0 1 62.69291 108.2236 cm
q
BT 1 0 0 1 0 14 Tm .079989 Tw 12 TL /F1 10 Tf 0 0 0 rg (If you pass the ) Tj /F3 10 Tf (-i ) Tj /F1 10 Tf (flag in the command line, then the script will enter in interactive mode and ask the user) Tj T* 0 Tw (for the commands to execute:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 229.4236 cm
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (27) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R378': class PDFStream
+378 0 obj
+% page stream
+<< /Length 4660 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 679.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -9948,26 +10020,26 @@ q
n -6 -6 468.6898 84 re B*
Q
q
-BT 1 0 0 1 0 62 Tm 12 TL /F3 10 Tf 0 0 0 rg ($ python ishelve3.py -i) Tj T* (A minimal interface over a shelve object.) Tj T* (Operating on /home/micheles/conf.shelve.) Tj T* (.help to see the available commands.) Tj T* T* (i) Tj (>) Tj T* ET
+BT 1 0 0 1 0 62 Tm 12 TL /F3 10 Tf 0 0 0 rg ($ python ishelve3.py -i) Tj T* (A minimal interface over a shelve object.) Tj T* (Operating on /home/micheles/conf.shelve.) Tj T* (Use help to see the available commands.) Tj T* T* (i) Tj (>) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 185.4236 cm
+1 0 0 1 62.69291 635.8236 cm
q
BT 1 0 0 1 0 26 Tm .221417 Tw 12 TL /F1 10 Tf 0 0 0 rg (In a sense, I have closed the circle: at the beginning of this document I discussed how to turn a script into) Tj T* 0 Tw .784147 Tw (an interactive application \(the ) Tj /F3 10 Tf (shelve_interpreter.py ) Tj /F1 10 Tf (example\), whereas here I have show how to) Tj T* 0 Tw (turn an interactive application into a script.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 167.4236 cm
+1 0 0 1 62.69291 617.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The complete signature of ) Tj /F3 10 Tf (plac.Interpreter.call ) Tj /F1 10 Tf (is the following:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 110.2236 cm
+1 0 0 1 62.69291 560.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -9987,68 +10059,88 @@ Q
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
+1 0 0 1 62.69291 480.6236 cm
q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (27) Tj T* -235.3849 0 Td ET
+BT 1 0 0 1 0 62 Tm 1.756651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The factory must have a fixed number of positional arguments \(no default arguments, no varargs, no) Tj T* 0 Tw 1.87881 Tw (kwargs\), otherwise a ) Tj /F3 10 Tf (TypeError ) Tj /F1 10 Tf (is raised: the reason is that we want to be able to distinguish the) Tj T* 0 Tw .829984 Tw (command-line arguments needed to instantiate the factory from the rest arguments that must be sent to) Tj T* 0 Tw 2.609984 Tw (the corresponding interpreter object. It is also possible to specify a list of arguments different from) Tj T* 0 Tw .513318 Tw /F3 10 Tf (sys.argv[1:] ) Tj /F1 10 Tf (\(useful in tests\), the character to be recognized as a comment, the splitting function, the) Tj T* 0 Tw (input source and the prompt to use while in interactive mode, and a verbose flag.) Tj T* ET
Q
Q
-
-endstream
-endobj
-% 'R374': class PDFStream
-374 0 obj
-% page stream
-<< /Length 4955 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 693.0236 cm
+1 0 0 1 62.69291 450.6236 cm
q
-BT 1 0 0 1 0 62 Tm 1.756651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The factory must have a fixed number of positional arguments \(no default arguments, no varargs, no) Tj T* 0 Tw 1.87881 Tw (kwargs\), otherwise a ) Tj /F3 10 Tf (TypeError ) Tj /F1 10 Tf (is raised: the reason is that we want to be able to distinguish the) Tj T* 0 Tw .829984 Tw (command-line arguments needed to instantiate the factory from the rest arguments that must be sent to) Tj T* 0 Tw 2.609984 Tw (the corresponding interpreter object. It is also possible to specify a list of arguments different from) Tj T* 0 Tw .513318 Tw /F3 10 Tf (sys.argv[1:] ) Tj /F1 10 Tf (\(useful in tests\), the character to be recognized as a comment, the splitting function, the) Tj T* 0 Tw (input source and the prompt to use while in interactive mode, and a verbose flag.) Tj T* ET
+BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Readline support) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 663.0236 cm
+1 0 0 1 62.69291 372.6236 cm
q
-BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Readline support) Tj T* ET
+BT 1 0 0 1 0 62 Tm 1.022485 Tw 12 TL /F1 10 Tf 0 0 0 rg (Starting from release 0.6 ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (offers full readline support. That means that if your Python was compiled) Tj T* 0 Tw 2.120697 Tw (with readline support you get autocompletion and persistent command history for free. By default all) Tj T* 0 Tw .144104 Tw (commands are autocomplete in a case sensitive way. If you want to add new words to the autocompletion) Tj T* 0 Tw .116488 Tw (set, or you want to change the location of the ) Tj /F3 10 Tf (.history ) Tj /F1 10 Tf (file, or to change the case sensitivity, the way to) Tj T* 0 Tw .18436 Tw (go is to pass a ) Tj /F3 10 Tf (plac.ReadlineInput ) Tj /F1 10 Tf (object to the interpreter. Here is an example, assuming you want) Tj T* 0 Tw (to build a database interface understanding SQL commands:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 585.0236 cm
+1 0 0 1 62.69291 99.42362 cm
q
-BT 1 0 0 1 0 62 Tm 1.022485 Tw 12 TL /F1 10 Tf 0 0 0 rg (Starting from release 0.6 ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (offers full readline support. That means that if your Python was compiled) Tj T* 0 Tw 2.120697 Tw (with readline support you get autocompletion and persistent command history for free. By default all) Tj T* 0 Tw .144104 Tw (commands are autocomplete in a case sensitive way. If you want to add new words to the autocompletion) Tj T* 0 Tw .116488 Tw (set, or you want to change the location of the ) Tj /F3 10 Tf (.history ) Tj /F1 10 Tf (file, or to change the case sensitivity, the way to) Tj T* 0 Tw .18436 Tw (go is to pass a ) Tj /F3 10 Tf (plac.ReadlineInput ) Tj /F1 10 Tf (object to the interpreter. Here is an example, assuming you want) Tj T* 0 Tw (to build a database interface understanding SQL commands:) Tj T* ET
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 264 re B*
+Q
+q
+BT 1 0 0 1 0 242 Tm 12 TL /F3 10 Tf 0 0 0 rg (import os, plac) Tj T* (from sqlalchemy.ext.sqlsoup import SqlSoup) Tj T* T* (SQLKEYWORDS = set\(['help', 'select', 'from', ) Tj T* ( 'inner', 'join', 'outer', 'left', 'right']) Tj T* ( \) # and many others) Tj T* (DBTABLES = set\(['table1', 'table2']\) # you can read them from the db schema) Tj T* T* (COMPLETIONS = SQLKEYWORDS | DBTABLES) Tj T* T* (class SqlInterface\(object\):) Tj T* ( commands = ['SELECT']) Tj T* ( def __init__\(self, dsn\):) Tj T* ( self.soup = SqlSoup\(dsn\)) Tj T* ( def SELECT\(self, argstring\):) Tj T* ( sql = 'SELECT ' + argstring) Tj T* ( for row in self.soup.bind.execute\(sql\):) Tj T* ( yield str\(row\) # the formatting can be much improved) Tj T* T* (rl_input = plac.ReadlineInput\() Tj T* ( COMPLETIONS, histfile=os.path.expanduser\('~/.sql_interface.history'\), ) Tj T* ET
+Q
+Q
+Q
Q
Q
q
-1 0 0 1 62.69291 240.2307 cm
+1 0 0 1 56.69291 56.69291 cm
q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (28) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R379': class PDFStream
+379 0 obj
+% page stream
+<< /Length 4519 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-.96447 0 0 .96447 0 0 cm
+1 0 0 1 62.69291 655.8236 cm
q
-1 0 0 1 6.6 6.843137 cm
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 486 348 re B*
+n -6 -6 468.6898 108 re B*
Q
q
-BT 1 0 0 1 0 326 Tm 12 TL /F3 10 Tf 0 0 0 rg (import os, plac) Tj T* (from sqlalchemy.ext.sqlsoup import SqlSoup) Tj T* T* (SQLKEYWORDS = set\(['select', 'from', 'inner', 'join', 'outer', 'left', 'right']) Tj T* ( \) # and many others) Tj T* (DBTABLES = set\(['table1', 'table2']\) # you can read them from the db schema) Tj T* T* (COMPLETIONS = SQLKEYWORDS | DBTABLES) Tj T* T* (class SqlInterface\(object\):) Tj T* ( commands = ['SELECT']) Tj T* ( def __init__\(self, dsn\):) Tj T* ( self.soup = SqlSoup\(dsn\)) Tj T* ( def SELECT\(self, argstring\):) Tj T* ( sql = 'SELECT ' + argstring) Tj T* ( for row in self.soup.bind.execute\(sql\):) Tj T* ( yield str\(row\) # the formatting can be much improved) Tj T* T* (rl_input = plac.ReadlineInput\() Tj T* ( COMPLETIONS, histfile=os.path.expanduser\('~/.sql_interface.history'\), ) Tj T* ( case_sensitive=False\)) Tj T* T* (def split_on_first_space\(line, commentchar\):) Tj T* ( return line.strip\(\).split\(' ', 1\) # ignoring comments) Tj T* ( ) Tj T* (if __name__ == '__main__':) Tj T* ( plac.Interpreter.call\(SqlInterface, split=split_on_first_space,) Tj T* ( stdin=rl_input, prompt='sql) Tj (>) Tj ( '\)) Tj T* ET
+BT 1 0 0 1 0 86 Tm 12 TL /F3 10 Tf 0 0 0 rg ( case_sensitive=False\)) Tj T* T* (def split_on_first_space\(line, commentchar\):) Tj T* ( return line.strip\(\).split\(' ', 1\) # ignoring comments) Tj T* ( ) Tj T* (if __name__ == '__main__':) Tj T* ( plac.Interpreter.call\(SqlInterface, split=split_on_first_space,) Tj T* ( stdin=rl_input, prompt='sql) Tj (>) Tj ( '\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 220.2307 cm
+1 0 0 1 62.69291 635.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is an example of usage:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 163.0307 cm
+1 0 0 1 62.69291 578.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -10068,48 +10160,61 @@ Q
Q
Q
q
-1 0 0 1 62.69291 95.03071 cm
+1 0 0 1 62.69291 498.6236 cm
q
-BT 1 0 0 1 0 50 Tm 1.951318 Tw 12 TL /F1 10 Tf 0 0 0 rg (You can check that entering just ) Tj /F3 10 Tf (sel ) Tj /F1 10 Tf (and pressing TAB the readline library completes the ) Tj /F3 10 Tf (SELECT ) Tj T* 0 Tw .797356 Tw /F1 10 Tf (keyword for you and makes it upper case; idem for ) Tj /F3 10 Tf (FROM) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (INNER) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (JOIN ) Tj /F1 10 Tf (and even for the names of the ) Tj T* 0 Tw .256235 Tw (tables. An obvious improvement is to read the names of the tables by introspecting the database: actually ) Tj T* 0 Tw 1.616654 Tw (you can even read the names of the views and of the columns, and have full autocompletion. All the ) Tj T* 0 Tw 2.047251 Tw (entered commands and recorded and saved in the file ) Tj /F3 10 Tf (~/.sql_interface.history ) Tj /F1 10 Tf (when exiting) Tj T* 0 Tw ET
+BT 1 0 0 1 0 62 Tm 1.951318 Tw 12 TL /F1 10 Tf 0 0 0 rg (You can check that entering just ) Tj /F3 10 Tf (sel ) Tj /F1 10 Tf (and pressing TAB the readline library completes the ) Tj /F3 10 Tf (SELECT) Tj T* 0 Tw .797356 Tw /F1 10 Tf (keyword for you and makes it upper case; idem for ) Tj /F3 10 Tf (FROM) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (INNER) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (JOIN ) Tj /F1 10 Tf (and even for the names of the) Tj T* 0 Tw .256235 Tw (tables. An obvious improvement is to read the names of the tables by introspecting the database: actually) Tj T* 0 Tw 1.616654 Tw (you can even read the names of the views and of the columns, and have full autocompletion. All the) Tj T* 0 Tw 2.047251 Tw (entered commands and recorded and saved in the file ) Tj /F3 10 Tf (~/.sql_interface.history ) Tj /F1 10 Tf (when exiting) Tj T* 0 Tw (from the command-line interface.) Tj T* ET
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
+1 0 0 1 62.69291 420.6236 cm
q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (28) Tj T* -235.3849 0 Td ET
+BT 1 0 0 1 0 62 Tm 2.010574 Tw 12 TL /F1 10 Tf 0 0 0 rg (If the readline library is not available, my suggestion is to use the ) Tj 0 0 .501961 rg (rlwrap ) Tj 0 0 0 rg (tool which provides similar) Tj T* 0 Tw .22561 Tw (features, at least on Unix-like platforms. ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (should also work fine on Windows with the ) Tj 0 0 .501961 rg (pyreadline ) Tj 0 0 0 rg (library) Tj T* 0 Tw .389989 Tw (\(I do not use Windows, so this part is very little tested: I tried it only once and it worked, but your mileage) Tj T* 0 Tw 2.206457 Tw (may vary\). For people worried about licenses, I will notice that ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (uses the readline library only if) Tj T* 0 Tw .591894 Tw (available, it does not include it and it does not rely on it in any fundamental way, so that the ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (licence) Tj T* 0 Tw (does not need to be the GPL \(actually it is a BSD do-whatever-you-want-with-it licence\).) Tj T* ET
Q
Q
-
-endstream
-endobj
-% 'R375': class PDFStream
-375 0 obj
-% page stream
-<< /Length 4218 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 753.0236 cm
+1 0 0 1 62.69291 378.6236 cm
q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (from the command-line interface.) Tj T* ET
+BT 1 0 0 1 0 26 Tm .187882 Tw 12 TL /F1 10 Tf 0 0 0 rg (The interactive mode of ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (can be used as a replacement of the ) Tj 0 0 .501961 rg (cmd ) Tj 0 0 0 rg (module in the standard library. It) Tj T* 0 Tw 3.130651 Tw (is actually better than ) Tj 0 0 .501961 rg (cmd) Tj 0 0 0 rg (: for instance, the ) Tj /F3 10 Tf (help ) Tj /F1 10 Tf (command is more powerful, since it provides) Tj T* 0 Tw (information about the arguments accepted by the given command:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 675.0236 cm
+1 0 0 1 62.69291 93.42362 cm
q
-BT 1 0 0 1 0 62 Tm 2.010574 Tw 12 TL /F1 10 Tf 0 0 0 rg (If the readline library is not available, my suggestion is to use the ) Tj 0 0 .501961 rg (rlwrap ) Tj 0 0 0 rg (tool which provides similar) Tj T* 0 Tw .22561 Tw (features, at least on Unix-like platforms. ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (should also work fine on Windows with the ) Tj 0 0 .501961 rg (pyreadline ) Tj 0 0 0 rg (library) Tj T* 0 Tw .389989 Tw (\(I do not use Windows, so this part is very little tested: I tried it only once and it worked, but your mileage) Tj T* 0 Tw 2.206457 Tw (may vary\). For people worried about licenses, I will notice that ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (uses the readline library only if) Tj T* 0 Tw .591894 Tw (available, it does not include it and it does not rely on it in any fundamental way, so that the ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (licence) Tj T* 0 Tw (does not need to be the GPL \(actually it is a BSD do-whatever-you-want-with-it licence\).) Tj T* ET
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 276 re B*
+Q
+q
+BT 1 0 0 1 0 254 Tm 12 TL /F3 10 Tf 0 0 0 rg (i) Tj (>) Tj ( help set) Tj T* (usage: set name value) Tj T* T* (set name value) Tj T* T* (positional arguments:) Tj T* ( name) Tj T* ( value) Tj T* T* (i) Tj (>) Tj ( help delete) Tj T* (usage: delete [name]) Tj T* T* (delete given parameter \(or everything\)) Tj T* T* (positional arguments:) Tj T* ( name [None]) Tj T* T* (i) Tj (>) Tj ( help show) Tj T* (usage: show [names [names ...]]) Tj T* T* (show given parameters) Tj T* T* ET
+Q
+Q
+Q
Q
Q
q
-1 0 0 1 62.69291 633.0236 cm
+1 0 0 1 56.69291 56.69291 cm
q
-BT 1 0 0 1 0 26 Tm .187882 Tw 12 TL /F1 10 Tf 0 0 0 rg (The interactive mode of ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (can be used as a replacement of the ) Tj 0 0 .501961 rg (cmd ) Tj 0 0 0 rg (module in the standard library. It) Tj T* 0 Tw 2.730651 Tw (is actually better than ) Tj 0 0 .501961 rg (cmd) Tj 0 0 0 rg (: for instance, the ) Tj /F3 10 Tf (.help ) Tj /F1 10 Tf (command is more powerful, since it provides) Tj T* 0 Tw (information about the arguments accepted by the given command:) Tj T* ET
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (29) Tj T* -235.3849 0 Td ET
Q
Q
+
+endstream
+endobj
+% 'R380': class PDFStream
+380 0 obj
+% page stream
+<< /Length 5976 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 323.8236 cm
+1 0 0 1 62.69291 727.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -10119,35 +10224,35 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 300 re B*
+n -6 -6 468.6898 36 re B*
Q
q
-BT 1 0 0 1 0 278 Tm 12 TL /F3 10 Tf 0 0 0 rg (i) Tj (>) Tj ( .help set) Tj T* (usage: set name value) Tj T* T* (set name value) Tj T* T* (positional arguments:) Tj T* ( name) Tj T* ( value) Tj T* T* (i) Tj (>) Tj ( .help delete) Tj T* (usage: delete [name]) Tj T* T* (delete given parameter \(or everything\)) Tj T* T* (positional arguments:) Tj T* ( name) Tj T* T* (i) Tj (>) Tj ( .help show) Tj T* (usage: show [names [names ...]]) Tj T* T* (show given parameters) Tj T* T* (positional arguments:) Tj T* ( names) Tj T* ET
+BT 1 0 0 1 0 14 Tm 12 TL /F3 10 Tf 0 0 0 rg (positional arguments:) Tj T* ( names) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 267.8236 cm
+1 0 0 1 62.69291 671.8236 cm
q
BT 1 0 0 1 0 38 Tm 1.959985 Tw 12 TL /F1 10 Tf 0 0 0 rg (As you can imagine, the help message is provided by the underlying ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (subparser \(there is a) Tj T* 0 Tw 2.954524 Tw (subparser for each command\). ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (commands accept options, flags, varargs, keyword arguments,) Tj T* 0 Tw .719318 Tw (arguments with defaults, arguments with a fixed number of choices, type conversion and all the features) Tj T* 0 Tw (provided of ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (which should be reimplemented from scratch using ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 237.8236 cm
+1 0 0 1 62.69291 641.8236 cm
q
BT 1 0 0 1 0 14 Tm 1.78248 Tw 12 TL /F1 10 Tf 0 0 0 rg (Moreover at the moment ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (also understands command abbreviations. However, this feature may) Tj T* 0 Tw (disappear in future releases. It was meaningful in the past, when ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (did not support readline.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 219.8236 cm
+1 0 0 1 62.69291 623.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Notice that if an abbreviation is ambiguous, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (warns you:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 174.6236 cm
+1 0 0 1 62.69291 578.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -10167,41 +10272,25 @@ Q
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (29) Tj T* -235.3849 0 Td ET
-Q
-Q
-
-endstream
-endobj
-% 'R376': class PDFStream
-376 0 obj
-% page stream
-<< /Length 4958 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 747.0236 cm
+1 0 0 1 62.69291 548.6236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (The plac runner) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 681.0236 cm
+1 0 0 1 62.69291 482.6236 cm
q
BT 1 0 0 1 0 50 Tm 1.531318 Tw 12 TL /F1 10 Tf 0 0 0 rg (The distribution of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (includes a runner script named ) Tj /F3 10 Tf (plac_runner.py) Tj /F1 10 Tf (, which will be installed in a) Tj T* 0 Tw .44748 Tw (suitable directory in your system by ) Tj 0 0 .501961 rg (distutils ) Tj 0 0 0 rg (\(say in ) Tj /F3 10 Tf (\\usr\\local\\bin\\plac_runner.py ) Tj /F1 10 Tf (in a Unix-like) Tj T* 0 Tw .680651 Tw (operative system\). The runner provides many facilities to run ) Tj /F3 10 Tf (.plac ) Tj /F1 10 Tf (scripts and ) Tj /F3 10 Tf (.placet ) Tj /F1 10 Tf (files, as well) Tj T* 0 Tw 1.47311 Tw (as Python modules containg a ) Tj /F3 10 Tf (main ) Tj /F1 10 Tf (object, which can be a function, a command container object or) Tj T* 0 Tw (even a command container class.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 651.0236 cm
+1 0 0 1 62.69291 452.6236 cm
q
BT 1 0 0 1 0 14 Tm 1.994269 Tw 12 TL /F1 10 Tf 0 0 0 rg (For instance, suppose you want to execute a script containing commands defined in the ) Tj /F3 10 Tf (ishelve2) Tj T* 0 Tw /F1 10 Tf (module like the following one:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 581.8236 cm
+1 0 0 1 62.69291 383.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -10222,13 +10311,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 513.8236 cm
+1 0 0 1 62.69291 315.4236 cm
q
BT 1 0 0 1 0 50 Tm .575868 Tw 12 TL /F1 10 Tf 0 0 0 rg (The first line of the ) Tj /F3 10 Tf (.plac ) Tj /F1 10 Tf (script contains the name of the python module containing the plac interpreter) Tj T* 0 Tw 2.327209 Tw (and the arguments which must be passed to its main function in order to be able to instantiate an) Tj T* 0 Tw .202485 Tw (interpreter object. In this case I appended ) Tj /F3 10 Tf (:ShelveInterface ) Tj /F1 10 Tf (to the name of the module to specify the) Tj T* 0 Tw 1.030574 Tw (object that must be imported: if not specified, by default the object named 'main' is imported. The other) Tj T* 0 Tw (lines contains commands. You can run the script as follows:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 424.6505 cm
+1 0 0 1 62.69291 226.2505 cm
q
q
.952737 0 0 .952737 0 0 cm
@@ -10249,24 +10338,24 @@ Q
Q
Q
q
-1 0 0 1 62.69291 392.6505 cm
+1 0 0 1 62.69291 194.2505 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 2.79186 Tw (The last command intentionally contained an error, to show that the plac runner does not eat the) Tj T* 0 Tw (traceback.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 362.6505 cm
+1 0 0 1 62.69291 164.2505 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .437633 Tw (The runner can also be used to run Python modules in interactive mode and non-interactive mode. If you) Tj T* 0 Tw (put this alias in your bashrc) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 356.6505 cm
+1 0 0 1 62.69291 158.2505 cm
Q
q
-1 0 0 1 62.69291 344.6505 cm
+1 0 0 1 62.69291 146.2505 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -10281,16 +10370,32 @@ q
Q
Q
q
-1 0 0 1 62.69291 344.6505 cm
+1 0 0 1 62.69291 146.2505 cm
Q
q
-1 0 0 1 62.69291 314.6505 cm
+1 0 0 1 62.69291 116.2505 cm
q
BT 1 0 0 1 0 14 Tm 2.955318 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(or you define a suitable ) Tj /F3 10 Tf (plac.bat ) Tj /F1 10 Tf (script in Windows\) you can run the ) Tj /F3 10 Tf (ishelve2.py ) Tj /F1 10 Tf (script in) Tj T* 0 Tw (interactive mode as follows:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 137.4505 cm
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (30) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R381': class PDFStream
+381 0 obj
+% page stream
+<< /Length 4819 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 595.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -10310,29 +10415,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 117.4505 cm
+1 0 0 1 62.69291 575.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Now you can cut and paste the interactive session an turns into into a ) Tj /F3 10 Tf (.placet ) Tj /F1 10 Tf (file like the following:) Tj T* ET
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (30) Tj T* -235.3849 0 Td ET
-Q
-Q
-
-endstream
-endobj
-% 'R377': class PDFStream
-377 0 obj
-% page stream
-<< /Length 5435 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 643.8236 cm
+1 0 0 1 62.69291 446.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -10352,20 +10441,20 @@ Q
Q
Q
q
-1 0 0 1 62.69291 611.8236 cm
+1 0 0 1 62.69291 414.6236 cm
q
BT 1 0 0 1 0 14 Tm 2.145697 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that the first line specifies a test database ) Tj /F3 10 Tf (~/test.shelve) Tj /F1 10 Tf (, to avoid clobbering your default) Tj T* 0 Tw (shelve. If you mispell the arguments in the first line plac will give you an ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (error message \(just try\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 593.8236 cm
+1 0 0 1 62.69291 396.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (You can run placets following the shebang convention directly with the plac runner:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 548.6236 cm
+1 0 0 1 62.69291 351.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -10386,19 +10475,19 @@ Q
Q
Q
q
-1 0 0 1 62.69291 504.6236 cm
+1 0 0 1 62.69291 307.4236 cm
q
BT 1 0 0 1 0 26 Tm .32104 Tw 12 TL /F1 10 Tf 0 0 0 rg (If you want to see the output of the tests, pass the ) Tj /F3 10 Tf (-v/--verbose ) Tj /F1 10 Tf (flag. Notice that he runner ignore the) Tj T* 0 Tw .24856 Tw (extension, so you can actually use any extension your like, but ) Tj /F4 10 Tf (it relies on the first line of the file to invoke) Tj T* 0 Tw (the corresponding plac tool with the given arguments) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 474.6236 cm
+1 0 0 1 62.69291 277.4236 cm
q
BT 1 0 0 1 0 14 Tm .537209 Tw 12 TL /F1 10 Tf 0 0 0 rg (The plac runner does not provide any test discovery facility, but you can use standard Unix tools to help.) Tj T* 0 Tw (For instance, you can run all the ) Tj /F3 10 Tf (.placet ) Tj /F1 10 Tf (files into a directory and its subdirectories as follows:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 441.4236 cm
+1 0 0 1 62.69291 244.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -10419,23 +10508,23 @@ Q
Q
Q
q
-1 0 0 1 62.69291 409.4236 cm
+1 0 0 1 62.69291 212.2236 cm
q
BT 1 0 0 1 0 14 Tm .760988 Tw 12 TL /F1 10 Tf 0 0 0 rg (The plac runner expects the main function of your script to return a plac tool, i.e. a function or an object) Tj T* 0 Tw (with a ) Tj /F3 10 Tf (.commands ) Tj /F1 10 Tf (attribute. It this is not the case the runner gracefully exits.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 391.4236 cm
+1 0 0 1 62.69291 194.2236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (It also works in non-interactive mode, if you call it as) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 385.4236 cm
+1 0 0 1 62.69291 188.2236 cm
Q
q
-1 0 0 1 62.69291 373.4236 cm
+1 0 0 1 62.69291 176.2236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -10450,17 +10539,17 @@ q
Q
Q
q
-1 0 0 1 62.69291 373.4236 cm
+1 0 0 1 62.69291 176.2236 cm
Q
q
-1 0 0 1 62.69291 355.4236 cm
+1 0 0 1 62.69291 158.2236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is an example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 286.2236 cm
+1 0 0 1 62.69291 89.02362 cm
q
q
1 0 0 1 0 0 cm
@@ -10481,69 +10570,48 @@ Q
Q
Q
q
-1 0 0 1 62.69291 254.2236 cm
-q
-BT 1 0 0 1 0 14 Tm .01561 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that in non-interactive mode the runner just invokes ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (on the ) Tj /F3 10 Tf (main ) Tj /F1 10 Tf (object of the Python) Tj T* 0 Tw (module.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 224.2236 cm
+1 0 0 1 56.69291 56.69291 cm
q
-BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (A non class-based example) Tj T* ET
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (31) Tj T* -235.3849 0 Td ET
Q
Q
+
+endstream
+endobj
+% 'R382': class PDFStream
+382 0 obj
+% page stream
+<< /Length 3928 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 182.2236 cm
+1 0 0 1 62.69291 741.0236 cm
q
-BT 1 0 0 1 0 26 Tm .907209 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (does not force you to use classes to define command containers. Even a simple function can be a) Tj T* 0 Tw 1.796651 Tw (valid command container, it is enough to add to it a ) Tj /F3 10 Tf (.commands ) Tj /F1 10 Tf (attribute and possibly ) Tj /F3 10 Tf (__enter__) Tj T* 0 Tw /F1 10 Tf (and/or ) Tj /F3 10 Tf (__exit__ ) Tj /F1 10 Tf (attributes.) Tj T* ET
+BT 1 0 0 1 0 14 Tm .01561 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that in non-interactive mode the runner just invokes ) Tj /F3 10 Tf (plac.call ) Tj /F1 10 Tf (on the ) Tj /F3 10 Tf (main ) Tj /F1 10 Tf (object of the Python) Tj T* 0 Tw (module.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 152.2236 cm
+1 0 0 1 62.69291 711.0236 cm
q
-0 0 0 rg
-BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .327485 Tw (In particular, a Python module is a perfect container of commands. As an example, consider the following) Tj T* 0 Tw (module implementing a fake Version Control System:) Tj T* ET
+BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (A non class-based example) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 95.02362 cm
-q
-q
-1 0 0 1 0 0 cm
-q
-1 0 0 1 6.6 6.6 cm
-q
-.662745 .662745 .662745 RG
-.5 w
-.960784 .960784 .862745 rg
-n -6 -6 468.6898 48 re B*
-Q
+1 0 0 1 62.69291 669.0236 cm
q
-0 0 0 rg
-BT 1 0 0 1 0 26 Tm /F3 10 Tf 12 TL ("A Fake Version Control System") Tj T* T* (import plac) Tj T* ET
-Q
-Q
-Q
+BT 1 0 0 1 0 26 Tm .907209 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (does not force you to use classes to define command containers. Even a simple function can be a) Tj T* 0 Tw 1.796651 Tw (valid command container, it is enough to add to it a ) Tj /F3 10 Tf (.commands ) Tj /F1 10 Tf (attribute and possibly ) Tj /F3 10 Tf (__enter__) Tj T* 0 Tw /F1 10 Tf (and/or ) Tj /F3 10 Tf (__exit__ ) Tj /F1 10 Tf (attributes.) Tj T* ET
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
+1 0 0 1 62.69291 639.0236 cm
q
0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (31) Tj T* -235.3849 0 Td ET
+BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .327485 Tw (In particular, a Python module is a perfect container of commands. As an example, consider the following) Tj T* 0 Tw (module implementing a fake Version Control System:) Tj T* ET
Q
Q
-
-endstream
-endobj
-% 'R378': class PDFStream
-378 0 obj
-% page stream
-<< /Length 3468 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 427.8236 cm
+1 0 0 1 62.69291 257.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -10553,30 +10621,30 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 336 re B*
+n -6 -6 468.6898 372 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 314 Tm /F3 10 Tf 12 TL T* (commands = 'checkout', 'commit', 'status') Tj T* T* (@plac.annotations\(url='url of the source code'\)) Tj T* (def checkout\(url\):) Tj T* ( "A fake checkout command") Tj T* ( return \('checkout ', url\)) Tj T* T* (@plac.annotations\(message=\('commit message', 'option'\)\)) Tj T* (def commit\(message\):) Tj T* ( "A fake commit command") Tj T* ( return \('commit ', message\)) Tj T* T* (@plac.annotations\(quiet=\('summary information', 'flag', 'q'\)\)) Tj T* (def status\(quiet\):) Tj T* ( "A fake status command") Tj T* ( return \('status ', quiet\)) Tj T* T* (def __missing__\(name\):) Tj T* ( return 'Command %r does not exist' % name) Tj T* T* (def __exit__\(etype, exc, tb\):) Tj T* ( "Will be called automatically at the end of the call/cmdloop") Tj T* ( if etype in \(None, GeneratorExit\): # success) Tj T* ( print\('ok'\)) Tj T* T* (main = __import__\(__name__\) # the module imports itself!) Tj T* ET
+BT 1 0 0 1 0 350 Tm /F3 10 Tf 12 TL ("A Fake Version Control System") Tj T* T* (import plac) Tj T* T* (commands = 'checkout', 'commit', 'status') Tj T* T* (@plac.annotations\(url='url of the source code'\)) Tj T* (def checkout\(url\):) Tj T* ( "A fake checkout command") Tj T* ( return \('checkout ', url\)) Tj T* T* (@plac.annotations\(message=\('commit message', 'option'\)\)) Tj T* (def commit\(message\):) Tj T* ( "A fake commit command") Tj T* ( return \('commit ', message\)) Tj T* T* (@plac.annotations\(quiet=\('summary information', 'flag', 'q'\)\)) Tj T* (def status\(quiet\):) Tj T* ( "A fake status command") Tj T* ( return \('status ', quiet\)) Tj T* T* (def __missing__\(name\):) Tj T* ( return 'Command %r does not exist' % name) Tj T* T* (def __exit__\(etype, exc, tb\):) Tj T* ( "Will be called automatically at the end of the call/cmdloop") Tj T* ( if etype in \(None, GeneratorExit\): # success) Tj T* ( print\('ok'\)) Tj T* T* (main = __import__\(__name__\) # the module imports itself!) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 383.8236 cm
+1 0 0 1 62.69291 213.8236 cm
q
BT 1 0 0 1 0 26 Tm .431318 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that I have defined both an ) Tj /F3 10 Tf (__exit__ ) Tj /F1 10 Tf (hook and a ) Tj /F3 10 Tf (__missing__ ) Tj /F1 10 Tf (hook, invoked for non-existing) Tj T* 0 Tw .592651 Tw (commands. The real trick here is the line ) Tj /F3 10 Tf (main = __import__\(__name__\)) Tj /F1 10 Tf (, which define ) Tj /F3 10 Tf (main ) Tj /F1 10 Tf (to be) Tj T* 0 Tw (an alias for the current module.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 353.8236 cm
+1 0 0 1 62.69291 183.8236 cm
q
BT 1 0 0 1 0 14 Tm 1.259986 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf (vcs ) Tj /F1 10 Tf (module does not contain an ) Tj /F3 10 Tf (if __name__ == '__main__' ) Tj /F1 10 Tf (block, but you can still run it) Tj T* 0 Tw (through the plac runner \(try ) Tj /F3 10 Tf (plac vcs.py -h) Tj /F1 10 Tf (\):) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 188.6236 cm
+1 0 0 1 62.69291 90.62362 cm
q
q
1 0 0 1 0 0 cm
@@ -10586,24 +10654,34 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 156 re B*
+n -6 -6 468.6898 84 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 134 Tm /F3 10 Tf 12 TL (usage: plac_runner.py vcs.py [-h] {status,commit,checkout} ...) Tj T* T* (A Fake Version Control System) Tj T* T* (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* T* (subcommands:) Tj T* ( {status,commit,checkout}) Tj T* ( checkout A fake checkout command) Tj T* ( commit A fake commit command) Tj T* ( status A fake status command) Tj T* ET
+BT 1 0 0 1 0 62 Tm /F3 10 Tf 12 TL (usage: plac_runner.py vcs.py [-h] {status,commit,checkout} ...) Tj T* T* (A Fake Version Control System) Tj T* T* (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 168.6236 cm
+1 0 0 1 56.69291 56.69291 cm
q
-BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (You can get help for the subcommands by postponing ) Tj /F3 10 Tf (-h ) Tj /F1 10 Tf (after the name of the command:) Tj T* ET
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (32) Tj T* -235.3849 0 Td ET
Q
Q
+
+endstream
+endobj
+% 'R383': class PDFStream
+383 0 obj
+% page stream
+<< /Length 3250 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 99.42362 cm
+1 0 0 1 62.69291 679.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -10613,34 +10691,24 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 60 re B*
+n -6 -6 468.6898 84 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 38 Tm /F3 10 Tf 12 TL ($ plac vcs.py status -h) Tj T* (usage: vcs.py status [-h] [-q]) Tj T* T* (A fake status command) Tj T* ET
+BT 1 0 0 1 0 62 Tm /F3 10 Tf 12 TL T* (subcommands:) Tj T* ( {status,commit,checkout}) Tj T* ( checkout A fake checkout command) Tj T* ( commit A fake commit command) Tj T* ( status A fake status command) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
+1 0 0 1 62.69291 659.8236 cm
q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (32) Tj T* -235.3849 0 Td ET
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (You can get help for the subcommands by postponing ) Tj /F3 10 Tf (-h ) Tj /F1 10 Tf (after the name of the command:) Tj T* ET
Q
Q
-
-endstream
-endobj
-% 'R379': class PDFStream
-379 0 obj
-% page stream
-<< /Length 4852 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 703.8236 cm
+1 0 0 1 62.69291 542.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -10650,31 +10718,31 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 60 re B*
+n -6 -6 468.6898 108 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 38 Tm /F3 10 Tf 12 TL T* (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* ( -q, --quiet summary information) Tj T* ET
+BT 1 0 0 1 0 86 Tm /F3 10 Tf 12 TL ($ plac vcs.py status -h) Tj T* (usage: vcs.py status [-h] [-q]) Tj T* T* (A fake status command) Tj T* T* (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* ( -q, --quiet summary information) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 671.8236 cm
+1 0 0 1 62.69291 510.6236 cm
q
BT 1 0 0 1 0 14 Tm 2.064985 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice how the docstring of the command is automatically shown in usage message, as well as the) Tj T* 0 Tw (documentation for the sub flag ) Tj /F3 10 Tf (-q) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 653.8236 cm
+1 0 0 1 62.69291 492.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is an example of a non-interactive session:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 524.6236 cm
+1 0 0 1 62.69291 363.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -10695,14 +10763,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 504.6236 cm
+1 0 0 1 62.69291 343.4236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (and here is an interactive session:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 303.4236 cm
+1 0 0 1 62.69291 142.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -10722,38 +10790,54 @@ Q
Q
Q
q
-1 0 0 1 62.69291 271.4236 cm
+1 0 0 1 62.69291 110.2236 cm
q
BT 1 0 0 1 0 14 Tm 2.986905 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice the invocation of the ) Tj /F3 10 Tf (__missing__ ) Tj /F1 10 Tf (hook for non-existing commands. Notice also that the) Tj T* 0 Tw /F3 10 Tf (__exit__ ) Tj /F1 10 Tf (hook gets called only in interactive mode.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 241.4236 cm
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (33) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R384': class PDFStream
+384 0 obj
+% page stream
+<< /Length 5749 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 741.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.614104 Tw (If the commands are completely independent, a module is a good fit for a method container. In other) Tj T* 0 Tw (situations, it is best to use a custom class.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 211.4236 cm
+1 0 0 1 62.69291 711.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Writing your own plac runner) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 157.4236 cm
+1 0 0 1 62.69291 657.0236 cm
q
BT 1 0 0 1 0 38 Tm .167209 Tw 12 TL /F1 10 Tf 0 0 0 rg (The runner included in the ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (distribution is intentionally kept small \(around 50 lines of code\) so that you) Tj T* 0 Tw .081294 Tw (can study it and write your own runner if want to. If you need to go to such level of detail, you should know) Tj T* 0 Tw .42061 Tw (that the most important method of the ) Tj /F3 10 Tf (Interpreter ) Tj /F1 10 Tf (class is the ) Tj /F3 10 Tf (.send ) Tj /F1 10 Tf (method, which takes strings in) Tj T* 0 Tw (input and returns a four-tuple with attributes ) Tj /F3 10 Tf (.str) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (.etype) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (.exc ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (.tb) Tj /F1 10 Tf (:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 151.4236 cm
+1 0 0 1 62.69291 651.0236 cm
Q
q
-1 0 0 1 62.69291 151.4236 cm
+1 0 0 1 62.69291 651.0236 cm
Q
q
-1 0 0 1 62.69291 139.4236 cm
+1 0 0 1 62.69291 639.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -10773,10 +10857,10 @@ q
Q
Q
q
-1 0 0 1 62.69291 133.4236 cm
+1 0 0 1 62.69291 633.0236 cm
Q
q
-1 0 0 1 62.69291 121.4236 cm
+1 0 0 1 62.69291 621.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -10796,10 +10880,10 @@ q
Q
Q
q
-1 0 0 1 62.69291 115.4236 cm
+1 0 0 1 62.69291 615.0236 cm
Q
q
-1 0 0 1 62.69291 103.4236 cm
+1 0 0 1 62.69291 603.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -10819,26 +10903,10 @@ q
Q
Q
q
-1 0 0 1 62.69291 97.42362 cm
-Q
-q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (33) Tj T* -235.3849 0 Td ET
-Q
+1 0 0 1 62.69291 597.0236 cm
Q
-
-endstream
-endobj
-% 'R380': class PDFStream
-380 0 obj
-% page stream
-<< /Length 5029 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 753.0236 cm
+1 0 0 1 62.69291 585.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -10858,22 +10926,22 @@ q
Q
Q
q
-1 0 0 1 62.69291 753.0236 cm
+1 0 0 1 62.69291 585.0236 cm
Q
q
-1 0 0 1 62.69291 711.0236 cm
+1 0 0 1 62.69291 543.0236 cm
q
BT 1 0 0 1 0 26 Tm .937485 Tw 12 TL /F1 10 Tf 0 0 0 rg (Moreover the ) Tj /F3 10 Tf (__str__ ) Tj /F1 10 Tf (representation of the output object is redefined to return the output string if the) Tj T* 0 Tw 2.686651 Tw (command was successful or the error message if the command failed \(actually it returns the error) Tj T* 0 Tw (message preceded by the name of the exception class\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 693.0236 cm
+1 0 0 1 62.69291 525.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (For instance, if you send a mispelled option to the interpreter a ) Tj /F3 10 Tf (SystemExit ) Tj /F1 10 Tf (will be trapped:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 599.8236 cm
+1 0 0 1 62.69291 431.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -10893,20 +10961,20 @@ Q
Q
Q
q
-1 0 0 1 62.69291 567.8236 cm
+1 0 0 1 62.69291 399.8236 cm
q
BT 1 0 0 1 0 14 Tm 2.90561 Tw 12 TL /F1 10 Tf 0 0 0 rg (It is important to invoke the ) Tj /F3 10 Tf (.send ) Tj /F1 10 Tf (method inside the context manager, otherwise you will get a) Tj T* 0 Tw /F3 10 Tf (RuntimeError) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 525.8236 cm
+1 0 0 1 62.69291 357.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .29311 Tw (For instance, suppose you want to implement a graphical runner for a plac-based interpreter with two text) Tj T* 0 Tw 1.548221 Tw (widgets: one to enter the commands and one to display the results. Suppose you want to display the) Tj T* 0 Tw (errors with tracebacks in red. You will need to code something like that \(pseudocode follows\):) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 288.6236 cm
+1 0 0 1 62.69291 120.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -10927,26 +10995,42 @@ Q
Q
Q
q
-1 0 0 1 62.69291 256.6236 cm
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (34) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R385': class PDFStream
+385 0 obj
+% page stream
+<< /Length 4478 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 741.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .102765 Tw (You can adapt the pseudocode to your GUI toolkit of choice and you can also change the file associations) Tj T* 0 Tw (in such a way that clicking on a plac tool file the graphical user interface starts.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 226.6236 cm
+1 0 0 1 62.69291 711.0236 cm
q
BT 1 0 0 1 0 14 Tm .259988 Tw 12 TL /F1 10 Tf 0 0 0 rg (An example of GUI program built on top of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is given later on, in the paragraph ) Tj /F4 10 Tf (Managing the output of) Tj T* 0 Tw (concurrent commands ) Tj /F1 10 Tf (\(using Tkinter for simplicity and portability\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 172.6236 cm
+1 0 0 1 62.69291 657.0236 cm
q
BT 1 0 0 1 0 38 Tm 2.090651 Tw 12 TL /F1 10 Tf 0 0 0 rg (There is a final ) Tj /F4 10 Tf (caveat) Tj /F1 10 Tf (: since the plac interpreter loop is implemented via extended generators, plac) Tj T* 0 Tw .988651 Tw (interpreters are single threaded: you will get an error if you ) Tj /F3 10 Tf (.send ) Tj /F1 10 Tf (commands from separated threads.) Tj T* 0 Tw .947882 Tw (You can circumvent the problem by using a queue. If EXIT is a sentinel value to signal exiting from the) Tj T* 0 Tw (interpreter look, you can write code like this:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 115.4236 cm
+1 0 0 1 62.69291 599.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -10967,41 +11051,25 @@ Q
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (34) Tj T* -235.3849 0 Td ET
-Q
-Q
-
-endstream
-endobj
-% 'R381': class PDFStream
-381 0 obj
-% page stream
-<< /Length 4156 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 741.0236 cm
+1 0 0 1 62.69291 567.8236 cm
q
BT 1 0 0 1 0 14 Tm .106098 Tw 12 TL /F1 10 Tf 0 0 0 rg (The same trick also work for processes; you could run the interpreter loop in a separate process and send) Tj T* 0 Tw (commands to it via the Queue class provided by the ) Tj 0 0 .501961 rg (multiprocessing ) Tj 0 0 0 rg (module.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 711.0236 cm
+1 0 0 1 62.69291 537.8236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Long running commands) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 669.0236 cm
+1 0 0 1 62.69291 495.8236 cm
q
BT 1 0 0 1 0 26 Tm 1.434431 Tw 12 TL /F1 10 Tf 0 0 0 rg (As we saw, by default a ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (interpreter blocks until the command terminates. This is an issue, in the) Tj T* 0 Tw 1.201318 Tw (sense that it makes the interactive experience quite painful for long running commands. An example is) Tj T* 0 Tw (better than a thousand words, so consider the following fake importer:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 407.8236 cm
+1 0 0 1 62.69291 234.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -11022,13 +11090,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 375.8236 cm
+1 0 0 1 62.69291 202.6236 cm
q
BT 1 0 0 1 0 14 Tm 1.466457 Tw 12 TL /F1 10 Tf 0 0 0 rg (If you run the ) Tj /F3 10 Tf (import_file ) Tj /F1 10 Tf (command, you will have to wait for 200 seconds before entering a new) Tj T* 0 Tw (command:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 234.6236 cm
+1 0 0 1 62.69291 97.42362 cm
q
q
1 0 0 1 0 0 cm
@@ -11038,39 +11106,75 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 132 re B*
+n -6 -6 468.6898 96 re B*
Q
q
-BT 1 0 0 1 0 110 Tm 12 TL /F3 10 Tf 0 0 0 rg ($ python importer1.py dsn -i) Tj T* (A fake importer with an import_file command) Tj T* (i) Tj (>) Tj ( import_file file1) Tj T* (... ) Tj (<) Tj (wait 3+ minutes) Tj (>) Tj T* (Imported 100 lines) Tj T* (Imported 200 lines) Tj T* (Imported 300 lines) Tj T* (...) Tj T* (Imported 10000 lines) Tj T* (closing the file) Tj T* ET
+BT 1 0 0 1 0 74 Tm 12 TL /F3 10 Tf 0 0 0 rg ($ python importer1.py dsn -i) Tj T* (A fake importer with an import_file command) Tj T* (i) Tj (>) Tj ( import_file file1) Tj T* (... ) Tj (<) Tj (wait 3+ minutes) Tj (>) Tj T* (Imported 100 lines) Tj T* (Imported 200 lines) Tj T* (Imported 300 lines) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 190.6236 cm
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (35) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R386': class PDFStream
+386 0 obj
+% page stream
+<< /Length 5336 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 715.8236 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 48 re B*
+Q
+q
+BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 0 0 rg (...) Tj T* (Imported 10000 lines) Tj T* (closing the file) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 671.8236 cm
q
BT 1 0 0 1 0 26 Tm .96832 Tw 12 TL /F1 10 Tf 0 0 0 rg (Being unable to enter any other command is quite annoying: in such situation one would like to run the) Tj T* 0 Tw .941318 Tw (long running commands in the background, to keep the interface responsive. ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (provides two ways to) Tj T* 0 Tw (reach this goal: threads and processes.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 160.6236 cm
+1 0 0 1 62.69291 641.8236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Threaded commands) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 130.6236 cm
+1 0 0 1 62.69291 611.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .317988 Tw (The most familiar way to execute a task in the background \(even if not necessarily the best way\) is to run) Tj T* 0 Tw (it into a separated thread. In our example it is sufficient to replace the line) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 124.6236 cm
+1 0 0 1 62.69291 605.8236 cm
Q
q
-1 0 0 1 62.69291 112.6236 cm
+1 0 0 1 62.69291 593.8236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -11085,36 +11189,20 @@ q
Q
Q
q
-1 0 0 1 62.69291 112.6236 cm
+1 0 0 1 62.69291 593.8236 cm
Q
q
-1 0 0 1 62.69291 94.62362 cm
+1 0 0 1 62.69291 575.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (with) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 88.86614 cm
-Q
-q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (35) Tj T* -235.3849 0 Td ET
-Q
+1 0 0 1 62.69291 569.8236 cm
Q
-
-endstream
-endobj
-% 'R382': class PDFStream
-382 0 obj
-% page stream
-<< /Length 5064 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 753.0236 cm
+1 0 0 1 62.69291 557.8236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -11129,16 +11217,16 @@ q
Q
Q
q
-1 0 0 1 62.69291 753.0236 cm
+1 0 0 1 62.69291 557.8236 cm
Q
q
-1 0 0 1 62.69291 723.0236 cm
+1 0 0 1 62.69291 527.8236 cm
q
BT 1 0 0 1 0 14 Tm 1.38311 Tw 12 TL /F1 10 Tf 0 0 0 rg (to tell to the ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (interpreter that the command ) Tj /F3 10 Tf (import_file ) Tj /F1 10 Tf (should be run into a separated thread.) Tj T* 0 Tw (Here is an example session:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 677.8236 cm
+1 0 0 1 62.69291 482.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -11158,13 +11246,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 645.8236 cm
+1 0 0 1 62.69291 450.6236 cm
q
BT 1 0 0 1 0 14 Tm .595777 Tw 12 TL /F1 10 Tf 0 0 0 rg (The import task started in a separated thread. You can see the progress of the task by using the special) Tj T* 0 Tw (command ) Tj /F3 10 Tf (.output) Tj /F1 10 Tf (:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 576.6236 cm
+1 0 0 1 62.69291 381.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -11184,14 +11272,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 556.6236 cm
+1 0 0 1 62.69291 361.4236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (If you look after a while, you will get more lines of output:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 463.4236 cm
+1 0 0 1 62.69291 268.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -11211,14 +11299,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 443.4236 cm
+1 0 0 1 62.69291 248.2236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (If you look after a time long enough, the task will be finished:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 398.2236 cm
+1 0 0 1 62.69291 203.0236 cm
q
q
1 0 0 1 0 0 cm
@@ -11238,14 +11326,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 366.2236 cm
+1 0 0 1 62.69291 171.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .819573 Tw (It is possible to store the output of a task into a file, to be read later \(this is useful for tasks with a large) Tj T* 0 Tw (output\):) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 321.0236 cm
+1 0 0 1 62.69291 125.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -11265,20 +11353,36 @@ Q
Q
Q
q
-1 0 0 1 62.69291 289.0236 cm
+1 0 0 1 62.69291 93.82362 cm
q
BT 1 0 0 1 0 14 Tm 1.045868 Tw 12 TL /F1 10 Tf 0 0 0 rg (You can even skip the number argument: then ) Tj /F3 10 Tf (.output ) Tj /F1 10 Tf (will the return the output of the last launched) Tj T* 0 Tw (command \(the special commands like .output do not count\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 271.0236 cm
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (36) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R387': class PDFStream
+387 0 obj
+% page stream
+<< /Length 4197 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 753.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (You can launch many tasks one after the other:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 201.8236 cm
+1 0 0 1 62.69291 683.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -11298,13 +11402,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 181.8236 cm
+1 0 0 1 62.69291 663.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf (.list ) Tj /F1 10 Tf (command displays all the running tasks:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 124.6236 cm
+1 0 0 1 62.69291 606.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -11324,30 +11428,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 104.6236 cm
+1 0 0 1 62.69291 586.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (It is even possible to kill a task:) Tj T* ET
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (36) Tj T* -235.3849 0 Td ET
-Q
-Q
-
-endstream
-endobj
-% 'R383': class PDFStream
-383 0 obj
-% page stream
-<< /Length 4743 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 679.8236 cm
+1 0 0 1 62.69291 493.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -11367,13 +11455,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 587.8236 cm
+1 0 0 1 62.69291 401.4236 cm
q
BT 1 0 0 1 0 74 Tm 1.100542 Tw 12 TL /F1 10 Tf 0 0 0 rg (You should notice that since at the Python level it is impossible to kill a thread, the ) Tj /F3 10 Tf (.kill ) Tj /F1 10 Tf (commands) Tj T* 0 Tw 1.793984 Tw (works by setting the status of the task to ) Tj /F3 10 Tf (TOBEKILLED) Tj /F1 10 Tf (. Internally the generator corresponding to the) Tj T* 0 Tw .632927 Tw (command is executed in the thread and the status is checked at each iteration: when the status become) Tj T* 0 Tw 2.578443 Tw /F3 10 Tf (TOBEKILLED ) Tj /F1 10 Tf (a ) Tj /F3 10 Tf (GeneratorExit ) Tj /F1 10 Tf (exception is raised and the thread terminates \(softly, so that the) Tj T* 0 Tw 2.328651 Tw /F3 10 Tf (finally ) Tj /F1 10 Tf (clause is honored\). In our example the generator is yielding back control once every 100) Tj T* 0 Tw 1.152619 Tw (iterations, i.e. every two seconds \(not much\). In order to get a responsive interface it is a good idea to) Tj T* 0 Tw (yield more often, for instance every 10 iterations \(i.e. 5 times per second\), as in the following code:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 302.6236 cm
+1 0 0 1 62.69291 116.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -11394,29 +11482,45 @@ Q
Q
Q
q
-1 0 0 1 62.69291 272.6236 cm
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (37) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R388': class PDFStream
+388 0 obj
+% page stream
+<< /Length 5986 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 747.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Running commands as external processes) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 218.6236 cm
+1 0 0 1 62.69291 693.0236 cm
q
BT 1 0 0 1 0 38 Tm 2.30686 Tw 12 TL /F1 10 Tf 0 0 0 rg (Threads are not loved much in the Python world and actually most people prefer to use processes) Tj T* 0 Tw 3.350697 Tw (instead. For this reason ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (provides the option to execute long running commands as external) Tj T* 0 Tw .632706 Tw (processes. Unfortunately the current implementation only works in Unix-like operating systems \(including) Tj T* 0 Tw (Mac OS X\) because it relies on fork via the ) Tj 0 0 .501961 rg (multiprocessing ) Tj 0 0 0 rg (module.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 200.6236 cm
+1 0 0 1 62.69291 675.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (In our example, to enable the feature it is sufficient to replace the line) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 194.6236 cm
+1 0 0 1 62.69291 669.0236 cm
Q
q
-1 0 0 1 62.69291 182.6236 cm
+1 0 0 1 62.69291 657.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -11431,20 +11535,20 @@ q
Q
Q
q
-1 0 0 1 62.69291 182.6236 cm
+1 0 0 1 62.69291 657.0236 cm
Q
q
-1 0 0 1 62.69291 164.6236 cm
+1 0 0 1 62.69291 639.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (with) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 158.6236 cm
+1 0 0 1 62.69291 633.0236 cm
Q
q
-1 0 0 1 62.69291 146.6236 cm
+1 0 0 1 62.69291 621.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -11458,33 +11562,17 @@ q
Q
Q
q
-1 0 0 1 62.69291 146.6236 cm
+1 0 0 1 62.69291 621.0236 cm
Q
q
-1 0 0 1 62.69291 116.6236 cm
+1 0 0 1 62.69291 591.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .772619 Tw (The user experience is exactly the same as with threads and you will not see any difference at the user) Tj T* 0 Tw (interface level:) Tj T* ET
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (37) Tj T* -235.3849 0 Td ET
-Q
-Q
-
-endstream
-endobj
-% 'R384': class PDFStream
-384 0 obj
-% page stream
-<< /Length 4710 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 631.8236 cm
+1 0 0 1 62.69291 449.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -11504,39 +11592,39 @@ Q
Q
Q
q
-1 0 0 1 62.69291 575.8236 cm
+1 0 0 1 62.69291 393.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 38 Tm /F1 10 Tf 12 TL 1.201318 Tw (Still, using processes is quite different than using threads: in particular, when using processes you can) Tj T* 0 Tw 2.313318 Tw (only yield pickleable values and you cannot re-raise an exception first raised in a different process,) Tj T* 0 Tw 1.445697 Tw (because traceback objects are not pickleable. Moreover, you cannot rely on automatic sharing of your) Tj T* 0 Tw (objects.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 521.8236 cm
+1 0 0 1 62.69291 339.8236 cm
q
BT 1 0 0 1 0 38 Tm .128935 Tw 12 TL /F1 10 Tf 0 0 0 rg (On the plus side, when using processes you do not need to worry about killing a command: they are killed) Tj T* 0 Tw .466412 Tw (immediately using a SIGTERM signal, and there is not a ) Tj /F3 10 Tf (TOBEKILLED ) Tj /F1 10 Tf (mechanism. Moreover, the killing) Tj T* 0 Tw 1.50229 Tw (is guaranteed to be soft: internally a command receiving a SIGTERM raises a ) Tj /F3 10 Tf (TerminatedProcess) Tj T* 0 Tw /F1 10 Tf (exception which is trapped in the generator loop, so that the command is closed properly.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 491.8236 cm
+1 0 0 1 62.69291 309.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .242927 Tw (Using processes allows to take full advantage of multicore machines and it is safer than using threads, so) Tj T* 0 Tw (it is the recommended approach unless you are working on Windows.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 461.8236 cm
+1 0 0 1 62.69291 279.8236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Managing the output of concurrent commands) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 347.8236 cm
+1 0 0 1 62.69291 165.8236 cm
q
BT 1 0 0 1 0 98 Tm 1.895542 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (acts as a command-line task launcher and can be used as the base to build a GUI-based task) Tj T* 0 Tw .38561 Tw (launcher and task monitor. To this aim the interpreter class provides a ) Tj /F3 10 Tf (.submit ) Tj /F1 10 Tf (method which returns a) Tj T* 0 Tw 1.792339 Tw (task object and a ) Tj /F3 10 Tf (.tasks ) Tj /F1 10 Tf (method returning the list of all the tasks submitted to the interpreter. The) Tj T* 0 Tw .373516 Tw /F3 10 Tf (submit ) Tj /F1 10 Tf (method does not start the task and thus it is nonblocking. Each task has an ) Tj /F3 10 Tf (.outlist ) Tj /F1 10 Tf (attribute) Tj T* 0 Tw .106098 Tw (which is a list storing the value yielded by the generator underlying the task \(the ) Tj /F3 10 Tf (None ) Tj /F1 10 Tf (values are skipped) Tj T* 0 Tw .633318 Tw (though\): the ) Tj /F3 10 Tf (.outlist ) Tj /F1 10 Tf (grows as the task runs and more values are yielded. Accessing the ) Tj /F3 10 Tf (.outlist) Tj T* 0 Tw 1.051654 Tw /F1 10 Tf (is nonblocking and can be done freely. Finally there is a ) Tj /F3 10 Tf (.result ) Tj /F1 10 Tf (property which waits for the task to) Tj T* 0 Tw .830574 Tw (finish and returns the last yielded value or raises an exception. The code below provides an example of) Tj T* 0 Tw (how you could implement a GUI over the importer example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 98.62362 cm
+1 0 0 1 62.69291 96.62362 cm
q
q
1 0 0 1 0 0 cm
@@ -11546,11 +11634,11 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 240 re B*
+n -6 -6 468.6898 60 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 218 Tm /F3 10 Tf 12 TL (from __future__ import with_statement) Tj T* (from Tkinter import *) Tj T* (from importer3 import FakeImporter) Tj T* T* (def taskwidget\(root, task, tick=500\):) Tj T* ( "A Label widget showing the output of a task every 500 ms") Tj T* ( sv = StringVar\(root\)) Tj T* ( lb = Label\(root, textvariable=sv\)) Tj T* ( def show_outlist\(\):) Tj T* ( try:) Tj T* ( out = task.outlist[-1]) Tj T* ( except IndexError: # no output yet) Tj T* ( out = '') Tj T* ( sv.set\('%s %s' % \(task, out\)\)) Tj T* ( root.after\(tick, show_outlist\)) Tj T* ( root.after\(0, show_outlist\)) Tj T* ( return lb) Tj T* T* (def monitor\(tasks\):) Tj T* ET
+BT 1 0 0 1 0 38 Tm /F3 10 Tf 12 TL (from __future__ import with_statement) Tj T* (from Tkinter import *) Tj T* (from importer3 import FakeImporter) Tj T* T* ET
Q
Q
Q
@@ -11566,14 +11654,14 @@ Q
endstream
endobj
-% 'R385': class PDFStream
-385 0 obj
+% 'R389': class PDFStream
+389 0 obj
% page stream
-<< /Length 5316 >>
+<< /Length 3716 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 619.8236 cm
+1 0 0 1 62.69291 439.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -11583,30 +11671,30 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 144 re B*
+n -6 -6 468.6898 324 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 122 Tm /F3 10 Tf 12 TL ( root = Tk\(\)) Tj T* ( for task in tasks:) Tj T* ( task.run\(\)) Tj T* ( taskwidget\(root, task\).pack\(\)) Tj T* ( root.mainloop\(\)) Tj T* T* (if __name__ == '__main__':) Tj T* ( import plac) Tj T* ( with plac.Interpreter\(plac.call\(FakeImporter\)\) as i:) Tj T* ( tasks = [i.submit\('import_file f1'\), i.submit\('import_file f2'\)]) Tj T* ( monitor\(tasks\)) Tj T* ET
+BT 1 0 0 1 0 302 Tm /F3 10 Tf 12 TL (def taskwidget\(root, task, tick=500\):) Tj T* ( "A Label widget showing the output of a task every 500 ms") Tj T* ( sv = StringVar\(root\)) Tj T* ( lb = Label\(root, textvariable=sv\)) Tj T* ( def show_outlist\(\):) Tj T* ( try:) Tj T* ( out = task.outlist[-1]) Tj T* ( except IndexError: # no output yet) Tj T* ( out = '') Tj T* ( sv.set\('%s %s' % \(task, out\)\)) Tj T* ( root.after\(tick, show_outlist\)) Tj T* ( root.after\(0, show_outlist\)) Tj T* ( return lb) Tj T* T* (def monitor\(tasks\):) Tj T* ( root = Tk\(\)) Tj T* ( for task in tasks:) Tj T* ( task.run\(\)) Tj T* ( taskwidget\(root, task\).pack\(\)) Tj T* ( root.mainloop\(\)) Tj T* T* (if __name__ == '__main__':) Tj T* ( import plac) Tj T* ( with plac.Interpreter\(plac.call\(FakeImporter\)\) as i:) Tj T* ( tasks = [i.submit\('import_file f1'\), i.submit\('import_file f2'\)]) Tj T* ( monitor\(tasks\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 589.8236 cm
+1 0 0 1 62.69291 409.8236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Monitor support) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 475.8236 cm
+1 0 0 1 62.69291 295.8236 cm
q
BT 1 0 0 1 0 98 Tm .493555 Tw 12 TL /F1 10 Tf 0 0 0 rg (Starting from release 0.8 ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (provides builtin support for monitoring the output of concurrent commands,) Tj T* 0 Tw 1.277318 Tw (at least for platforms where multiprocessing is fully supported. You can define your own monitor class,) Tj T* 0 Tw .839979 Tw (simply by inheriting from ) Tj /F3 10 Tf (plac.Monitor ) Tj /F1 10 Tf (and by overriding the methods ) Tj /F3 10 Tf (add_listener\(self, no\)) Tj /F1 10 Tf (,) Tj T* 0 Tw 2.953953 Tw /F3 10 Tf (del_listener\(self, taskno\)) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (notify_listener\(self, taskno, msg\)) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (schedule\(self,) Tj T* 0 Tw .367674 Tw (seconds, func, arg\) ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (run\(self\)) Tj /F1 10 Tf (. Then, you can a monitor object to any ) Tj /F3 10 Tf (plac.Interpreter) Tj T* 0 Tw 1.149983 Tw /F1 10 Tf (object by simply calling the ) Tj /F3 10 Tf (add_monitor ) Tj /F1 10 Tf (method. For convenience, ) Tj /F3 10 Tf (plac ) Tj /F1 10 Tf (comes with a very simple) Tj T* 0 Tw .82683 Tw /F3 10 Tf (TkMonitor ) Tj /F1 10 Tf (based on Tkinter \(I chose Tkinter because it is easy to use and it is in the standard library,) Tj T* 0 Tw .08332 Tw (but you can use any GUI\): you can just look at how the ) Tj /F3 10 Tf (TkMonitor ) Tj /F1 10 Tf (is implemented in ) Tj /F3 10 Tf (plac_tk.py ) Tj /F1 10 Tf (and) Tj T* 0 Tw (adapt it. Here is an example of usage of the ) Tj /F3 10 Tf (TkMonitor) Tj /F1 10 Tf (:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 298.6236 cm
+1 0 0 1 62.69291 118.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -11627,41 +11715,41 @@ Q
Q
Q
q
-1 0 0 1 62.69291 254.6236 cm
+1 0 0 1 56.69291 56.69291 cm
q
-BT 1 0 0 1 0 26 Tm 1.657633 Tw 12 TL /F1 10 Tf 0 0 0 rg (Try to give the ) Tj /F3 10 Tf (hello ) Tj /F1 10 Tf (command from the interactive interpreter: each time a new text widget will be) Tj T* 0 Tw 1.321235 Tw (added displaying the output of the command. Notice that if ) Tj /F3 10 Tf (Tkinter ) Tj /F1 10 Tf (is not installed correctly on your) Tj T* 0 Tw (system the ) Tj /F3 10 Tf (TkMonitor ) Tj /F1 10 Tf (class will not be available.) Tj T* ET
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (39) Tj T* -235.3849 0 Td ET
Q
Q
+
+endstream
+endobj
+% 'R390': class PDFStream
+390 0 obj
+% page stream
+<< /Length 4914 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 224.6236 cm
+1 0 0 1 62.69291 729.0236 cm
q
-BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Parallel computing with plac) Tj T* ET
+BT 1 0 0 1 0 26 Tm 1.657633 Tw 12 TL /F1 10 Tf 0 0 0 rg (Try to give the ) Tj /F3 10 Tf (hello ) Tj /F1 10 Tf (command from the interactive interpreter: each time a new text widget will be) Tj T* 0 Tw 1.321235 Tw (added displaying the output of the command. Notice that if ) Tj /F3 10 Tf (Tkinter ) Tj /F1 10 Tf (is not installed correctly on your) Tj T* 0 Tw (system the ) Tj /F3 10 Tf (TkMonitor ) Tj /F1 10 Tf (class will not be available.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 110.6236 cm
+1 0 0 1 62.69291 699.0236 cm
q
-BT 1 0 0 1 0 98 Tm 1.174751 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is certainly not intended as a tool for parallel computing, but still you can use it to launch a set of) Tj T* 0 Tw .497984 Tw (commands and to collect the results, similarly to the MapReduce pattern popularized by Google. In order) Tj T* 0 Tw .669431 Tw (to give an example, I will consider the "Hello World" of parallel computing, i.e. the computation of pi with) Tj T* 0 Tw .537633 Tw (independent processes. There is a huge number of algorithms to compute pi; here I will describe a trivial) Tj T* 0 Tw .101567 Tw (one chosen for simplicity, not per efficienty. The trick is to consider the first quadrant of a circle with radius) Tj T* 0 Tw .602488 Tw (1 and to extract a number of points ) Tj /F3 10 Tf (\(x, y\) ) Tj /F1 10 Tf (with ) Tj /F3 10 Tf (x ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (y ) Tj /F1 10 Tf (random variables in the interval ) Tj /F3 10 Tf ([0,1]) Tj /F1 10 Tf (. The) Tj T* 0 Tw .928876 Tw (probability of extracting a number inside the quadrant \(i.e. with ) Tj /F3 10 Tf (x^2 + y^2 < 1) Tj /F1 10 Tf (\) is proportional to the) Tj T* 0 Tw .433145 Tw (area of the quadrant \(i.e. ) Tj /F3 10 Tf (pi/4) Tj /F1 10 Tf (\). The value of ) Tj /F3 10 Tf (pi ) Tj /F1 10 Tf (therefore can be extracted by multiplying by 4 the ratio) Tj T* 0 Tw (between the number of points in the quadrant versus the total number of points ) Tj /F3 10 Tf (N) Tj /F1 10 Tf (, for ) Tj /F3 10 Tf (N ) Tj /F1 10 Tf (large:) Tj T* ET
+BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Parallel computing with plac) Tj T* ET
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
+1 0 0 1 62.69291 585.0236 cm
q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (39) Tj T* -235.3849 0 Td ET
+BT 1 0 0 1 0 98 Tm 1.174751 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is certainly not intended as a tool for parallel computing, but still you can use it to launch a set of) Tj T* 0 Tw .497984 Tw (commands and to collect the results, similarly to the MapReduce pattern popularized by Google. In order) Tj T* 0 Tw .669431 Tw (to give an example, I will consider the "Hello World" of parallel computing, i.e. the computation of pi with) Tj T* 0 Tw .537633 Tw (independent processes. There is a huge number of algorithms to compute pi; here I will describe a trivial) Tj T* 0 Tw .101567 Tw (one chosen for simplicity, not per efficienty. The trick is to consider the first quadrant of a circle with radius) Tj T* 0 Tw .602488 Tw (1 and to extract a number of points ) Tj /F3 10 Tf (\(x, y\) ) Tj /F1 10 Tf (with ) Tj /F3 10 Tf (x ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (y ) Tj /F1 10 Tf (random variables in the interval ) Tj /F3 10 Tf ([0,1]) Tj /F1 10 Tf (. The) Tj T* 0 Tw .928876 Tw (probability of extracting a number inside the quadrant \(i.e. with ) Tj /F3 10 Tf (x^2 + y^2 < 1) Tj /F1 10 Tf (\) is proportional to the) Tj T* 0 Tw .433145 Tw (area of the quadrant \(i.e. ) Tj /F3 10 Tf (pi/4) Tj /F1 10 Tf (\). The value of ) Tj /F3 10 Tf (pi ) Tj /F1 10 Tf (therefore can be extracted by multiplying by 4 the ratio) Tj T* 0 Tw (between the number of points in the quadrant versus the total number of points ) Tj /F3 10 Tf (N) Tj /F1 10 Tf (, for ) Tj /F3 10 Tf (N ) Tj /F1 10 Tf (large:) Tj T* ET
Q
Q
-
-endstream
-endobj
-% 'R386': class PDFStream
-386 0 obj
-% page stream
-<< /Length 3415 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 667.8236 cm
+1 0 0 1 62.69291 479.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -11681,20 +11769,20 @@ Q
Q
Q
q
-1 0 0 1 62.69291 599.8236 cm
+1 0 0 1 62.69291 411.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 50 Tm /F1 10 Tf 12 TL .046654 Tw (The algorithm is trivially parallelizable: if you have n CPUs, you can compute pi n times with N/n iterations,) Tj T* 0 Tw 1.122488 Tw (sum the results and divide the total by n. I have a Macbook with two cores, therefore I would expect a) Tj T* 0 Tw 2.347984 Tw (speedup factor of 2 with respect to a sequential computation. Moreover, I would expect a threaded) Tj T* 0 Tw 2.827984 Tw (computation to be even slower than a sequential computation, due to the GIL and the scheduling) Tj T* 0 Tw (overhead.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 569.8236 cm
+1 0 0 1 62.69291 381.8236 cm
q
BT 1 0 0 1 0 14 Tm .313984 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here is a script implementing the algorithm and working in three different modes \(parallel mode, threaded) Tj T* 0 Tw (mode and sequential mode\) depending on a ) Tj /F3 10 Tf (mode ) Tj /F1 10 Tf (option:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 92.62362 cm
+1 0 0 1 62.69291 96.62362 cm
q
q
1 0 0 1 0 0 cm
@@ -11704,10 +11792,10 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 468 re B*
+n -6 -6 468.6898 276 re B*
Q
q
-BT 1 0 0 1 0 446 Tm 12 TL /F3 10 Tf 0 0 0 rg (from __future__ import with_statement) Tj T* (from random import random) Tj T* (import multiprocessing) Tj T* (import plac) Tj T* T* (class PiCalculator\(object\):) Tj T* ( """Compute pi in parallel with threads or processes""") Tj T* ( ) Tj T* ( @plac.annotations\() Tj T* ( npoints=\('number of integration points', 'positional', None, int\),) Tj T* ( mode=\('sequential|parallel|threaded', 'option', 'm', str, 'SPT'\)\)) Tj T* ( def __init__\(self, npoints, mode='S'\):) Tj T* ( self.npoints = npoints) Tj T* ( if mode == 'P':) Tj T* ( self.mpcommands = ['calc_pi']) Tj T* ( elif mode == 'T':) Tj T* ( self.thcommands = ['calc_pi']) Tj T* ( elif mode == 'S':) Tj T* ( self.commands = ['calc_pi']) Tj T* ( self.n_cpu = multiprocessing.cpu_count\(\)) Tj T* ( ) Tj T* ( def submit_tasks\(self\):) Tj T* ( self.i = plac.Interpreter\(self\).__enter__\(\) ) Tj T* ( return [self.i.submit\('calc_pi %d' % \(self.npoints / self.n_cpu\)\)) Tj T* ( for _ in range\(self.n_cpu\)]) Tj T* T* ( def close\(self\):) Tj T* ( self.i.close\(\)) Tj T* T* ( @plac.annotations\() Tj T* ( npoints=\('npoints', 'positional', None, int\)\)) Tj T* ( def calc_pi\(self, npoints\):) Tj T* ( counts = 0) Tj T* ( for j in xrange\(npoints\):) Tj T* ( n, r = divmod\(j, 1000000\)) Tj T* ( if r == 0:) Tj T* ( yield '%dM iterations' % n) Tj T* ( x, y = random\(\), random\(\)) Tj T* ET
+BT 1 0 0 1 0 254 Tm 12 TL /F3 10 Tf 0 0 0 rg (from __future__ import with_statement) Tj T* (from random import random) Tj T* (import multiprocessing) Tj T* (import plac) Tj T* T* (class PiCalculator\(object\):) Tj T* ( """Compute pi in parallel with threads or processes""") Tj T* ( ) Tj T* ( @plac.annotations\() Tj T* ( npoints=\('number of integration points', 'positional', None, int\),) Tj T* ( mode=\('sequential|parallel|threaded', 'option', 'm', str, 'SPT'\)\)) Tj T* ( def __init__\(self, npoints, mode='S'\):) Tj T* ( self.npoints = npoints) Tj T* ( if mode == 'P':) Tj T* ( self.mpcommands = ['calc_pi']) Tj T* ( elif mode == 'T':) Tj T* ( self.thcommands = ['calc_pi']) Tj T* ( elif mode == 'S':) Tj T* ( self.commands = ['calc_pi']) Tj T* ( self.n_cpu = multiprocessing.cpu_count\(\)) Tj T* ( ) Tj T* ( def submit_tasks\(self\):) Tj T* ET
Q
Q
Q
@@ -11723,14 +11811,14 @@ Q
endstream
endobj
-% 'R387': class PDFStream
-387 0 obj
+% 'R391': class PDFStream
+391 0 obj
% page stream
-<< /Length 4770 >>
+<< /Length 3511 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 451.8236 cm
+1 0 0 1 62.69291 259.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -11740,30 +11828,30 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 312 re B*
+n -6 -6 468.6898 504 re B*
Q
q
-BT 1 0 0 1 0 290 Tm 12 TL /F3 10 Tf 0 0 0 rg ( if x*x + y*y ) Tj (<) Tj ( 1:) Tj T* ( counts += 1) Tj T* ( yield \(4.0 * counts\)/npoints) Tj T* T* ( def run\(self\):) Tj T* ( tasks = self.i.tasks\(\)) Tj T* ( for t in tasks:) Tj T* ( t.run\(\)) Tj T* ( try:) Tj T* ( total = 0) Tj T* ( for task in tasks:) Tj T* ( total += task.result) Tj T* ( except: # the task was killed) Tj T* ( print tasks) Tj T* ( return) Tj T* ( return total / self.n_cpu) Tj T* T* (if __name__ == '__main__':) Tj T* ( pc = plac.call\(PiCalculator\)) Tj T* ( pc.submit_tasks\(\)) Tj T* ( try:) Tj T* ( import time; t0 = time.time\(\)) Tj T* ( print '%f in %f seconds ' % \(pc.run\(\), time.time\(\) - t0\)) Tj T* ( finally:) Tj T* ( pc.close\(\)) Tj T* ET
+BT 1 0 0 1 0 482 Tm 12 TL /F3 10 Tf 0 0 0 rg ( self.i = plac.Interpreter\(self\).__enter__\(\) ) Tj T* ( return [self.i.submit\('calc_pi %d' % \(self.npoints / self.n_cpu\)\)) Tj T* ( for _ in range\(self.n_cpu\)]) Tj T* T* ( def close\(self\):) Tj T* ( self.i.close\(\)) Tj T* T* ( @plac.annotations\() Tj T* ( npoints=\('npoints', 'positional', None, int\)\)) Tj T* ( def calc_pi\(self, npoints\):) Tj T* ( counts = 0) Tj T* ( for j in xrange\(npoints\):) Tj T* ( n, r = divmod\(j, 1000000\)) Tj T* ( if r == 0:) Tj T* ( yield '%dM iterations' % n) Tj T* ( x, y = random\(\), random\(\)) Tj T* ( if x*x + y*y ) Tj (<) Tj ( 1:) Tj T* ( counts += 1) Tj T* ( yield \(4.0 * counts\)/npoints) Tj T* T* ( def run\(self\):) Tj T* ( tasks = self.i.tasks\(\)) Tj T* ( for t in tasks:) Tj T* ( t.run\(\)) Tj T* ( try:) Tj T* ( total = 0) Tj T* ( for task in tasks:) Tj T* ( total += task.result) Tj T* ( except: # the task was killed) Tj T* ( print tasks) Tj T* ( return) Tj T* ( return total / self.n_cpu) Tj T* T* (if __name__ == '__main__':) Tj T* ( pc = plac.call\(PiCalculator\)) Tj T* ( pc.submit_tasks\(\)) Tj T* ( try:) Tj T* ( import time; t0 = time.time\(\)) Tj T* ( print '%f in %f seconds ' % \(pc.run\(\), time.time\(\) - t0\)) Tj T* ( finally:) Tj T* ( pc.close\(\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 371.8236 cm
+1 0 0 1 62.69291 179.8236 cm
q
BT 1 0 0 1 0 62 Tm .381797 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice the ) Tj /F3 10 Tf (submit_tasks ) Tj /F1 10 Tf (method, which instantiates and initializes a ) Tj /F3 10 Tf (plac.Interpreter ) Tj /F1 10 Tf (object and) Tj T* 0 Tw 3.38152 Tw (submits a number of commands corresponding to the number of available CPUs. The ) Tj /F3 10 Tf (calc_pi) Tj T* 0 Tw 3.796651 Tw /F1 10 Tf (command yield a log message every million of interactions, just to monitor the progress of the) Tj T* 0 Tw 1.751318 Tw (computation. The ) Tj /F3 10 Tf (run ) Tj /F1 10 Tf (method starts all the submitted commands in parallel and sums the results. It) Tj T* 0 Tw 1.17104 Tw (returns the average value of ) Tj /F3 10 Tf (pi ) Tj /F1 10 Tf (after the slowest CPU has finished its job \(if the CPUs are equal and) Tj T* 0 Tw (equally busy they should finish more or less at the same time\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 353.8236 cm
+1 0 0 1 62.69291 161.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here are the results on my old Macbook with Ubuntu 10.04 and Python 2.6, for 10 million of iterations:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 260.6236 cm
+1 0 0 1 62.69291 92.62362 cm
q
q
1 0 0 1 0 0 cm
@@ -11773,31 +11861,68 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 84 re B*
+n -6 -6 468.6898 60 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 38 Tm /F3 10 Tf 12 TL ($ python picalculator.py -mP 10000000 # two processes) Tj T* (3.141904 in 5.744545 seconds) Tj T* ($ python picalculator.py -mT 10000000 # two threads) Tj T* (3.141272 in 13.875645 seconds) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (41) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R392': class PDFStream
+392 0 obj
+% page stream
+<< /Length 5158 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 727.8236 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 36 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 62 Tm /F3 10 Tf 12 TL ($ python picalculator.py -mP 10000000 # two processes) Tj T* (3.141904 in 5.744545 seconds) Tj T* ($ python picalculator.py -mT 10000000 # two threads) Tj T* (3.141272 in 13.875645 seconds) Tj T* ($ python picalculator.py -mS 10000000 # sequential) Tj T* (3.141586 in 11.353841 seconds) Tj T* ET
+BT 1 0 0 1 0 14 Tm /F3 10 Tf 12 TL ($ python picalculator.py -mS 10000000 # sequential) Tj T* (3.141586 in 11.353841 seconds) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 228.6236 cm
+1 0 0 1 62.69291 695.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.711751 Tw (As you see using processes one gets a 2x speedup indeed, where the threaded mode is some 20%) Tj T* 0 Tw (slower than the sequential mode.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 162.6236 cm
+1 0 0 1 62.69291 629.8236 cm
q
BT 1 0 0 1 0 50 Tm .167765 Tw 12 TL /F1 10 Tf 0 0 0 rg (Since the pattern submit a bunch of tasks, starts them and collect the results is so common, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (provides) Tj T* 0 Tw 2.487251 Tw (an utility function ) Tj /F3 10 Tf (runp\(genseq, mode='p', monitors=\(\), start=True\) ) Tj /F1 10 Tf (to start a bunch a) Tj T* 0 Tw .598876 Tw (generators and return a list of task objects. By default ) Tj /F3 10 Tf (runp ) Tj /F1 10 Tf (use processes, but you can use threads by) Tj T* 0 Tw .225542 Tw (passing ) Tj /F3 10 Tf (mode='t') Tj /F1 10 Tf (. If you do not wont to start the tasks, you can say so \() Tj /F3 10 Tf (start=False) Tj /F1 10 Tf (\). With ) Tj /F3 10 Tf (runp ) Tj /F1 10 Tf (the) Tj T* 0 Tw (parallel pi calculation becomes a one-liner:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 130.0159 cm
+1 0 0 1 62.69291 597.2159 cm
q
q
.976496 0 0 .976496 0 0 cm
@@ -11818,41 +11943,25 @@ Q
Q
Q
q
-1 0 0 1 62.69291 98.01593 cm
+1 0 0 1 62.69291 565.2159 cm
q
BT 1 0 0 1 0 14 Tm 1.05186 Tw 12 TL /F1 10 Tf 0 0 0 rg (The file ) Tj /F3 10 Tf (test_runp ) Tj /F1 10 Tf (in the ) Tj /F3 10 Tf (doc ) Tj /F1 10 Tf (directory of the plac distribution shows another couple of examples of) Tj T* 0 Tw (usage, including how to show the results of the running computation on a ) Tj /F3 10 Tf (TkMonitor) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (41) Tj T* -235.3849 0 Td ET
-Q
-Q
-
-endstream
-endobj
-% 'R388': class PDFStream
-388 0 obj
-% page stream
-<< /Length 6179 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 747.0236 cm
+1 0 0 1 62.69291 535.2159 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (The plac server) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 633.0236 cm
+1 0 0 1 62.69291 421.2159 cm
q
BT 1 0 0 1 0 98 Tm 1.258443 Tw 12 TL /F1 10 Tf 0 0 0 rg (A command-line oriented interface can be easily converted into a socket-based interface. Starting from) Tj T* 0 Tw .930574 Tw (release 0.7 plac features a builtin server which is able to accept commands from multiple clients and to) Tj T* 0 Tw .994692 Tw (execute them. The server works by instantiating a separate interpreter for each client, so that if a client) Tj T* 0 Tw 1.08784 Tw (interpreter dies for any reason the other interpreters keep working. To avoid external dependencies the) Tj T* 0 Tw .872209 Tw (server is based on the ) Tj /F3 10 Tf (asynchat ) Tj /F1 10 Tf (module in the standard library, but it would not be difficult to replace) Tj T* 0 Tw 2.386412 Tw (the server with a different one \(for instance, a Twisted server\). Since ) Tj /F3 10 Tf (asynchat) Tj /F1 10 Tf (-based servers are) Tj T* 0 Tw .755984 Tw (asynchronous, any blocking command in the interpreter should be run in a separated process or thread.) Tj T* 0 Tw 1.157633 Tw (The default port for the ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (server is 2199, and the command to signal end-of-connection is EOF. For) Tj T* 0 Tw (instance, here is how you could manage remote import on a database \(say a SQLite db\):) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 503.8236 cm
+1 0 0 1 62.69291 292.0159 cm
q
q
1 0 0 1 0 0 cm
@@ -11873,13 +11982,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 483.8236 cm
+1 0 0 1 62.69291 272.0159 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (You can connect to the server with ) Tj /F3 10 Tf (telnet ) Tj /F1 10 Tf (on port 2199, as follows:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 306.6236 cm
+1 0 0 1 62.69291 94.81593 cm
q
q
1 0 0 1 0 0 cm
@@ -11899,25 +12008,41 @@ Q
Q
Q
q
-1 0 0 1 62.69291 276.6236 cm
+1 0 0 1 56.69291 56.69291 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (42) Tj T* -235.3849 0 Td ET
+Q
+Q
+
+endstream
+endobj
+% 'R393': class PDFStream
+393 0 obj
+% page stream
+<< /Length 6758 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 747.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Summary) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 234.6236 cm
+1 0 0 1 62.69291 705.0236 cm
q
BT 1 0 0 1 0 26 Tm 2.203318 Tw 12 TL /F1 10 Tf 0 0 0 rg (Once ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (claimed to be the easiest command-line arguments parser in the world. Having read this) Tj T* 0 Tw .673322 Tw (document you may think that it is not so easy after all. But it is a false impression. Actually the rules are) Tj T* 0 Tw (quite simple:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 228.6236 cm
+1 0 0 1 62.69291 699.0236 cm
Q
q
-1 0 0 1 62.69291 228.6236 cm
+1 0 0 1 62.69291 699.0236 cm
Q
q
-1 0 0 1 62.69291 216.6236 cm
+1 0 0 1 62.69291 687.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -11937,10 +12062,10 @@ q
Q
Q
q
-1 0 0 1 62.69291 210.6236 cm
+1 0 0 1 62.69291 681.0236 cm
Q
q
-1 0 0 1 62.69291 162.6236 cm
+1 0 0 1 62.69291 633.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -12012,10 +12137,10 @@ q
Q
Q
q
-1 0 0 1 62.69291 156.6236 cm
+1 0 0 1 62.69291 627.0236 cm
Q
q
-1 0 0 1 62.69291 132.6236 cm
+1 0 0 1 62.69291 603.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -12035,10 +12160,10 @@ q
Q
Q
q
-1 0 0 1 62.69291 126.6236 cm
+1 0 0 1 62.69291 597.0236 cm
Q
q
-1 0 0 1 62.69291 102.6236 cm
+1 0 0 1 62.69291 573.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -12058,26 +12183,10 @@ q
Q
Q
q
-1 0 0 1 62.69291 96.62362 cm
+1 0 0 1 62.69291 567.0236 cm
Q
q
-1 0 0 1 56.69291 56.69291 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (42) Tj T* -235.3849 0 Td ET
-Q
-Q
-
-endstream
-endobj
-% 'R389': class PDFStream
-389 0 obj
-% page stream
-<< /Length 4337 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 741.0236 cm
+1 0 0 1 62.69291 543.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -12097,10 +12206,10 @@ q
Q
Q
q
-1 0 0 1 62.69291 735.0236 cm
+1 0 0 1 62.69291 537.0236 cm
Q
q
-1 0 0 1 62.69291 711.0236 cm
+1 0 0 1 62.69291 513.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
@@ -12120,39 +12229,39 @@ q
Q
Q
q
-1 0 0 1 62.69291 711.0236 cm
+1 0 0 1 62.69291 513.0236 cm
Q
q
-1 0 0 1 62.69291 693.0236 cm
+1 0 0 1 62.69291 495.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Moreover, remember that ) Tj /F3 10 Tf (plac_runner.py ) Tj /F1 10 Tf (is your friend.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 664.6772 cm
+1 0 0 1 62.69291 466.6772 cm
n 0 14.17323 m 469.8898 14.17323 l S
Q
q
-1 0 0 1 62.69291 634.6772 cm
+1 0 0 1 62.69291 436.6772 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Appendix: custom annotation objects) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 604.6772 cm
+1 0 0 1 62.69291 406.6772 cm
q
BT 1 0 0 1 0 14 Tm .578651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Internally ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (uses an ) Tj /F3 10 Tf (Annotation ) Tj /F1 10 Tf (class to convert the tuples in the function signature into annotation) Tj T* 0 Tw (objects, i.e. objects with six attributes ) Tj /F3 10 Tf (help, kind, short, type, choices, metavar) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 574.6772 cm
+1 0 0 1 62.69291 376.6772 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .083735 Tw (Advanced users can implement their own annotation objects. For instance, here is an example of how you) Tj T* 0 Tw (could implement annotations for positional arguments:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 445.4772 cm
+1 0 0 1 62.69291 247.4772 cm
q
q
1 0 0 1 0 0 cm
@@ -12173,14 +12282,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 425.4772 cm
+1 0 0 1 62.69291 227.4772 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (You can use such annotations objects as follows:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 248.2772 cm
+1 0 0 1 62.69291 98.27717 cm
q
q
1 0 0 1 0 0 cm
@@ -12190,25 +12299,34 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 168 re B*
+n -6 -6 468.6898 120 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 146 Tm /F3 10 Tf 12 TL (# example11.py) Tj T* (import plac) Tj T* (from annotations import Positional) Tj T* T* (@plac.annotations\() Tj T* ( i=Positional\("This is an int", int\),) Tj T* ( n=Positional\("This is a float", float\),) Tj T* ( rest=Positional\("Other arguments"\)\)) Tj T* (def main\(i, n, *rest\):) Tj T* ( print\(i, n, rest\)) Tj T* T* (if __name__ == '__main__':) Tj T* ( import plac; plac.call\(main\)) Tj T* ET
+BT 1 0 0 1 0 98 Tm /F3 10 Tf 12 TL (# example11.py) Tj T* (import plac) Tj T* (from annotations import Positional) Tj T* T* (@plac.annotations\() Tj T* ( i=Positional\("This is an int", int\),) Tj T* ( n=Positional\("This is a float", float\),) Tj T* ( rest=Positional\("Other arguments"\)\)) Tj T* (def main\(i, n, *rest\):) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 228.2772 cm
+1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is the usage message you get:) Tj T* ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (43) Tj T* -235.3849 0 Td ET
Q
Q
+
+endstream
+endobj
+% 'R394': class PDFStream
+394 0 obj
+% page stream
+<< /Length 1709 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 99.07717 cm
+1 0 0 1 62.69291 703.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -12218,34 +12336,46 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 120 re B*
+n -6 -6 468.6898 60 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 98 Tm /F3 10 Tf 12 TL (usage: example11.py [-h] i n [rest [rest ...]]) Tj T* T* (positional arguments:) Tj T* ( i This is an int) Tj T* ( n This is a float) Tj T* ( rest Other arguments) Tj T* T* (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* ET
+BT 1 0 0 1 0 38 Tm /F3 10 Tf 12 TL ( print\(i, n, rest\)) Tj T* T* (if __name__ == '__main__':) Tj T* ( import plac; plac.call\(main\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 56.69291 56.69291 cm
+1 0 0 1 62.69291 683.8236 cm
q
0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 235.3849 0 Td (43) Tj T* -235.3849 0 Td ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is the usage message you get:) Tj T* ET
Q
Q
-
-endstream
-endobj
-% 'R390': class PDFStream
-390 0 obj
-% page stream
-<< /Length 693 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 729.0236 cm
+1 0 0 1 62.69291 554.6236 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 120 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 98 Tm /F3 10 Tf 12 TL (usage: example11.py [-h] i n [rest [rest ...]]) Tj T* T* (positional arguments:) Tj T* ( i This is an int) Tj T* ( n This is a float) Tj T* ( rest Other arguments) Tj T* T* (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 510.6236 cm
q
BT 1 0 0 1 0 26 Tm .713516 Tw 12 TL /F1 10 Tf 0 0 0 rg (You can go on and define ) Tj /F3 10 Tf (Option ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (Flag ) Tj /F1 10 Tf (classes, if you like. Using custom annotation objects you) Tj T* 0 Tw .17528 Tw (could do advanced things like extracting the annotations from a configuration file or from a database, but I) Tj T* 0 Tw (expect such use cases to be quite rare: the default mechanism should work pretty well for most users.) Tj T* ET
Q
@@ -12260,364 +12390,364 @@ Q
endstream
endobj
-% 'R391': class PDFPageLabels
-391 0 obj
+% 'R395': class PDFPageLabels
+395 0 obj
% Document Root
<< /Nums [ 0
- 392 0 R
+ 396 0 R
1
- 393 0 R
+ 397 0 R
2
- 394 0 R
+ 398 0 R
3
- 395 0 R
+ 399 0 R
4
- 396 0 R
+ 400 0 R
5
- 397 0 R
+ 401 0 R
6
- 398 0 R
+ 402 0 R
7
- 399 0 R
+ 403 0 R
8
- 400 0 R
+ 404 0 R
9
- 401 0 R
+ 405 0 R
10
- 402 0 R
+ 406 0 R
11
- 403 0 R
+ 407 0 R
12
- 404 0 R
+ 408 0 R
13
- 405 0 R
+ 409 0 R
14
- 406 0 R
+ 410 0 R
15
- 407 0 R
+ 411 0 R
16
- 408 0 R
+ 412 0 R
17
- 409 0 R
+ 413 0 R
18
- 410 0 R
+ 414 0 R
19
- 411 0 R
+ 415 0 R
20
- 412 0 R
+ 416 0 R
21
- 413 0 R
+ 417 0 R
22
- 414 0 R
+ 418 0 R
23
- 415 0 R
+ 419 0 R
24
- 416 0 R
+ 420 0 R
25
- 417 0 R
+ 421 0 R
26
- 418 0 R
+ 422 0 R
27
- 419 0 R
+ 423 0 R
28
- 420 0 R
+ 424 0 R
29
- 421 0 R
+ 425 0 R
30
- 422 0 R
+ 426 0 R
31
- 423 0 R
+ 427 0 R
32
- 424 0 R
+ 428 0 R
33
- 425 0 R
+ 429 0 R
34
- 426 0 R
+ 430 0 R
35
- 427 0 R
+ 431 0 R
36
- 428 0 R
+ 432 0 R
37
- 429 0 R
+ 433 0 R
38
- 430 0 R
+ 434 0 R
39
- 431 0 R
+ 435 0 R
40
- 432 0 R
+ 436 0 R
41
- 433 0 R
+ 437 0 R
42
- 434 0 R
+ 438 0 R
43
- 435 0 R ] >>
-endobj
-% 'R392': class PDFPageLabel
-392 0 obj
-% None
-<< /S /D
- /St 1 >>
-endobj
-% 'R393': class PDFPageLabel
-393 0 obj
-% None
-<< /S /D
- /St 2 >>
-endobj
-% 'R394': class PDFPageLabel
-394 0 obj
-% None
-<< /S /D
- /St 3 >>
-endobj
-% 'R395': class PDFPageLabel
-395 0 obj
-% None
-<< /S /D
- /St 4 >>
+ 439 0 R ] >>
endobj
% 'R396': class PDFPageLabel
396 0 obj
% None
<< /S /D
- /St 5 >>
+ /St 1 >>
endobj
% 'R397': class PDFPageLabel
397 0 obj
% None
<< /S /D
- /St 6 >>
+ /St 2 >>
endobj
% 'R398': class PDFPageLabel
398 0 obj
% None
<< /S /D
- /St 7 >>
+ /St 3 >>
endobj
% 'R399': class PDFPageLabel
399 0 obj
% None
<< /S /D
- /St 8 >>
+ /St 4 >>
endobj
% 'R400': class PDFPageLabel
400 0 obj
% None
<< /S /D
- /St 9 >>
+ /St 5 >>
endobj
% 'R401': class PDFPageLabel
401 0 obj
% None
<< /S /D
- /St 10 >>
+ /St 6 >>
endobj
% 'R402': class PDFPageLabel
402 0 obj
% None
<< /S /D
- /St 11 >>
+ /St 7 >>
endobj
% 'R403': class PDFPageLabel
403 0 obj
% None
<< /S /D
- /St 12 >>
+ /St 8 >>
endobj
% 'R404': class PDFPageLabel
404 0 obj
% None
<< /S /D
- /St 13 >>
+ /St 9 >>
endobj
% 'R405': class PDFPageLabel
405 0 obj
% None
<< /S /D
- /St 14 >>
+ /St 10 >>
endobj
% 'R406': class PDFPageLabel
406 0 obj
% None
<< /S /D
- /St 15 >>
+ /St 11 >>
endobj
% 'R407': class PDFPageLabel
407 0 obj
% None
<< /S /D
- /St 16 >>
+ /St 12 >>
endobj
% 'R408': class PDFPageLabel
408 0 obj
% None
<< /S /D
- /St 17 >>
+ /St 13 >>
endobj
% 'R409': class PDFPageLabel
409 0 obj
% None
<< /S /D
- /St 18 >>
+ /St 14 >>
endobj
% 'R410': class PDFPageLabel
410 0 obj
% None
<< /S /D
- /St 19 >>
+ /St 15 >>
endobj
% 'R411': class PDFPageLabel
411 0 obj
% None
<< /S /D
- /St 20 >>
+ /St 16 >>
endobj
% 'R412': class PDFPageLabel
412 0 obj
% None
<< /S /D
- /St 21 >>
+ /St 17 >>
endobj
% 'R413': class PDFPageLabel
413 0 obj
% None
<< /S /D
- /St 22 >>
+ /St 18 >>
endobj
% 'R414': class PDFPageLabel
414 0 obj
% None
<< /S /D
- /St 23 >>
+ /St 19 >>
endobj
% 'R415': class PDFPageLabel
415 0 obj
% None
<< /S /D
- /St 24 >>
+ /St 20 >>
endobj
% 'R416': class PDFPageLabel
416 0 obj
% None
<< /S /D
- /St 25 >>
+ /St 21 >>
endobj
% 'R417': class PDFPageLabel
417 0 obj
% None
<< /S /D
- /St 26 >>
+ /St 22 >>
endobj
% 'R418': class PDFPageLabel
418 0 obj
% None
<< /S /D
- /St 27 >>
+ /St 23 >>
endobj
% 'R419': class PDFPageLabel
419 0 obj
% None
<< /S /D
- /St 28 >>
+ /St 24 >>
endobj
% 'R420': class PDFPageLabel
420 0 obj
% None
<< /S /D
- /St 29 >>
+ /St 25 >>
endobj
% 'R421': class PDFPageLabel
421 0 obj
% None
<< /S /D
- /St 30 >>
+ /St 26 >>
endobj
% 'R422': class PDFPageLabel
422 0 obj
% None
<< /S /D
- /St 31 >>
+ /St 27 >>
endobj
% 'R423': class PDFPageLabel
423 0 obj
% None
<< /S /D
- /St 32 >>
+ /St 28 >>
endobj
% 'R424': class PDFPageLabel
424 0 obj
% None
<< /S /D
- /St 33 >>
+ /St 29 >>
endobj
% 'R425': class PDFPageLabel
425 0 obj
% None
<< /S /D
- /St 34 >>
+ /St 30 >>
endobj
% 'R426': class PDFPageLabel
426 0 obj
% None
<< /S /D
- /St 35 >>
+ /St 31 >>
endobj
% 'R427': class PDFPageLabel
427 0 obj
% None
<< /S /D
- /St 36 >>
+ /St 32 >>
endobj
% 'R428': class PDFPageLabel
428 0 obj
% None
<< /S /D
- /St 37 >>
+ /St 33 >>
endobj
% 'R429': class PDFPageLabel
429 0 obj
% None
<< /S /D
- /St 38 >>
+ /St 34 >>
endobj
% 'R430': class PDFPageLabel
430 0 obj
% None
<< /S /D
- /St 39 >>
+ /St 35 >>
endobj
% 'R431': class PDFPageLabel
431 0 obj
% None
<< /S /D
- /St 40 >>
+ /St 36 >>
endobj
% 'R432': class PDFPageLabel
432 0 obj
% None
<< /S /D
- /St 41 >>
+ /St 37 >>
endobj
% 'R433': class PDFPageLabel
433 0 obj
% None
<< /S /D
- /St 42 >>
+ /St 38 >>
endobj
% 'R434': class PDFPageLabel
434 0 obj
% None
<< /S /D
- /St 43 >>
+ /St 39 >>
endobj
% 'R435': class PDFPageLabel
435 0 obj
% None
<< /S /D
+ /St 40 >>
+endobj
+% 'R436': class PDFPageLabel
+436 0 obj
+% None
+<< /S /D
+ /St 41 >>
+endobj
+% 'R437': class PDFPageLabel
+437 0 obj
+% None
+<< /S /D
+ /St 42 >>
+endobj
+% 'R438': class PDFPageLabel
+438 0 obj
+% None
+<< /S /D
+ /St 43 >>
+endobj
+% 'R439': class PDFPageLabel
+439 0 obj
+% None
+<< /S /D
/St 44 >>
endobj
xref
-0 436
+0 440
0000000000 65535 f
0000000113 00000 n
0000000246 00000 n
@@ -12815,253 +12945,257 @@ xref
0000050367 00000 n
0000050621 00000 n
0000050873 00000 n
-0000051127 00000 n
-0000051379 00000 n
+0000051126 00000 n
+0000051378 00000 n
0000051631 00000 n
-0000051884 00000 n
-0000052138 00000 n
-0000052392 00000 n
-0000052646 00000 n
-0000052900 00000 n
-0000053183 00000 n
-0000053436 00000 n
-0000053726 00000 n
-0000053980 00000 n
-0000054291 00000 n
-0000054543 00000 n
-0000054780 00000 n
-0000055451 00000 n
-0000055740 00000 n
-0000055992 00000 n
-0000056244 00000 n
-0000056502 00000 n
-0000056756 00000 n
-0000057010 00000 n
-0000057264 00000 n
-0000057518 00000 n
-0000057772 00000 n
-0000058026 00000 n
-0000058271 00000 n
-0000058525 00000 n
-0000058779 00000 n
-0000059033 00000 n
-0000059287 00000 n
-0000059537 00000 n
-0000059993 00000 n
-0000060292 00000 n
-0000060531 00000 n
-0000060852 00000 n
-0000061106 00000 n
-0000061345 00000 n
-0000061676 00000 n
-0000061930 00000 n
-0000062192 00000 n
-0000062446 00000 n
-0000062709 00000 n
-0000062962 00000 n
-0000063225 00000 n
-0000063479 00000 n
-0000063733 00000 n
-0000063986 00000 n
-0000064224 00000 n
-0000064635 00000 n
-0000064900 00000 n
-0000065154 00000 n
-0000065408 00000 n
-0000065647 00000 n
-0000065998 00000 n
-0000066252 00000 n
-0000066506 00000 n
-0000066752 00000 n
-0000067078 00000 n
-0000067362 00000 n
-0000067661 00000 n
-0000067900 00000 n
-0000068221 00000 n
-0000068479 00000 n
-0000068733 00000 n
-0000069001 00000 n
-0000069255 00000 n
-0000069509 00000 n
-0000069770 00000 n
-0000070031 00000 n
-0000070283 00000 n
-0000070536 00000 n
-0000070788 00000 n
-0000071042 00000 n
-0000071296 00000 n
-0000071535 00000 n
-0000071976 00000 n
-0000072230 00000 n
-0000072470 00000 n
-0000072801 00000 n
-0000073053 00000 n
-0000073292 00000 n
-0000073608 00000 n
-0000073907 00000 n
-0000074145 00000 n
-0000074466 00000 n
-0000074705 00000 n
-0000075026 00000 n
-0000075299 00000 n
-0000075553 00000 n
-0000075792 00000 n
-0000076133 00000 n
-0000076372 00000 n
-0000076693 00000 n
-0000076947 00000 n
-0000077205 00000 n
-0000077536 00000 n
-0000077775 00000 n
-0000078096 00000 n
-0000078350 00000 n
-0000078589 00000 n
-0000078905 00000 n
-0000079204 00000 n
-0000079443 00000 n
-0000079764 00000 n
-0000080018 00000 n
-0000080257 00000 n
-0000080588 00000 n
-0000080827 00000 n
-0000081133 00000 n
-0000081418 00000 n
-0000081582 00000 n
-0000081832 00000 n
-0000081961 00000 n
-0000082215 00000 n
-0000082412 00000 n
-0000082626 00000 n
-0000082840 00000 n
-0000083066 00000 n
-0000083268 00000 n
-0000083477 00000 n
-0000083674 00000 n
-0000083877 00000 n
-0000084078 00000 n
-0000084296 00000 n
-0000084497 00000 n
-0000084711 00000 n
-0000084906 00000 n
-0000085104 00000 n
-0000085340 00000 n
-0000085520 00000 n
-0000085744 00000 n
-0000085954 00000 n
+0000051885 00000 n
+0000052137 00000 n
+0000052389 00000 n
+0000052642 00000 n
+0000052896 00000 n
+0000053150 00000 n
+0000053404 00000 n
+0000053658 00000 n
+0000053941 00000 n
+0000054194 00000 n
+0000054484 00000 n
+0000054738 00000 n
+0000055049 00000 n
+0000055301 00000 n
+0000055538 00000 n
+0000056239 00000 n
+0000056528 00000 n
+0000056780 00000 n
+0000057032 00000 n
+0000057290 00000 n
+0000057544 00000 n
+0000057798 00000 n
+0000058052 00000 n
+0000058306 00000 n
+0000058560 00000 n
+0000058814 00000 n
+0000059059 00000 n
+0000059313 00000 n
+0000059567 00000 n
+0000059821 00000 n
+0000060075 00000 n
+0000060325 00000 n
+0000060781 00000 n
+0000061080 00000 n
+0000061319 00000 n
+0000061640 00000 n
+0000061894 00000 n
+0000062133 00000 n
+0000062464 00000 n
+0000062718 00000 n
+0000062980 00000 n
+0000063234 00000 n
+0000063497 00000 n
+0000063750 00000 n
+0000064013 00000 n
+0000064267 00000 n
+0000064521 00000 n
+0000064759 00000 n
+0000065160 00000 n
+0000065413 00000 n
+0000065678 00000 n
+0000065932 00000 n
+0000066186 00000 n
+0000066425 00000 n
+0000066786 00000 n
+0000067025 00000 n
+0000067346 00000 n
+0000067600 00000 n
+0000067861 00000 n
+0000068097 00000 n
+0000068423 00000 n
+0000068722 00000 n
+0000068961 00000 n
+0000069282 00000 n
+0000069540 00000 n
+0000069794 00000 n
+0000070062 00000 n
+0000070316 00000 n
+0000070570 00000 n
+0000070831 00000 n
+0000071077 00000 n
+0000071458 00000 n
+0000071710 00000 n
+0000071963 00000 n
+0000072215 00000 n
+0000072469 00000 n
+0000072723 00000 n
+0000072977 00000 n
+0000073231 00000 n
+0000073471 00000 n
+0000073862 00000 n
+0000074099 00000 n
+0000074420 00000 n
+0000074659 00000 n
+0000074965 00000 n
+0000075264 00000 n
+0000075502 00000 n
+0000075823 00000 n
+0000076077 00000 n
+0000076350 00000 n
+0000076589 00000 n
+0000076930 00000 n
+0000077184 00000 n
+0000077423 00000 n
+0000077739 00000 n
+0000078038 00000 n
+0000078292 00000 n
+0000078565 00000 n
+0000078804 00000 n
+0000079145 00000 n
+0000079384 00000 n
+0000079705 00000 n
+0000079944 00000 n
+0000080250 00000 n
+0000080549 00000 n
+0000080803 00000 n
+0000081042 00000 n
+0000081373 00000 n
+0000081627 00000 n
+0000081866 00000 n
+0000082182 00000 n
+0000082467 00000 n
+0000082631 00000 n
+0000082881 00000 n
+0000083010 00000 n
+0000083264 00000 n
+0000083461 00000 n
+0000083675 00000 n
+0000083889 00000 n
+0000084115 00000 n
+0000084317 00000 n
+0000084526 00000 n
+0000084723 00000 n
+0000084926 00000 n
+0000085127 00000 n
+0000085345 00000 n
+0000085546 00000 n
+0000085760 00000 n
+0000085955 00000 n
0000086153 00000 n
-0000086355 00000 n
-0000086563 00000 n
-0000086768 00000 n
-0000086968 00000 n
-0000087167 00000 n
-0000087377 00000 n
-0000087590 00000 n
-0000087796 00000 n
-0000087998 00000 n
-0000088221 00000 n
-0000088448 00000 n
-0000088648 00000 n
-0000088861 00000 n
-0000089061 00000 n
-0000089253 00000 n
-0000089438 00000 n
-0000089976 00000 n
-0000093012 00000 n
-0000102742 00000 n
-0000108799 00000 n
-0000113063 00000 n
-0000117375 00000 n
-0000121349 00000 n
-0000126629 00000 n
-0000130788 00000 n
-0000135631 00000 n
-0000141986 00000 n
-0000145783 00000 n
-0000150421 00000 n
-0000154337 00000 n
-0000158511 00000 n
-0000164680 00000 n
-0000170719 00000 n
-0000178434 00000 n
-0000186685 00000 n
-0000193406 00000 n
-0000197213 00000 n
-0000202201 00000 n
-0000208418 00000 n
-0000215259 00000 n
-0000219997 00000 n
-0000224425 00000 n
-0000228536 00000 n
-0000233086 00000 n
-0000238142 00000 n
-0000242461 00000 n
-0000247520 00000 n
-0000253056 00000 n
-0000256625 00000 n
-0000261578 00000 n
-0000266708 00000 n
-0000270965 00000 n
-0000276130 00000 n
-0000280974 00000 n
-0000285785 00000 n
-0000291202 00000 n
-0000294718 00000 n
-0000299589 00000 n
-0000305869 00000 n
-0000310307 00000 n
-0000311104 00000 n
-0000311836 00000 n
-0000311915 00000 n
-0000311994 00000 n
-0000312073 00000 n
-0000312152 00000 n
-0000312231 00000 n
-0000312310 00000 n
-0000312389 00000 n
-0000312468 00000 n
-0000312547 00000 n
-0000312627 00000 n
-0000312707 00000 n
-0000312787 00000 n
-0000312867 00000 n
-0000312947 00000 n
-0000313027 00000 n
-0000313107 00000 n
-0000313187 00000 n
-0000313267 00000 n
-0000313347 00000 n
-0000313427 00000 n
-0000313507 00000 n
-0000313587 00000 n
-0000313667 00000 n
-0000313747 00000 n
-0000313827 00000 n
-0000313907 00000 n
-0000313987 00000 n
-0000314067 00000 n
-0000314147 00000 n
-0000314227 00000 n
-0000314307 00000 n
-0000314387 00000 n
-0000314467 00000 n
-0000314547 00000 n
-0000314627 00000 n
-0000314707 00000 n
-0000314787 00000 n
-0000314867 00000 n
-0000314947 00000 n
-0000315027 00000 n
-0000315107 00000 n
-0000315187 00000 n
-0000315267 00000 n
+0000086389 00000 n
+0000086569 00000 n
+0000086793 00000 n
+0000087003 00000 n
+0000087202 00000 n
+0000087404 00000 n
+0000087612 00000 n
+0000087817 00000 n
+0000088017 00000 n
+0000088216 00000 n
+0000088426 00000 n
+0000088639 00000 n
+0000088845 00000 n
+0000089047 00000 n
+0000089270 00000 n
+0000089497 00000 n
+0000089697 00000 n
+0000089910 00000 n
+0000090110 00000 n
+0000090302 00000 n
+0000090487 00000 n
+0000091025 00000 n
+0000094059 00000 n
+0000103789 00000 n
+0000109846 00000 n
+0000114110 00000 n
+0000118422 00000 n
+0000122396 00000 n
+0000127676 00000 n
+0000131835 00000 n
+0000136678 00000 n
+0000143033 00000 n
+0000146830 00000 n
+0000151468 00000 n
+0000155384 00000 n
+0000159558 00000 n
+0000165727 00000 n
+0000171766 00000 n
+0000179481 00000 n
+0000188078 00000 n
+0000194864 00000 n
+0000198677 00000 n
+0000203639 00000 n
+0000209507 00000 n
+0000215979 00000 n
+0000220983 00000 n
+0000224818 00000 n
+0000229308 00000 n
+0000234261 00000 n
+0000239022 00000 n
+0000243642 00000 n
+0000249719 00000 n
+0000254639 00000 n
+0000258668 00000 n
+0000262019 00000 n
+0000267869 00000 n
+0000272448 00000 n
+0000277885 00000 n
+0000282183 00000 n
+0000288270 00000 n
+0000292087 00000 n
+0000297102 00000 n
+0000300714 00000 n
+0000305973 00000 n
+0000312832 00000 n
+0000314646 00000 n
+0000315378 00000 n
+0000315457 00000 n
+0000315536 00000 n
+0000315615 00000 n
+0000315694 00000 n
+0000315773 00000 n
+0000315852 00000 n
+0000315931 00000 n
+0000316010 00000 n
+0000316089 00000 n
+0000316169 00000 n
+0000316249 00000 n
+0000316329 00000 n
+0000316409 00000 n
+0000316489 00000 n
+0000316569 00000 n
+0000316649 00000 n
+0000316729 00000 n
+0000316809 00000 n
+0000316889 00000 n
+0000316969 00000 n
+0000317049 00000 n
+0000317129 00000 n
+0000317209 00000 n
+0000317289 00000 n
+0000317369 00000 n
+0000317449 00000 n
+0000317529 00000 n
+0000317609 00000 n
+0000317689 00000 n
+0000317769 00000 n
+0000317849 00000 n
+0000317929 00000 n
+0000318009 00000 n
+0000318089 00000 n
+0000318169 00000 n
+0000318249 00000 n
+0000318329 00000 n
+0000318409 00000 n
+0000318489 00000 n
+0000318569 00000 n
+0000318649 00000 n
+0000318729 00000 n
+0000318809 00000 n
trailer
<< /ID
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
- [(V\024\000\246}\245Be[\377c~\246\002\332\311) (V\024\000\246}\245Be[\377c~\246\002\332\311)]
+ [(@\241\272\314$\341\035g\323\330\247\312\366\021\262\304) (@\241\272\314$\341\035g\323\330\247\312\366\021\262\304)]
- /Info 308 0 R
- /Root 307 0 R
- /Size 436 >>
+ /Info 312 0 R
+ /Root 311 0 R
+ /Size 440 >>
startxref
-315316
+318858
%%EOF