diff --git a/projet/resources/measures/faogeneve-1m1c.csv b/projet/resources/measures/faogeneve-1m1c-1.csv similarity index 97% rename from projet/resources/measures/faogeneve-1m1c.csv rename to projet/resources/measures/faogeneve-1m1c-1.csv index fd39436d2668e99753c5fdb201e14f8a9dc6924e..799547be3106faa5a8284accfc35ee7ec35eecad 100644 --- a/projet/resources/measures/faogeneve-1m1c.csv +++ b/projet/resources/measures/faogeneve-1m1c-1.csv @@ -540,17 +540,4 @@ 539,990 540,990 541,999 -542,1000 -543,1000 -544,1000 -545,1000 -546,1000 -547,1000 -548,1000 -549,1000 -550,1000 -551,1000 -552,1000 -553,1000 -554,1000 -555,1000 +542,1000 \ No newline at end of file diff --git a/projet/resources/measures/faogeneve-1m6c.csv b/projet/resources/measures/faogeneve-1m6c-1.csv similarity index 96% rename from projet/resources/measures/faogeneve-1m6c.csv rename to projet/resources/measures/faogeneve-1m6c-1.csv index 0b1ad0a5f173936c8cc6976cb23f4c4c22182d50..e8138f057587d7528725a079d3969edca162bd28 100644 --- a/projet/resources/measures/faogeneve-1m6c.csv +++ b/projet/resources/measures/faogeneve-1m6c-1.csv @@ -270,11 +270,3 @@ 269,994 270,998 271,1000 -272,1000 -273,1000 -274,1000 -275,1000 -276,1000 -277,1000 -278,1000 -279,1000 diff --git a/projet/resources/measures/swiss-impex-perfs.csv b/projet/resources/measures/swiss-impex-perfs.csv new file mode 100644 index 0000000000000000000000000000000000000000..4c819ee32f729b1be7ce6bb2b506d7179607a677 --- /dev/null +++ b/projet/resources/measures/swiss-impex-perfs.csv @@ -0,0 +1,104 @@ +id,module_id,time +1,2,28 +2,2,28 +5,2,29 +7,2,35 +9,2,39 +11,2,40 +13,2,42 +15,2,32 +17,2,35 +19,2,30 +21,2,46 +23,2,29 +25,2,37 +27,2,31 +29,2,40 +31,2,30 +33,2,35 +35,2,29 +37,2,32 +39,2,27 +41,2,27 +43,2,22 +45,2,37 +47,2,35 +49,2,29 +51,2,29 +53,2,37 +55,2,30 +57,2,29 +59,2,41 +61,2,59 +63,2,61 +65,2,67 +67,2,76 +69,2,36 +71,2,40 +73,2,39 +75,2,41 +77,2,34 +79,2,47 +81,2,36 +83,2,51 +85,2,47 +87,2,50 +89,2,33 +91,2,34 +93,2,35 +95,2,40 +97,2,34 +99,2,30 +101,2,37 +103,2,42 +105,2,50 +106,2,50 +109,2,51 +110,2,51 +113,2,52 +115,2,44 +117,2,31 +119,2,42 +121,2,42 +123,2,34 +125,2,36 +127,2,40 +129,2,33 +131,2,34 +133,2,37 +135,2,41 +137,2,40 +139,2,38 +141,2,42 +143,2,41 +144,2,42 +147,2,42 +149,2,42 +151,2,33 +153,2,33 +155,2,33 +157,2,33 +159,2,36 +161,2,34 +163,2,33 +165,2,34 +167,2,27 +169,2,34 +171,2,34 +173,2,33 +175,2,31 +177,2,29 +179,2,34 +181,2,31 +183,2,28 +185,2,33 +187,2,35 +189,2,35 +191,2,28 +193,2,34 +195,2,35 +197,2,25 +199,2,31 +201,2,28 +203,2,37 +205,2,37 \ No newline at end of file diff --git a/projet/resources/measures/toimg.py b/projet/resources/measures/toimg.py index e41610597a511350697f656c06593c75e36857fb..e666e4e3395856ca631a9a0665a1ad4b2248dbdd 100644 --- a/projet/resources/measures/toimg.py +++ b/projet/resources/measures/toimg.py @@ -1,5 +1,4 @@ import csv -import os import sys import matplotlib.pyplot as plt @@ -10,7 +9,7 @@ if __name__ == '__main__': plt.xlabel("Temps [s]") plt.ylabel("Documents téléchargés [0-1000]") plt.gcf().subplots_adjust(bottom=0.15) - plt.xticks(np.arange(0, 1000, 50), rotation=70) + plt.xticks(np.arange(0, 1000, 20), rotation=70) plt.yticks(np.arange(0, 1000, 50)) args = sys.argv diff --git a/projet/resources/playbooks/fao-geneve.yml b/projet/resources/playbooks/fao-geneve.yml index da74a4b1ca6e0e24ca3c819e0a1a5d31825d9de1..116eb5d302d46573dcf3ecacb8f04f3055b46fb5 100644 --- a/projet/resources/playbooks/fao-geneve.yml +++ b/projet/resources/playbooks/fao-geneve.yml @@ -1,5 +1,6 @@ clients: # The default management port for a client is 18965 - "127.0.0.1" + - "129.194.187.130" chapters: FAO Geneve: diff --git a/rapport/.vscode/spellright.dict b/rapport/.vscode/spellright.dict index 8821c40a96a41dda21ddb34d40d9c9d05c549fe0..412010c210b0bbedb6b05ee0e5085b8e064f4f6c 100644 --- a/rapport/.vscode/spellright.dict +++ b/rapport/.vscode/spellright.dict @@ -10,3 +10,7 @@ prérequis captcha threads séquentiellement +multiprocessing +workers +débanni +Swiss-Impex diff --git a/rapport/Makefile b/rapport/Makefile index 4b733dcc6d5fd34a24fc82457039c213c6cc12da..7cd50571e43d8d82a3bff3d911a15b8d46d80e9e 100644 --- a/rapport/Makefile +++ b/rapport/Makefile @@ -15,9 +15,9 @@ TEX=$(patsubst %.md,%.tex,$(MD)) all: rapport.pdf rapport.pdf: rapport.tex - xelatex $^ - xelatex $^ - xelatex $^ + xelatex --shell-escape $^ + xelatex --shell-escape $^ + xelatex --shell-escape $^ rapport.tex: config.yaml $(MD) pandoc -s $(OPTIONS) $(PDFOPTIONS) $^ -o $@ diff --git a/rapport/config.yaml b/rapport/config.yaml index f30af7cfbad3311a278edfc3c417ce0f9372cba0..df9f60d27882bfbcb7af2e802156cd767fcfa731 100644 --- a/rapport/config.yaml +++ b/rapport/config.yaml @@ -39,6 +39,7 @@ header-includes: | \usepackage{enumitem} \usepackage[toc]{glossaries} \usepackage{wrapfig} + \usepackage{subcaption} \makenoidxglossaries \sectionfont{\fontsize{12}{15}\selectfont} diff --git a/rapport/figs/faogeneve-1m1c.svg b/rapport/figs/faogeneve-1m1c.svg deleted file mode 100644 index 2b1de8a10450509e4508188fe241e9fae6909f04..0000000000000000000000000000000000000000 --- a/rapport/figs/faogeneve-1m1c.svg +++ /dev/null @@ -1,1968 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Created with matplotlib (https://matplotlib.org/) --> -<svg height="345.6pt" version="1.1" viewBox="0 0 460.8 345.6" width="460.8pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <style type="text/css"> -*{stroke-linecap:butt;stroke-linejoin:round;} - </style> - </defs> - <g id="figure_1"> - <g id="patch_1"> - <path d="M 0 345.6 -L 460.8 345.6 -L 460.8 0 -L 0 0 -z -" style="fill:#ffffff;"/> - </g> - <g id="axes_1"> - <g id="patch_2"> - <path d="M 57.6 293.76 -L 414.72 293.76 -L 414.72 41.472 -L 57.6 41.472 -z -" style="fill:#ffffff;"/> - </g> - <g id="matplotlib.axis_1"> - <g id="xtick_1"> - <g id="line2d_1"> - <defs> - <path d="M 0 0 -L 0 3.5 -" id="mb164b9667e" style="stroke:#000000;stroke-width:0.8;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="73.832727" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_1"> - <!-- 0 --> - <defs> - <path d="M 31.78125 66.40625 -Q 24.171875 66.40625 20.328125 58.90625 -Q 16.5 51.421875 16.5 36.375 -Q 16.5 21.390625 20.328125 13.890625 -Q 24.171875 6.390625 31.78125 6.390625 -Q 39.453125 6.390625 43.28125 13.890625 -Q 47.125 21.390625 47.125 36.375 -Q 47.125 51.421875 43.28125 58.90625 -Q 39.453125 66.40625 31.78125 66.40625 -z -M 31.78125 74.21875 -Q 44.046875 74.21875 50.515625 64.515625 -Q 56.984375 54.828125 56.984375 36.375 -Q 56.984375 17.96875 50.515625 8.265625 -Q 44.046875 -1.421875 31.78125 -1.421875 -Q 19.53125 -1.421875 13.0625 8.265625 -Q 6.59375 17.96875 6.59375 36.375 -Q 6.59375 54.828125 13.0625 64.515625 -Q 19.53125 74.21875 31.78125 74.21875 -z -" id="DejaVuSans-48"/> - </defs> - <g transform="translate(75.33764 309.337613)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_2"> - <g id="line2d_2"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="86.083842" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_2"> - <!-- 10 --> - <defs> - <path d="M 12.40625 8.296875 -L 28.515625 8.296875 -L 28.515625 63.921875 -L 10.984375 60.40625 -L 10.984375 69.390625 -L 28.421875 72.90625 -L 38.28125 72.90625 -L 38.28125 8.296875 -L 54.390625 8.296875 -L 54.390625 0 -L 12.40625 0 -z -" id="DejaVuSans-49"/> - </defs> - <g transform="translate(86.500703 315.316407)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_3"> - <g id="line2d_3"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="98.334957" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_3"> - <!-- 20 --> - <defs> - <path d="M 19.1875 8.296875 -L 53.609375 8.296875 -L 53.609375 0 -L 7.328125 0 -L 7.328125 8.296875 -Q 12.9375 14.109375 22.625 23.890625 -Q 32.328125 33.6875 34.8125 36.53125 -Q 39.546875 41.84375 41.421875 45.53125 -Q 43.3125 49.21875 43.3125 52.78125 -Q 43.3125 58.59375 39.234375 62.25 -Q 35.15625 65.921875 28.609375 65.921875 -Q 23.96875 65.921875 18.8125 64.3125 -Q 13.671875 62.703125 7.8125 59.421875 -L 7.8125 69.390625 -Q 13.765625 71.78125 18.9375 73 -Q 24.125 74.21875 28.421875 74.21875 -Q 39.75 74.21875 46.484375 68.546875 -Q 53.21875 62.890625 53.21875 53.421875 -Q 53.21875 48.921875 51.53125 44.890625 -Q 49.859375 40.875 45.40625 35.40625 -Q 44.1875 33.984375 37.640625 27.21875 -Q 31.109375 20.453125 19.1875 8.296875 -z -" id="DejaVuSans-50"/> - </defs> - <g transform="translate(98.751818 315.316407)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_4"> - <g id="line2d_4"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="110.586072" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_4"> - <!-- 30 --> - <defs> - <path d="M 40.578125 39.3125 -Q 47.65625 37.796875 51.625 33 -Q 55.609375 28.21875 55.609375 21.1875 -Q 55.609375 10.40625 48.1875 4.484375 -Q 40.765625 -1.421875 27.09375 -1.421875 -Q 22.515625 -1.421875 17.65625 -0.515625 -Q 12.796875 0.390625 7.625 2.203125 -L 7.625 11.71875 -Q 11.71875 9.328125 16.59375 8.109375 -Q 21.484375 6.890625 26.8125 6.890625 -Q 36.078125 6.890625 40.9375 10.546875 -Q 45.796875 14.203125 45.796875 21.1875 -Q 45.796875 27.640625 41.28125 31.265625 -Q 36.765625 34.90625 28.71875 34.90625 -L 20.21875 34.90625 -L 20.21875 43.015625 -L 29.109375 43.015625 -Q 36.375 43.015625 40.234375 45.921875 -Q 44.09375 48.828125 44.09375 54.296875 -Q 44.09375 59.90625 40.109375 62.90625 -Q 36.140625 65.921875 28.71875 65.921875 -Q 24.65625 65.921875 20.015625 65.03125 -Q 15.375 64.15625 9.8125 62.3125 -L 9.8125 71.09375 -Q 15.4375 72.65625 20.34375 73.4375 -Q 25.25 74.21875 29.59375 74.21875 -Q 40.828125 74.21875 47.359375 69.109375 -Q 53.90625 64.015625 53.90625 55.328125 -Q 53.90625 49.265625 50.4375 45.09375 -Q 46.96875 40.921875 40.578125 39.3125 -z -" id="DejaVuSans-51"/> - </defs> - <g transform="translate(111.002933 315.316407)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-51"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_5"> - <g id="line2d_5"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="122.837187" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_5"> - <!-- 40 --> - <defs> - <path d="M 37.796875 64.3125 -L 12.890625 25.390625 -L 37.796875 25.390625 -z -M 35.203125 72.90625 -L 47.609375 72.90625 -L 47.609375 25.390625 -L 58.015625 25.390625 -L 58.015625 17.1875 -L 47.609375 17.1875 -L 47.609375 0 -L 37.796875 0 -L 37.796875 17.1875 -L 4.890625 17.1875 -L 4.890625 26.703125 -z -" id="DejaVuSans-52"/> - </defs> - <g transform="translate(123.254048 315.316407)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-52"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_6"> - <g id="line2d_6"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="135.088302" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_6"> - <!-- 50 --> - <defs> - <path d="M 10.796875 72.90625 -L 49.515625 72.90625 -L 49.515625 64.59375 -L 19.828125 64.59375 -L 19.828125 46.734375 -Q 21.96875 47.46875 24.109375 47.828125 -Q 26.265625 48.1875 28.421875 48.1875 -Q 40.625 48.1875 47.75 41.5 -Q 54.890625 34.8125 54.890625 23.390625 -Q 54.890625 11.625 47.5625 5.09375 -Q 40.234375 -1.421875 26.90625 -1.421875 -Q 22.3125 -1.421875 17.546875 -0.640625 -Q 12.796875 0.140625 7.71875 1.703125 -L 7.71875 11.625 -Q 12.109375 9.234375 16.796875 8.0625 -Q 21.484375 6.890625 26.703125 6.890625 -Q 35.15625 6.890625 40.078125 11.328125 -Q 45.015625 15.765625 45.015625 23.390625 -Q 45.015625 31 40.078125 35.4375 -Q 35.15625 39.890625 26.703125 39.890625 -Q 22.75 39.890625 18.8125 39.015625 -Q 14.890625 38.140625 10.796875 36.28125 -z -" id="DejaVuSans-53"/> - </defs> - <g transform="translate(135.505163 315.316407)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-53"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_7"> - <g id="line2d_7"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="147.339417" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_7"> - <!-- 60 --> - <defs> - <path d="M 33.015625 40.375 -Q 26.375 40.375 22.484375 35.828125 -Q 18.609375 31.296875 18.609375 23.390625 -Q 18.609375 15.53125 22.484375 10.953125 -Q 26.375 6.390625 33.015625 6.390625 -Q 39.65625 6.390625 43.53125 10.953125 -Q 47.40625 15.53125 47.40625 23.390625 -Q 47.40625 31.296875 43.53125 35.828125 -Q 39.65625 40.375 33.015625 40.375 -z -M 52.59375 71.296875 -L 52.59375 62.3125 -Q 48.875 64.0625 45.09375 64.984375 -Q 41.3125 65.921875 37.59375 65.921875 -Q 27.828125 65.921875 22.671875 59.328125 -Q 17.53125 52.734375 16.796875 39.40625 -Q 19.671875 43.65625 24.015625 45.921875 -Q 28.375 48.1875 33.59375 48.1875 -Q 44.578125 48.1875 50.953125 41.515625 -Q 57.328125 34.859375 57.328125 23.390625 -Q 57.328125 12.15625 50.6875 5.359375 -Q 44.046875 -1.421875 33.015625 -1.421875 -Q 20.359375 -1.421875 13.671875 8.265625 -Q 6.984375 17.96875 6.984375 36.375 -Q 6.984375 53.65625 15.1875 63.9375 -Q 23.390625 74.21875 37.203125 74.21875 -Q 40.921875 74.21875 44.703125 73.484375 -Q 48.484375 72.75 52.59375 71.296875 -z -" id="DejaVuSans-54"/> - </defs> - <g transform="translate(147.756278 315.316407)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-54"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_8"> - <g id="line2d_8"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="159.590532" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_8"> - <!-- 70 --> - <defs> - <path d="M 8.203125 72.90625 -L 55.078125 72.90625 -L 55.078125 68.703125 -L 28.609375 0 -L 18.3125 0 -L 43.21875 64.59375 -L 8.203125 64.59375 -z -" id="DejaVuSans-55"/> - </defs> - <g transform="translate(160.007393 315.316407)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-55"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_9"> - <g id="line2d_9"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="171.841647" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_9"> - <!-- 80 --> - <defs> - <path d="M 31.78125 34.625 -Q 24.75 34.625 20.71875 30.859375 -Q 16.703125 27.09375 16.703125 20.515625 -Q 16.703125 13.921875 20.71875 10.15625 -Q 24.75 6.390625 31.78125 6.390625 -Q 38.8125 6.390625 42.859375 10.171875 -Q 46.921875 13.96875 46.921875 20.515625 -Q 46.921875 27.09375 42.890625 30.859375 -Q 38.875 34.625 31.78125 34.625 -z -M 21.921875 38.8125 -Q 15.578125 40.375 12.03125 44.71875 -Q 8.5 49.078125 8.5 55.328125 -Q 8.5 64.0625 14.71875 69.140625 -Q 20.953125 74.21875 31.78125 74.21875 -Q 42.671875 74.21875 48.875 69.140625 -Q 55.078125 64.0625 55.078125 55.328125 -Q 55.078125 49.078125 51.53125 44.71875 -Q 48 40.375 41.703125 38.8125 -Q 48.828125 37.15625 52.796875 32.3125 -Q 56.78125 27.484375 56.78125 20.515625 -Q 56.78125 9.90625 50.3125 4.234375 -Q 43.84375 -1.421875 31.78125 -1.421875 -Q 19.734375 -1.421875 13.25 4.234375 -Q 6.78125 9.90625 6.78125 20.515625 -Q 6.78125 27.484375 10.78125 32.3125 -Q 14.796875 37.15625 21.921875 38.8125 -z -M 18.3125 54.390625 -Q 18.3125 48.734375 21.84375 45.5625 -Q 25.390625 42.390625 31.78125 42.390625 -Q 38.140625 42.390625 41.71875 45.5625 -Q 45.3125 48.734375 45.3125 54.390625 -Q 45.3125 60.0625 41.71875 63.234375 -Q 38.140625 66.40625 31.78125 66.40625 -Q 25.390625 66.40625 21.84375 63.234375 -Q 18.3125 60.0625 18.3125 54.390625 -z -" id="DejaVuSans-56"/> - </defs> - <g transform="translate(172.258508 315.316407)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-56"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_10"> - <g id="line2d_10"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="184.092762" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_10"> - <!-- 90 --> - <defs> - <path d="M 10.984375 1.515625 -L 10.984375 10.5 -Q 14.703125 8.734375 18.5 7.8125 -Q 22.3125 6.890625 25.984375 6.890625 -Q 35.75 6.890625 40.890625 13.453125 -Q 46.046875 20.015625 46.78125 33.40625 -Q 43.953125 29.203125 39.59375 26.953125 -Q 35.25 24.703125 29.984375 24.703125 -Q 19.046875 24.703125 12.671875 31.3125 -Q 6.296875 37.9375 6.296875 49.421875 -Q 6.296875 60.640625 12.9375 67.421875 -Q 19.578125 74.21875 30.609375 74.21875 -Q 43.265625 74.21875 49.921875 64.515625 -Q 56.59375 54.828125 56.59375 36.375 -Q 56.59375 19.140625 48.40625 8.859375 -Q 40.234375 -1.421875 26.421875 -1.421875 -Q 22.703125 -1.421875 18.890625 -0.6875 -Q 15.09375 0.046875 10.984375 1.515625 -z -M 30.609375 32.421875 -Q 37.25 32.421875 41.125 36.953125 -Q 45.015625 41.5 45.015625 49.421875 -Q 45.015625 57.28125 41.125 61.84375 -Q 37.25 66.40625 30.609375 66.40625 -Q 23.96875 66.40625 20.09375 61.84375 -Q 16.21875 57.28125 16.21875 49.421875 -Q 16.21875 41.5 20.09375 36.953125 -Q 23.96875 32.421875 30.609375 32.421875 -z -" id="DejaVuSans-57"/> - </defs> - <g transform="translate(184.509623 315.316407)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-57"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_11"> - <g id="line2d_11"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="196.343877" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_11"> - <!-- 100 --> - <g transform="translate(195.672686 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_12"> - <g id="line2d_12"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="208.594991" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_12"> - <!-- 110 --> - <g transform="translate(207.923801 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-49"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_13"> - <g id="line2d_13"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="220.846106" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_13"> - <!-- 120 --> - <g transform="translate(220.174916 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-50"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_14"> - <g id="line2d_14"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="233.097221" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_14"> - <!-- 130 --> - <g transform="translate(232.426031 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-51"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_15"> - <g id="line2d_15"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="245.348336" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_15"> - <!-- 140 --> - <g transform="translate(244.677146 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-52"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_16"> - <g id="line2d_16"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="257.599451" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_16"> - <!-- 150 --> - <g transform="translate(256.928261 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_17"> - <g id="line2d_17"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="269.850566" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_17"> - <!-- 160 --> - <g transform="translate(269.179376 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-54"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_18"> - <g id="line2d_18"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="282.101681" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_18"> - <!-- 170 --> - <g transform="translate(281.430491 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-55"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_19"> - <g id="line2d_19"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="294.352796" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_19"> - <!-- 180 --> - <g transform="translate(293.681605 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-56"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_20"> - <g id="line2d_20"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="306.603911" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_20"> - <!-- 190 --> - <g transform="translate(305.93272 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-57"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_21"> - <g id="line2d_21"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="318.855026" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_21"> - <!-- 200 --> - <g transform="translate(318.183835 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_22"> - <g id="line2d_22"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="331.106141" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_22"> - <!-- 210 --> - <g transform="translate(330.43495 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-49"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_23"> - <g id="line2d_23"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="343.357256" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_23"> - <!-- 220 --> - <g transform="translate(342.686065 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-50"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_24"> - <g id="line2d_24"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="355.60837" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_24"> - <!-- 230 --> - <g transform="translate(354.93718 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-51"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_25"> - <g id="line2d_25"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="367.859485" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_25"> - <!-- 240 --> - <g transform="translate(367.188295 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-52"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_26"> - <g id="line2d_26"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="380.1106" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_26"> - <!-- 250 --> - <g transform="translate(379.43941 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="xtick_27"> - <g id="line2d_27"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="392.361715" xlink:href="#mb164b9667e" y="293.76"/> - </g> - </g> - <g id="text_27"> - <!-- 260 --> - <g transform="translate(391.690525 321.295202)rotate(-70)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-54"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="text_28"> - <!-- Documents téléchargés [0-1000] --> - <defs> - <path d="M 19.671875 64.796875 -L 19.671875 8.109375 -L 31.59375 8.109375 -Q 46.6875 8.109375 53.6875 14.9375 -Q 60.6875 21.78125 60.6875 36.53125 -Q 60.6875 51.171875 53.6875 57.984375 -Q 46.6875 64.796875 31.59375 64.796875 -z -M 9.8125 72.90625 -L 30.078125 72.90625 -Q 51.265625 72.90625 61.171875 64.09375 -Q 71.09375 55.28125 71.09375 36.53125 -Q 71.09375 17.671875 61.125 8.828125 -Q 51.171875 0 30.078125 0 -L 9.8125 0 -z -" id="DejaVuSans-68"/> - <path d="M 30.609375 48.390625 -Q 23.390625 48.390625 19.1875 42.75 -Q 14.984375 37.109375 14.984375 27.296875 -Q 14.984375 17.484375 19.15625 11.84375 -Q 23.34375 6.203125 30.609375 6.203125 -Q 37.796875 6.203125 41.984375 11.859375 -Q 46.1875 17.53125 46.1875 27.296875 -Q 46.1875 37.015625 41.984375 42.703125 -Q 37.796875 48.390625 30.609375 48.390625 -z -M 30.609375 56 -Q 42.328125 56 49.015625 48.375 -Q 55.71875 40.765625 55.71875 27.296875 -Q 55.71875 13.875 49.015625 6.21875 -Q 42.328125 -1.421875 30.609375 -1.421875 -Q 18.84375 -1.421875 12.171875 6.21875 -Q 5.515625 13.875 5.515625 27.296875 -Q 5.515625 40.765625 12.171875 48.375 -Q 18.84375 56 30.609375 56 -z -" id="DejaVuSans-111"/> - <path d="M 48.78125 52.59375 -L 48.78125 44.1875 -Q 44.96875 46.296875 41.140625 47.34375 -Q 37.3125 48.390625 33.40625 48.390625 -Q 24.65625 48.390625 19.8125 42.84375 -Q 14.984375 37.3125 14.984375 27.296875 -Q 14.984375 17.28125 19.8125 11.734375 -Q 24.65625 6.203125 33.40625 6.203125 -Q 37.3125 6.203125 41.140625 7.25 -Q 44.96875 8.296875 48.78125 10.40625 -L 48.78125 2.09375 -Q 45.015625 0.34375 40.984375 -0.53125 -Q 36.96875 -1.421875 32.421875 -1.421875 -Q 20.0625 -1.421875 12.78125 6.34375 -Q 5.515625 14.109375 5.515625 27.296875 -Q 5.515625 40.671875 12.859375 48.328125 -Q 20.21875 56 33.015625 56 -Q 37.15625 56 41.109375 55.140625 -Q 45.0625 54.296875 48.78125 52.59375 -z -" id="DejaVuSans-99"/> - <path d="M 8.5 21.578125 -L 8.5 54.6875 -L 17.484375 54.6875 -L 17.484375 21.921875 -Q 17.484375 14.15625 20.5 10.265625 -Q 23.53125 6.390625 29.59375 6.390625 -Q 36.859375 6.390625 41.078125 11.03125 -Q 45.3125 15.671875 45.3125 23.6875 -L 45.3125 54.6875 -L 54.296875 54.6875 -L 54.296875 0 -L 45.3125 0 -L 45.3125 8.40625 -Q 42.046875 3.421875 37.71875 1 -Q 33.40625 -1.421875 27.6875 -1.421875 -Q 18.265625 -1.421875 13.375 4.4375 -Q 8.5 10.296875 8.5 21.578125 -z -M 31.109375 56 -z -" id="DejaVuSans-117"/> - <path d="M 52 44.1875 -Q 55.375 50.25 60.0625 53.125 -Q 64.75 56 71.09375 56 -Q 79.640625 56 84.28125 50.015625 -Q 88.921875 44.046875 88.921875 33.015625 -L 88.921875 0 -L 79.890625 0 -L 79.890625 32.71875 -Q 79.890625 40.578125 77.09375 44.375 -Q 74.3125 48.1875 68.609375 48.1875 -Q 61.625 48.1875 57.5625 43.546875 -Q 53.515625 38.921875 53.515625 30.90625 -L 53.515625 0 -L 44.484375 0 -L 44.484375 32.71875 -Q 44.484375 40.625 41.703125 44.40625 -Q 38.921875 48.1875 33.109375 48.1875 -Q 26.21875 48.1875 22.15625 43.53125 -Q 18.109375 38.875 18.109375 30.90625 -L 18.109375 0 -L 9.078125 0 -L 9.078125 54.6875 -L 18.109375 54.6875 -L 18.109375 46.1875 -Q 21.1875 51.21875 25.484375 53.609375 -Q 29.78125 56 35.6875 56 -Q 41.65625 56 45.828125 52.96875 -Q 50 49.953125 52 44.1875 -z -" id="DejaVuSans-109"/> - <path d="M 56.203125 29.59375 -L 56.203125 25.203125 -L 14.890625 25.203125 -Q 15.484375 15.921875 20.484375 11.0625 -Q 25.484375 6.203125 34.421875 6.203125 -Q 39.59375 6.203125 44.453125 7.46875 -Q 49.3125 8.734375 54.109375 11.28125 -L 54.109375 2.78125 -Q 49.265625 0.734375 44.1875 -0.34375 -Q 39.109375 -1.421875 33.890625 -1.421875 -Q 20.796875 -1.421875 13.15625 6.1875 -Q 5.515625 13.8125 5.515625 26.8125 -Q 5.515625 40.234375 12.765625 48.109375 -Q 20.015625 56 32.328125 56 -Q 43.359375 56 49.78125 48.890625 -Q 56.203125 41.796875 56.203125 29.59375 -z -M 47.21875 32.234375 -Q 47.125 39.59375 43.09375 43.984375 -Q 39.0625 48.390625 32.421875 48.390625 -Q 24.90625 48.390625 20.390625 44.140625 -Q 15.875 39.890625 15.1875 32.171875 -z -" id="DejaVuSans-101"/> - <path d="M 54.890625 33.015625 -L 54.890625 0 -L 45.90625 0 -L 45.90625 32.71875 -Q 45.90625 40.484375 42.875 44.328125 -Q 39.84375 48.1875 33.796875 48.1875 -Q 26.515625 48.1875 22.3125 43.546875 -Q 18.109375 38.921875 18.109375 30.90625 -L 18.109375 0 -L 9.078125 0 -L 9.078125 54.6875 -L 18.109375 54.6875 -L 18.109375 46.1875 -Q 21.34375 51.125 25.703125 53.5625 -Q 30.078125 56 35.796875 56 -Q 45.21875 56 50.046875 50.171875 -Q 54.890625 44.34375 54.890625 33.015625 -z -" id="DejaVuSans-110"/> - <path d="M 18.3125 70.21875 -L 18.3125 54.6875 -L 36.8125 54.6875 -L 36.8125 47.703125 -L 18.3125 47.703125 -L 18.3125 18.015625 -Q 18.3125 11.328125 20.140625 9.421875 -Q 21.96875 7.515625 27.59375 7.515625 -L 36.8125 7.515625 -L 36.8125 0 -L 27.59375 0 -Q 17.1875 0 13.234375 3.875 -Q 9.28125 7.765625 9.28125 18.015625 -L 9.28125 47.703125 -L 2.6875 47.703125 -L 2.6875 54.6875 -L 9.28125 54.6875 -L 9.28125 70.21875 -z -" id="DejaVuSans-116"/> - <path d="M 44.28125 53.078125 -L 44.28125 44.578125 -Q 40.484375 46.53125 36.375 47.5 -Q 32.28125 48.484375 27.875 48.484375 -Q 21.1875 48.484375 17.84375 46.4375 -Q 14.5 44.390625 14.5 40.28125 -Q 14.5 37.15625 16.890625 35.375 -Q 19.28125 33.59375 26.515625 31.984375 -L 29.59375 31.296875 -Q 39.15625 29.25 43.1875 25.515625 -Q 47.21875 21.78125 47.21875 15.09375 -Q 47.21875 7.46875 41.1875 3.015625 -Q 35.15625 -1.421875 24.609375 -1.421875 -Q 20.21875 -1.421875 15.453125 -0.5625 -Q 10.6875 0.296875 5.421875 2 -L 5.421875 11.28125 -Q 10.40625 8.6875 15.234375 7.390625 -Q 20.0625 6.109375 24.8125 6.109375 -Q 31.15625 6.109375 34.5625 8.28125 -Q 37.984375 10.453125 37.984375 14.40625 -Q 37.984375 18.0625 35.515625 20.015625 -Q 33.0625 21.96875 24.703125 23.78125 -L 21.578125 24.515625 -Q 13.234375 26.265625 9.515625 29.90625 -Q 5.8125 33.546875 5.8125 39.890625 -Q 5.8125 47.609375 11.28125 51.796875 -Q 16.75 56 26.8125 56 -Q 31.78125 56 36.171875 55.265625 -Q 40.578125 54.546875 44.28125 53.078125 -z -" id="DejaVuSans-115"/> - <path id="DejaVuSans-32"/> - <path d="M 56.203125 29.59375 -L 56.203125 25.203125 -L 14.890625 25.203125 -Q 15.484375 15.921875 20.484375 11.0625 -Q 25.484375 6.203125 34.421875 6.203125 -Q 39.59375 6.203125 44.453125 7.46875 -Q 49.3125 8.734375 54.109375 11.28125 -L 54.109375 2.78125 -Q 49.265625 0.734375 44.1875 -0.34375 -Q 39.109375 -1.421875 33.890625 -1.421875 -Q 20.796875 -1.421875 13.15625 6.1875 -Q 5.515625 13.8125 5.515625 26.8125 -Q 5.515625 40.234375 12.765625 48.109375 -Q 20.015625 56 32.328125 56 -Q 43.359375 56 49.78125 48.890625 -Q 56.203125 41.796875 56.203125 29.59375 -z -M 47.21875 32.234375 -Q 47.125 39.59375 43.09375 43.984375 -Q 39.0625 48.390625 32.421875 48.390625 -Q 24.90625 48.390625 20.390625 44.140625 -Q 15.875 39.890625 15.1875 32.171875 -z -M 38.53125 79.984375 -L 48.25 79.984375 -L 32.34375 61.625 -L 24.859375 61.625 -z -" id="DejaVuSans-233"/> - <path d="M 9.421875 75.984375 -L 18.40625 75.984375 -L 18.40625 0 -L 9.421875 0 -z -" id="DejaVuSans-108"/> - <path d="M 54.890625 33.015625 -L 54.890625 0 -L 45.90625 0 -L 45.90625 32.71875 -Q 45.90625 40.484375 42.875 44.328125 -Q 39.84375 48.1875 33.796875 48.1875 -Q 26.515625 48.1875 22.3125 43.546875 -Q 18.109375 38.921875 18.109375 30.90625 -L 18.109375 0 -L 9.078125 0 -L 9.078125 75.984375 -L 18.109375 75.984375 -L 18.109375 46.1875 -Q 21.34375 51.125 25.703125 53.5625 -Q 30.078125 56 35.796875 56 -Q 45.21875 56 50.046875 50.171875 -Q 54.890625 44.34375 54.890625 33.015625 -z -" id="DejaVuSans-104"/> - <path d="M 34.28125 27.484375 -Q 23.390625 27.484375 19.1875 25 -Q 14.984375 22.515625 14.984375 16.5 -Q 14.984375 11.71875 18.140625 8.90625 -Q 21.296875 6.109375 26.703125 6.109375 -Q 34.1875 6.109375 38.703125 11.40625 -Q 43.21875 16.703125 43.21875 25.484375 -L 43.21875 27.484375 -z -M 52.203125 31.203125 -L 52.203125 0 -L 43.21875 0 -L 43.21875 8.296875 -Q 40.140625 3.328125 35.546875 0.953125 -Q 30.953125 -1.421875 24.3125 -1.421875 -Q 15.921875 -1.421875 10.953125 3.296875 -Q 6 8.015625 6 15.921875 -Q 6 25.140625 12.171875 29.828125 -Q 18.359375 34.515625 30.609375 34.515625 -L 43.21875 34.515625 -L 43.21875 35.40625 -Q 43.21875 41.609375 39.140625 45 -Q 35.0625 48.390625 27.6875 48.390625 -Q 23 48.390625 18.546875 47.265625 -Q 14.109375 46.140625 10.015625 43.890625 -L 10.015625 52.203125 -Q 14.9375 54.109375 19.578125 55.046875 -Q 24.21875 56 28.609375 56 -Q 40.484375 56 46.34375 49.84375 -Q 52.203125 43.703125 52.203125 31.203125 -z -" id="DejaVuSans-97"/> - <path d="M 41.109375 46.296875 -Q 39.59375 47.171875 37.8125 47.578125 -Q 36.03125 48 33.890625 48 -Q 26.265625 48 22.1875 43.046875 -Q 18.109375 38.09375 18.109375 28.8125 -L 18.109375 0 -L 9.078125 0 -L 9.078125 54.6875 -L 18.109375 54.6875 -L 18.109375 46.1875 -Q 20.953125 51.171875 25.484375 53.578125 -Q 30.03125 56 36.53125 56 -Q 37.453125 56 38.578125 55.875 -Q 39.703125 55.765625 41.0625 55.515625 -z -" id="DejaVuSans-114"/> - <path d="M 45.40625 27.984375 -Q 45.40625 37.75 41.375 43.109375 -Q 37.359375 48.484375 30.078125 48.484375 -Q 22.859375 48.484375 18.828125 43.109375 -Q 14.796875 37.75 14.796875 27.984375 -Q 14.796875 18.265625 18.828125 12.890625 -Q 22.859375 7.515625 30.078125 7.515625 -Q 37.359375 7.515625 41.375 12.890625 -Q 45.40625 18.265625 45.40625 27.984375 -z -M 54.390625 6.78125 -Q 54.390625 -7.171875 48.1875 -13.984375 -Q 42 -20.796875 29.203125 -20.796875 -Q 24.46875 -20.796875 20.265625 -20.09375 -Q 16.0625 -19.390625 12.109375 -17.921875 -L 12.109375 -9.1875 -Q 16.0625 -11.328125 19.921875 -12.34375 -Q 23.78125 -13.375 27.78125 -13.375 -Q 36.625 -13.375 41.015625 -8.765625 -Q 45.40625 -4.15625 45.40625 5.171875 -L 45.40625 9.625 -Q 42.625 4.78125 38.28125 2.390625 -Q 33.9375 0 27.875 0 -Q 17.828125 0 11.671875 7.65625 -Q 5.515625 15.328125 5.515625 27.984375 -Q 5.515625 40.671875 11.671875 48.328125 -Q 17.828125 56 27.875 56 -Q 33.9375 56 38.28125 53.609375 -Q 42.625 51.21875 45.40625 46.390625 -L 45.40625 54.6875 -L 54.390625 54.6875 -z -" id="DejaVuSans-103"/> - <path d="M 8.59375 75.984375 -L 29.296875 75.984375 -L 29.296875 69 -L 17.578125 69 -L 17.578125 -6.203125 -L 29.296875 -6.203125 -L 29.296875 -13.1875 -L 8.59375 -13.1875 -z -" id="DejaVuSans-91"/> - <path d="M 4.890625 31.390625 -L 31.203125 31.390625 -L 31.203125 23.390625 -L 4.890625 23.390625 -z -" id="DejaVuSans-45"/> - <path d="M 30.421875 75.984375 -L 30.421875 -13.1875 -L 9.71875 -13.1875 -L 9.71875 -6.203125 -L 21.390625 -6.203125 -L 21.390625 69 -L 9.71875 69 -L 9.71875 75.984375 -z -" id="DejaVuSans-93"/> - </defs> - <g transform="translate(153.554531 334.004934)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-68"/> - <use x="77.001953" xlink:href="#DejaVuSans-111"/> - <use x="138.183594" xlink:href="#DejaVuSans-99"/> - <use x="193.164062" xlink:href="#DejaVuSans-117"/> - <use x="256.542969" xlink:href="#DejaVuSans-109"/> - <use x="353.955078" xlink:href="#DejaVuSans-101"/> - <use x="415.478516" xlink:href="#DejaVuSans-110"/> - <use x="478.857422" xlink:href="#DejaVuSans-116"/> - <use x="518.066406" xlink:href="#DejaVuSans-115"/> - <use x="570.166016" xlink:href="#DejaVuSans-32"/> - <use x="601.953125" xlink:href="#DejaVuSans-116"/> - <use x="641.162109" xlink:href="#DejaVuSans-233"/> - <use x="702.685547" xlink:href="#DejaVuSans-108"/> - <use x="730.46875" xlink:href="#DejaVuSans-233"/> - <use x="791.992188" xlink:href="#DejaVuSans-99"/> - <use x="846.972656" xlink:href="#DejaVuSans-104"/> - <use x="910.351562" xlink:href="#DejaVuSans-97"/> - <use x="971.630859" xlink:href="#DejaVuSans-114"/> - <use x="1010.994141" xlink:href="#DejaVuSans-103"/> - <use x="1074.470703" xlink:href="#DejaVuSans-233"/> - <use x="1135.994141" xlink:href="#DejaVuSans-115"/> - <use x="1188.09375" xlink:href="#DejaVuSans-32"/> - <use x="1219.880859" xlink:href="#DejaVuSans-91"/> - <use x="1258.894531" xlink:href="#DejaVuSans-48"/> - <use x="1322.517578" xlink:href="#DejaVuSans-45"/> - <use x="1358.601562" xlink:href="#DejaVuSans-49"/> - <use x="1422.224609" xlink:href="#DejaVuSans-48"/> - <use x="1485.847656" xlink:href="#DejaVuSans-48"/> - <use x="1549.470703" xlink:href="#DejaVuSans-48"/> - <use x="1613.09375" xlink:href="#DejaVuSans-93"/> - </g> - </g> - </g> - <g id="matplotlib.axis_2"> - <g id="ytick_1"> - <g id="line2d_28"> - <defs> - <path d="M 0 0 -L -3.5 0 -" id="mdd8a0640cb" style="stroke:#000000;stroke-width:0.8;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="282.292364"/> - </g> - </g> - <g id="text_29"> - <!-- 0 --> - <g transform="translate(44.2375 286.091582)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_2"> - <g id="line2d_29"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="270.824727"/> - </g> - </g> - <g id="text_30"> - <!-- 50 --> - <g transform="translate(37.875 274.623946)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-53"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_3"> - <g id="line2d_30"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="259.357091"/> - </g> - </g> - <g id="text_31"> - <!-- 100 --> - <g transform="translate(31.5125 263.15631)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_4"> - <g id="line2d_31"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="247.889455"/> - </g> - </g> - <g id="text_32"> - <!-- 150 --> - <g transform="translate(31.5125 251.688673)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_5"> - <g id="line2d_32"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="236.421818"/> - </g> - </g> - <g id="text_33"> - <!-- 200 --> - <g transform="translate(31.5125 240.221037)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_6"> - <g id="line2d_33"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="224.954182"/> - </g> - </g> - <g id="text_34"> - <!-- 250 --> - <g transform="translate(31.5125 228.753401)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-50"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_7"> - <g id="line2d_34"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="213.486545"/> - </g> - </g> - <g id="text_35"> - <!-- 300 --> - <g transform="translate(31.5125 217.285764)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-51"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_8"> - <g id="line2d_35"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="202.018909"/> - </g> - </g> - <g id="text_36"> - <!-- 350 --> - <g transform="translate(31.5125 205.818128)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-51"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_9"> - <g id="line2d_36"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="190.551273"/> - </g> - </g> - <g id="text_37"> - <!-- 400 --> - <g transform="translate(31.5125 194.350491)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-52"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_10"> - <g id="line2d_37"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="179.083636"/> - </g> - </g> - <g id="text_38"> - <!-- 450 --> - <g transform="translate(31.5125 182.882855)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-52"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_11"> - <g id="line2d_38"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="167.616"/> - </g> - </g> - <g id="text_39"> - <!-- 500 --> - <g transform="translate(31.5125 171.415219)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-53"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_12"> - <g id="line2d_39"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="156.148364"/> - </g> - </g> - <g id="text_40"> - <!-- 550 --> - <g transform="translate(31.5125 159.947582)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-53"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_13"> - <g id="line2d_40"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="144.680727"/> - </g> - </g> - <g id="text_41"> - <!-- 600 --> - <g transform="translate(31.5125 148.479946)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-54"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_14"> - <g id="line2d_41"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="133.213091"/> - </g> - </g> - <g id="text_42"> - <!-- 650 --> - <g transform="translate(31.5125 137.01231)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-54"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_15"> - <g id="line2d_42"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="121.745455"/> - </g> - </g> - <g id="text_43"> - <!-- 700 --> - <g transform="translate(31.5125 125.544673)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-55"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_16"> - <g id="line2d_43"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="110.277818"/> - </g> - </g> - <g id="text_44"> - <!-- 750 --> - <g transform="translate(31.5125 114.077037)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-55"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_17"> - <g id="line2d_44"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="98.810182"/> - </g> - </g> - <g id="text_45"> - <!-- 800 --> - <g transform="translate(31.5125 102.609401)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-56"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_18"> - <g id="line2d_45"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="87.342545"/> - </g> - </g> - <g id="text_46"> - <!-- 850 --> - <g transform="translate(31.5125 91.141764)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-56"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_19"> - <g id="line2d_46"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="75.874909"/> - </g> - </g> - <g id="text_47"> - <!-- 900 --> - <g transform="translate(31.5125 79.674128)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-57"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_20"> - <g id="line2d_47"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="64.407273"/> - </g> - </g> - <g id="text_48"> - <!-- 950 --> - <g transform="translate(31.5125 68.206491)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-57"/> - <use x="63.623047" xlink:href="#DejaVuSans-53"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="ytick_21"> - <g id="line2d_48"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd8a0640cb" y="52.939636"/> - </g> - </g> - <g id="text_49"> - <!-- 1000 --> - <g transform="translate(25.15 56.738855)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-49"/> - <use x="63.623047" xlink:href="#DejaVuSans-48"/> - <use x="127.246094" xlink:href="#DejaVuSans-48"/> - <use x="190.869141" xlink:href="#DejaVuSans-48"/> - </g> - </g> - </g> - <g id="text_50"> - <!-- Temps [s] --> - <defs> - <path d="M -0.296875 72.90625 -L 61.375 72.90625 -L 61.375 64.59375 -L 35.5 64.59375 -L 35.5 0 -L 25.59375 0 -L 25.59375 64.59375 -L -0.296875 64.59375 -z -" id="DejaVuSans-84"/> - <path d="M 18.109375 8.203125 -L 18.109375 -20.796875 -L 9.078125 -20.796875 -L 9.078125 54.6875 -L 18.109375 54.6875 -L 18.109375 46.390625 -Q 20.953125 51.265625 25.265625 53.625 -Q 29.59375 56 35.59375 56 -Q 45.5625 56 51.78125 48.09375 -Q 58.015625 40.1875 58.015625 27.296875 -Q 58.015625 14.40625 51.78125 6.484375 -Q 45.5625 -1.421875 35.59375 -1.421875 -Q 29.59375 -1.421875 25.265625 0.953125 -Q 20.953125 3.328125 18.109375 8.203125 -z -M 48.6875 27.296875 -Q 48.6875 37.203125 44.609375 42.84375 -Q 40.53125 48.484375 33.40625 48.484375 -Q 26.265625 48.484375 22.1875 42.84375 -Q 18.109375 37.203125 18.109375 27.296875 -Q 18.109375 17.390625 22.1875 11.75 -Q 26.265625 6.109375 33.40625 6.109375 -Q 40.53125 6.109375 44.609375 11.75 -Q 48.6875 17.390625 48.6875 27.296875 -z -" id="DejaVuSans-112"/> - </defs> - <g transform="translate(19.070312 191.641)rotate(-90)scale(0.1 -0.1)"> - <use xlink:href="#DejaVuSans-84"/> - <use x="44.083984" xlink:href="#DejaVuSans-101"/> - <use x="105.607422" xlink:href="#DejaVuSans-109"/> - <use x="203.019531" xlink:href="#DejaVuSans-112"/> - <use x="266.496094" xlink:href="#DejaVuSans-115"/> - <use x="318.595703" xlink:href="#DejaVuSans-32"/> - <use x="350.382812" xlink:href="#DejaVuSans-91"/> - <use x="389.396484" xlink:href="#DejaVuSans-115"/> - <use x="441.496094" xlink:href="#DejaVuSans-93"/> - </g> - </g> - </g> - <g id="line2d_49"> - <path clip-path="url(#pa3e036b96b)" d="M 73.832727 282.292364 -L 76.28295 282.292364 -L 77.508062 282.063011 -L 79.958285 278.852073 -L 81.183396 277.705309 -L 82.408508 276.329193 -L 83.633619 275.411782 -L 84.858731 275.411782 -L 87.308954 273.118255 -L 88.534065 273.118255 -L 89.759177 272.888902 -L 90.984288 270.824727 -L 92.2094 270.366022 -L 93.434511 268.5312 -L 94.659623 268.5312 -L 95.884734 267.155084 -L 97.109846 266.237673 -L 98.334957 266.00832 -L 100.78518 264.173498 -L 103.235403 262.797382 -L 104.460515 261.879971 -L 105.685626 260.503855 -L 106.910738 259.357091 -L 108.135849 258.43968 -L 109.360961 257.980975 -L 110.586072 256.146153 -L 111.811184 254.540684 -L 114.261407 252.247156 -L 115.486518 251.788451 -L 116.71163 250.412335 -L 117.936741 249.724276 -L 119.161852 249.265571 -L 120.386964 249.036218 -L 122.837187 246.283985 -L 124.062298 245.595927 -L 125.28741 243.761105 -L 126.512521 243.3024 -L 127.737633 243.3024 -L 128.962744 241.696931 -L 130.187856 241.008873 -L 131.412967 240.77952 -L 132.638079 240.320815 -L 133.86319 238.485993 -L 135.088302 237.797935 -L 136.313413 236.421818 -L 137.538525 235.504407 -L 138.763636 234.128291 -L 139.988748 234.128291 -L 141.213859 232.522822 -L 142.438971 231.834764 -L 143.664082 231.834764 -L 144.889194 231.146705 -L 146.114305 229.541236 -L 147.339417 229.082531 -L 148.564528 227.247709 -L 149.78964 226.789004 -L 151.014751 225.412887 -L 152.239863 224.954182 -L 154.690086 223.578065 -L 155.915197 222.431302 -L 157.140309 221.055185 -L 158.36542 220.367127 -L 159.590532 218.532305 -L 160.815643 217.844247 -L 162.040755 217.614895 -L 163.265866 216.926836 -L 164.490978 215.780073 -L 165.716089 215.321367 -L 166.941201 213.486545 -L 168.166312 213.257193 -L 169.391424 212.569135 -L 170.616535 210.963665 -L 171.841647 210.50496 -L 173.066758 208.899491 -L 174.29187 208.670138 -L 175.516981 206.835316 -L 176.742093 206.376611 -L 177.967204 204.771142 -L 179.192316 204.312436 -L 180.417427 202.477615 -L 181.642539 201.789556 -L 182.86765 200.41344 -L 184.092762 199.725382 -L 185.317873 199.496029 -L 186.542985 197.661207 -L 187.768096 196.743796 -L 188.993208 195.138327 -L 190.218319 194.908975 -L 191.443431 192.8448 -L 192.668542 192.8448 -L 193.893654 191.927389 -L 195.118765 190.551273 -L 196.343877 190.092567 -L 197.568988 188.945804 -L 198.794099 188.257745 -L 200.019211 186.881629 -L 201.244322 186.193571 -L 202.469434 185.27616 -L 203.694545 183.900044 -L 206.144768 182.982633 -L 207.36988 182.065222 -L 208.594991 181.377164 -L 211.045214 180.918458 -L 212.270326 180.2304 -L 213.495437 180.001047 -L 214.720549 178.624931 -L 215.94566 178.166225 -L 217.170772 177.478167 -L 218.395883 176.560756 -L 219.620995 175.872698 -L 220.846106 174.955287 -L 222.071218 174.496582 -L 223.296329 173.579171 -L 224.521441 172.203055 -L 225.746552 171.973702 -L 226.971664 169.909527 -L 228.196775 169.450822 -L 229.421887 167.616 -L 230.646998 167.386647 -L 231.87211 165.322473 -L 233.097221 164.863767 -L 234.322333 163.028945 -L 235.547444 163.028945 -L 236.772556 162.57024 -L 237.997667 161.194124 -L 239.222779 160.735418 -L 240.44789 160.04736 -L 241.673002 158.441891 -L 242.898113 158.441891 -L 244.123225 157.52448 -L 245.348336 156.148364 -L 246.573448 155.919011 -L 247.798559 155.230953 -L 249.023671 154.084189 -L 250.248782 153.854836 -L 253.924117 151.102604 -L 255.149228 149.95584 -L 256.37434 149.267782 -L 257.599451 148.350371 -L 258.824563 147.203607 -L 260.049674 146.974255 -L 261.274786 146.286196 -L 262.499897 145.368785 -L 264.95012 143.992669 -L 266.175232 142.845905 -L 267.400343 141.011084 -L 268.625455 140.781731 -L 271.075678 138.488204 -L 272.300789 138.029498 -L 273.525901 136.653382 -L 274.751012 135.735971 -L 275.976123 135.047913 -L 277.201235 133.442444 -L 278.426346 130.919564 -L 279.651458 130.460858 -L 280.876569 128.626036 -L 282.101681 128.167331 -L 283.326792 126.791215 -L 284.551904 125.873804 -L 285.777015 124.497687 -L 287.002127 124.038982 -L 288.227238 123.350924 -L 289.45235 122.20416 -L 290.677461 121.745455 -L 291.902573 120.828044 -L 293.127684 119.68128 -L 294.352796 119.451927 -L 295.577907 118.534516 -L 296.803019 118.075811 -L 298.02813 117.1584 -L 299.253242 116.470342 -L 300.478353 115.094225 -L 301.703465 113.488756 -L 302.928576 112.571345 -L 304.153688 110.277818 -L 305.378799 110.048465 -L 306.603911 107.984291 -L 307.829022 107.754938 -L 309.054134 106.149469 -L 310.279245 105.461411 -L 311.504357 104.314647 -L 312.729468 103.626589 -L 313.95458 102.250473 -L 317.629914 98.810182 -L 322.53036 98.810182 -L 323.755472 98.122124 -L 324.980583 97.204713 -L 327.430806 95.828596 -L 328.655918 95.828596 -L 331.106141 95.369891 -L 333.556364 95.369891 -L 334.781475 94.681833 -L 336.006587 94.45248 -L 337.231698 93.993775 -L 338.45681 93.305716 -L 340.907033 92.388305 -L 342.132144 91.470895 -L 343.357256 89.865425 -L 344.582367 89.40672 -L 345.807479 87.342545 -L 347.03259 87.113193 -L 348.257702 85.278371 -L 349.482813 84.590313 -L 350.707925 82.755491 -L 351.933036 82.526138 -L 353.158148 82.067433 -L 354.383259 80.461964 -L 355.60837 80.003258 -L 358.058593 78.168436 -L 359.283705 77.480378 -L 360.508816 77.251025 -L 361.733928 75.645556 -L 362.959039 73.810735 -L 364.184151 73.352029 -L 365.409262 71.975913 -L 366.634374 71.287855 -L 367.859485 70.829149 -L 369.084597 68.994327 -L 371.53482 68.076916 -L 372.759931 66.7008 -L 373.985043 65.095331 -L 375.210154 64.407273 -L 376.435266 63.031156 -L 377.660377 62.572451 -L 378.885489 61.65504 -L 380.1106 61.196335 -L 381.335712 59.820218 -L 382.560823 59.590865 -L 383.785935 59.13216 -L 385.011046 58.444102 -L 386.236158 57.526691 -L 387.461269 57.067985 -L 388.686381 55.233164 -L 389.911492 55.003811 -L 391.136604 52.939636 -L 398.487273 52.939636 -L 398.487273 52.939636 -" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/> - </g> - <g id="patch_3"> - <path d="M 57.6 293.76 -L 57.6 41.472 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_4"> - <path d="M 414.72 293.76 -L 414.72 41.472 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_5"> - <path d="M 57.6 293.76 -L 414.72 293.76 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_6"> - <path d="M 57.6 41.472 -L 414.72 41.472 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="text_51"> - <!-- Performances du module FAOGeneve - NScrap --> - <defs> - <path d="M 19.671875 64.796875 -L 19.671875 37.40625 -L 32.078125 37.40625 -Q 38.96875 37.40625 42.71875 40.96875 -Q 46.484375 44.53125 46.484375 51.125 -Q 46.484375 57.671875 42.71875 61.234375 -Q 38.96875 64.796875 32.078125 64.796875 -z -M 9.8125 72.90625 -L 32.078125 72.90625 -Q 44.34375 72.90625 50.609375 67.359375 -Q 56.890625 61.8125 56.890625 51.125 -Q 56.890625 40.328125 50.609375 34.8125 -Q 44.34375 29.296875 32.078125 29.296875 -L 19.671875 29.296875 -L 19.671875 0 -L 9.8125 0 -z -" id="DejaVuSans-80"/> - <path d="M 37.109375 75.984375 -L 37.109375 68.5 -L 28.515625 68.5 -Q 23.6875 68.5 21.796875 66.546875 -Q 19.921875 64.59375 19.921875 59.515625 -L 19.921875 54.6875 -L 34.71875 54.6875 -L 34.71875 47.703125 -L 19.921875 47.703125 -L 19.921875 0 -L 10.890625 0 -L 10.890625 47.703125 -L 2.296875 47.703125 -L 2.296875 54.6875 -L 10.890625 54.6875 -L 10.890625 58.5 -Q 10.890625 67.625 15.140625 71.796875 -Q 19.390625 75.984375 28.609375 75.984375 -z -" id="DejaVuSans-102"/> - <path d="M 45.40625 46.390625 -L 45.40625 75.984375 -L 54.390625 75.984375 -L 54.390625 0 -L 45.40625 0 -L 45.40625 8.203125 -Q 42.578125 3.328125 38.25 0.953125 -Q 33.9375 -1.421875 27.875 -1.421875 -Q 17.96875 -1.421875 11.734375 6.484375 -Q 5.515625 14.40625 5.515625 27.296875 -Q 5.515625 40.1875 11.734375 48.09375 -Q 17.96875 56 27.875 56 -Q 33.9375 56 38.25 53.625 -Q 42.578125 51.265625 45.40625 46.390625 -z -M 14.796875 27.296875 -Q 14.796875 17.390625 18.875 11.75 -Q 22.953125 6.109375 30.078125 6.109375 -Q 37.203125 6.109375 41.296875 11.75 -Q 45.40625 17.390625 45.40625 27.296875 -Q 45.40625 37.203125 41.296875 42.84375 -Q 37.203125 48.484375 30.078125 48.484375 -Q 22.953125 48.484375 18.875 42.84375 -Q 14.796875 37.203125 14.796875 27.296875 -z -" id="DejaVuSans-100"/> - <path d="M 9.8125 72.90625 -L 51.703125 72.90625 -L 51.703125 64.59375 -L 19.671875 64.59375 -L 19.671875 43.109375 -L 48.578125 43.109375 -L 48.578125 34.8125 -L 19.671875 34.8125 -L 19.671875 0 -L 9.8125 0 -z -" id="DejaVuSans-70"/> - <path d="M 34.1875 63.1875 -L 20.796875 26.90625 -L 47.609375 26.90625 -z -M 28.609375 72.90625 -L 39.796875 72.90625 -L 67.578125 0 -L 57.328125 0 -L 50.6875 18.703125 -L 17.828125 18.703125 -L 11.1875 0 -L 0.78125 0 -z -" id="DejaVuSans-65"/> - <path d="M 39.40625 66.21875 -Q 28.65625 66.21875 22.328125 58.203125 -Q 16.015625 50.203125 16.015625 36.375 -Q 16.015625 22.609375 22.328125 14.59375 -Q 28.65625 6.59375 39.40625 6.59375 -Q 50.140625 6.59375 56.421875 14.59375 -Q 62.703125 22.609375 62.703125 36.375 -Q 62.703125 50.203125 56.421875 58.203125 -Q 50.140625 66.21875 39.40625 66.21875 -z -M 39.40625 74.21875 -Q 54.734375 74.21875 63.90625 63.9375 -Q 73.09375 53.65625 73.09375 36.375 -Q 73.09375 19.140625 63.90625 8.859375 -Q 54.734375 -1.421875 39.40625 -1.421875 -Q 24.03125 -1.421875 14.8125 8.828125 -Q 5.609375 19.09375 5.609375 36.375 -Q 5.609375 53.65625 14.8125 63.9375 -Q 24.03125 74.21875 39.40625 74.21875 -z -" id="DejaVuSans-79"/> - <path d="M 59.515625 10.40625 -L 59.515625 29.984375 -L 43.40625 29.984375 -L 43.40625 38.09375 -L 69.28125 38.09375 -L 69.28125 6.78125 -Q 63.578125 2.734375 56.6875 0.65625 -Q 49.8125 -1.421875 42 -1.421875 -Q 24.90625 -1.421875 15.25 8.5625 -Q 5.609375 18.5625 5.609375 36.375 -Q 5.609375 54.25 15.25 64.234375 -Q 24.90625 74.21875 42 74.21875 -Q 49.125 74.21875 55.546875 72.453125 -Q 61.96875 70.703125 67.390625 67.28125 -L 67.390625 56.78125 -Q 61.921875 61.421875 55.765625 63.765625 -Q 49.609375 66.109375 42.828125 66.109375 -Q 29.4375 66.109375 22.71875 58.640625 -Q 16.015625 51.171875 16.015625 36.375 -Q 16.015625 21.625 22.71875 14.15625 -Q 29.4375 6.6875 42.828125 6.6875 -Q 48.046875 6.6875 52.140625 7.59375 -Q 56.25 8.5 59.515625 10.40625 -z -" id="DejaVuSans-71"/> - <path d="M 2.984375 54.6875 -L 12.5 54.6875 -L 29.59375 8.796875 -L 46.6875 54.6875 -L 56.203125 54.6875 -L 35.6875 0 -L 23.484375 0 -z -" id="DejaVuSans-118"/> - <path d="M 9.8125 72.90625 -L 23.09375 72.90625 -L 55.421875 11.921875 -L 55.421875 72.90625 -L 64.984375 72.90625 -L 64.984375 0 -L 51.703125 0 -L 19.390625 60.984375 -L 19.390625 0 -L 9.8125 0 -z -" id="DejaVuSans-78"/> - <path d="M 53.515625 70.515625 -L 53.515625 60.890625 -Q 47.90625 63.578125 42.921875 64.890625 -Q 37.9375 66.21875 33.296875 66.21875 -Q 25.25 66.21875 20.875 63.09375 -Q 16.5 59.96875 16.5 54.203125 -Q 16.5 49.359375 19.40625 46.890625 -Q 22.3125 44.4375 30.421875 42.921875 -L 36.375 41.703125 -Q 47.40625 39.59375 52.65625 34.296875 -Q 57.90625 29 57.90625 20.125 -Q 57.90625 9.515625 50.796875 4.046875 -Q 43.703125 -1.421875 29.984375 -1.421875 -Q 24.8125 -1.421875 18.96875 -0.25 -Q 13.140625 0.921875 6.890625 3.21875 -L 6.890625 13.375 -Q 12.890625 10.015625 18.65625 8.296875 -Q 24.421875 6.59375 29.984375 6.59375 -Q 38.421875 6.59375 43.015625 9.90625 -Q 47.609375 13.234375 47.609375 19.390625 -Q 47.609375 24.75 44.3125 27.78125 -Q 41.015625 30.8125 33.5 32.328125 -L 27.484375 33.5 -Q 16.453125 35.6875 11.515625 40.375 -Q 6.59375 45.0625 6.59375 53.421875 -Q 6.59375 63.09375 13.40625 68.65625 -Q 20.21875 74.21875 32.171875 74.21875 -Q 37.3125 74.21875 42.625 73.28125 -Q 47.953125 72.359375 53.515625 70.515625 -z -" id="DejaVuSans-83"/> - </defs> - <g transform="translate(96.965625 35.472)scale(0.12 -0.12)"> - <use xlink:href="#DejaVuSans-80"/> - <use x="56.677734" xlink:href="#DejaVuSans-101"/> - <use x="118.201172" xlink:href="#DejaVuSans-114"/> - <use x="159.314453" xlink:href="#DejaVuSans-102"/> - <use x="194.519531" xlink:href="#DejaVuSans-111"/> - <use x="255.701172" xlink:href="#DejaVuSans-114"/> - <use x="295.064453" xlink:href="#DejaVuSans-109"/> - <use x="392.476562" xlink:href="#DejaVuSans-97"/> - <use x="453.755859" xlink:href="#DejaVuSans-110"/> - <use x="517.134766" xlink:href="#DejaVuSans-99"/> - <use x="572.115234" xlink:href="#DejaVuSans-101"/> - <use x="633.638672" xlink:href="#DejaVuSans-115"/> - <use x="685.738281" xlink:href="#DejaVuSans-32"/> - <use x="717.525391" xlink:href="#DejaVuSans-100"/> - <use x="781.001953" xlink:href="#DejaVuSans-117"/> - <use x="844.380859" xlink:href="#DejaVuSans-32"/> - <use x="876.167969" xlink:href="#DejaVuSans-109"/> - <use x="973.580078" xlink:href="#DejaVuSans-111"/> - <use x="1034.761719" xlink:href="#DejaVuSans-100"/> - <use x="1098.238281" xlink:href="#DejaVuSans-117"/> - <use x="1161.617188" xlink:href="#DejaVuSans-108"/> - <use x="1189.400391" xlink:href="#DejaVuSans-101"/> - <use x="1250.923828" xlink:href="#DejaVuSans-32"/> - <use x="1282.710938" xlink:href="#DejaVuSans-70"/> - <use x="1331.105469" xlink:href="#DejaVuSans-65"/> - <use x="1397.763672" xlink:href="#DejaVuSans-79"/> - <use x="1476.474609" xlink:href="#DejaVuSans-71"/> - <use x="1553.964844" xlink:href="#DejaVuSans-101"/> - <use x="1615.488281" xlink:href="#DejaVuSans-110"/> - <use x="1678.867188" xlink:href="#DejaVuSans-101"/> - <use x="1740.390625" xlink:href="#DejaVuSans-118"/> - <use x="1799.570312" xlink:href="#DejaVuSans-101"/> - <use x="1861.09375" xlink:href="#DejaVuSans-32"/> - <use x="1892.880859" xlink:href="#DejaVuSans-45"/> - <use x="1928.964844" xlink:href="#DejaVuSans-32"/> - <use x="1960.751953" xlink:href="#DejaVuSans-78"/> - <use x="2035.556641" xlink:href="#DejaVuSans-83"/> - <use x="2099.033203" xlink:href="#DejaVuSans-99"/> - <use x="2154.013672" xlink:href="#DejaVuSans-114"/> - <use x="2195.126953" xlink:href="#DejaVuSans-97"/> - <use x="2256.40625" xlink:href="#DejaVuSans-112"/> - </g> - </g> - </g> - </g> - <defs> - <clipPath id="pa3e036b96b"> - <rect height="252.288" width="357.12" x="57.6" y="41.472"/> - </clipPath> - </defs> -</svg> diff --git a/rapport/my.bib b/rapport/my.bib index fdf9729dd49364f08fa80220688986ab3ac92e2c..b70418f208de1203e2040bcc98a6ba0d9b867074 100644 --- a/rapport/my.bib +++ b/rapport/my.bib @@ -58,6 +58,11 @@ In its fifth year, Data Never Sleeps shows exactly how much data is created ever note = {Library Catalog: www.domo.com} } +@online{noauthor_forum_nodate, + title = {Forum {{D}}.}, + url = {https://www.ezv.admin.ch/dam/ezv/fr/dokumente/stab/forumz-archiv/forum_z_1_2010.pdf.download.pdf/forum_d_1_2010.pdf} +} + @online{noauthor_monthly_nodate, title = {Monthly Minimum Wages - Bi-Annual Data - {{Eurostat}}}, url = {https://ec.europa.eu/eurostat/en/web/products-datasets/-/EARN_MW_CUR}, @@ -131,6 +136,18 @@ In its fifth year, Data Never Sleeps shows exactly how much data is created ever file = {/Users/theo.pirkl/Zotero/storage/EM9I63X5/551192.html} } +@online{soyez_turc_nodate, + title = {Turc mécanique d’Amazon, comment les travailleurs du clic sont devenus esclaves de la machine}, + author = {Soyez, Fabien}, + journaltitle = {CNET France}, + url = {https://www.cnetfrance.fr/news/turc-mecanique-d-amazon-comment-les-travailleurs-du-clic-sont-devenus-esclaves-de-la-machine-39850322.htm}, + urldate = {2020-03-24}, + abstract = {Dans le sillage du Turc mécanique d’Amazon, des millions de “travailleurs du clic” effectuent des “micro-tâches”, au service des algorithmes. Cela préfigure-t-il le travail du futur ?}, + file = {/Users/theo.pirkl/Zotero/storage/FAL33FHN/turc-mecanique-d-amazon-comment-les-travailleurs-du-clic-sont-devenus-esclaves-de-la-machine-39.html}, + langid = {french}, + note = {Library Catalog: www.cnetfrance.fr} +} + @online{weldon_top_nodate, title = {Top 30 {{Free Web Scraping Software}} in 2020}, shorttitle = {Top 30 {{Free Web Scraping Software}} in 2020}, diff --git a/rapport/templates/default.latex b/rapport/templates/default.latex index f0d6eb6a273ffb8c4c5ba8afb4470431d717f043..b0742911c333452e5e8227813c7664c84f9c99ea 100644 --- a/rapport/templates/default.latex +++ b/rapport/templates/default.latex @@ -236,6 +236,7 @@ $endif$ \usepackage[color=black,opacity=0.5,angle=0,scale=1,]{background} \usepackage[absolute]{textpos} \usepackage{tocloft} +\usepackage{svg} % END OF CUSTOM PACKAGES % CUSTOM PACKAGES ROUTINES @@ -275,11 +276,12 @@ $endif$ \caption{#3} \end{figure} } -\newcommand{\cimg}[3]{% \img{path}{settings}{caption} +\newcommand{\cimg}[4]{% \img{path}{settings}{caption}{source} \begin{figure} \centering \includegraphics[#2]{#1} \caption{#3} + \caption*{#4} \end{figure} } diff --git a/rapport/text/0-preface.md b/rapport/text/0-preface.md index 8d07ab1f1d08dfca82cfd74bb4d8139c3642f2cc..a33b990627625bc5271c9cba62fb85a21656ab4d 100644 --- a/rapport/text/0-preface.md +++ b/rapport/text/0-preface.md @@ -1,9 +1,8 @@ # Remerciements {-} -Je souhaite remercier chaleureusement Monsieur Malaspinas, qui m'a apporté son aide, ses encouragements, et ses critiques le long -de ce travail. +Je souhaite remercier chaleureusement Monsieur Malaspinas, qui m'a apporté son aide, ses encouragements et ses critiques le long de ce travail. -Un grand merci à Monsieur Hoerdt, qui m'a pointé sur la technologie sur laquelle se repose ce projet. +Un grand merci à Monsieur Hoerdt, qui m'a aiguillé sur la technologie sur laquelle se repose ce projet. J'aimerais aussi remercier Monsieur Basilico, qui a permis le déploiement de ce projet sur les machines de l'HEPIA. @@ -23,7 +22,7 @@ Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de \end{figure} \begin{tabular}{ p{3cm} p{1cm} p{1cm} p{6cm} } \multicolumn{1}{l}{Candidat :}& & & \multicolumn{1}{l}{Professeur-e(s) responsable(s) :}\\ - \multicolumn{1}{l}{\textbf{Théo PIRKL}} & & & \multicolumn{1}{l}{\textbf{Docteur Orestis Malaspinas}} \\ + \multicolumn{1}{l}{\textbf{Théo PIRKL}} & & & \multicolumn{1}{l}{\textbf{Dr Orestis Malaspinas}} \\ \multicolumn{1}{l}{Filière d'études : ITI} & & & \multicolumn{1}{l}{Travail de semestre soumis à une convention de stage en} \\ \multicolumn{1}{l}{} & & & \multicolumn{1}{l}{entreprise : non} \\ \multicolumn{1}{l}{} & & & \multicolumn{1}{l}{Travail soumis à un contrat de confidentialité : non} \\ diff --git a/rapport/text/1-references.md b/rapport/text/1-references.md index 3f57f7165661f1bc84891d8b35764895bc7ce4ae..78a2658c0ab66cff646c4008dba15e3b8b58c45c 100644 --- a/rapport/text/1-references.md +++ b/rapport/text/1-references.md @@ -5,20 +5,23 @@ \listoffigures #### Référence des URL {-} + +La plupart des illustrations venant de moi, j'ai mis leur emplacement dans ce projet. \begin{tabular}{ p{3cm} p{9cm} } \multicolumn{1}{l}{URL01} & \multicolumn{1}{l}{\url{https://www.domo.com/learn/data-never-sleeps-5}}\\ \multicolumn{1}{l}{URL02} & \multicolumn{1}{l}{\url{https://anti-captcha.com/}} \\ - \multicolumn{1}{l}{URL03} & \multicolumn{1}{l}{\url{https://redmonk.com/sogrady/2020/02/28/language-rankings-1-20/}} \\ + \multicolumn{1}{l}{URL03} & \multicolumn{1}{l}{Disponible dans rapport/figs/infra.png} \\ + \multicolumn{1}{l}{URL04} & \multicolumn{1}{l}{Disponible dans rapport/figs/client-infra.png} \\ + \multicolumn{1}{l}{URL05} & \multicolumn{1}{l}{Disponible dans rapport/figs/js-infra.png} \\ + \multicolumn{1}{l}{URL06} & \multicolumn{1}{l}{Disponible dans rapport/figs/playbook-complex.png} \\ + \multicolumn{1}{l}{URL07} & \multicolumn{1}{l}{Disponible dans rapport/figs/measures/faogeneve-perf-analysis.pdf} \\ + \multicolumn{1}{l}{URL08} & \multicolumn{1}{l}{Disponible dans rapport/figs/measures/faogeneve-perf.pdf} \\ \end{tabular} \pagebreak \listoftables -#### Référence des URL {-} -\begin{tabular}{ p{3cm} p{9cm} } -\end{tabular} - \pagebreak \listofappendices diff --git a/rapport/text/2-introduction.md b/rapport/text/2-introduction.md index 70fee8d05f6acedadd5a7585c260046a61d83cc6..997420cd44dfb1b29bbdbc039044c228751659ca 100644 --- a/rapport/text/2-introduction.md +++ b/rapport/text/2-introduction.md @@ -2,29 +2,11 @@ # Introduction {-} -Une amorce. Elle permet d'accrocher l'intérêt du lecteur. L'introduction -donne ensuite une vision générale du projet. +Obtenir des informations, que ce soit sur Internet ou dans la vie réelle, devient de plus en plus difficile. Les initiatives de données ouvertes, permettant la récupération simple et rapide de données, ne sont pas nombreuses. Chacun propose à sa façon des informations redondantes, incorrectes, parfois redirigeant sur des organismes ou des sites web n'existant plus. Rester à jour est un effort qui peut s'avérer titanesque. +L'Homme étant enclin à faire des erreurs, une solution humaine ne convient pas; on peut se tourner vers l'informatique pour automatiser l'action répétitive qu'est de récupérer un document, mais il faut un système suffisamment flexible pour pouvoir fonctionner sur n'importe quel site. Un intérêt scientifique et social est présent : d'une part, on peut mesurer l'efficacité d'un tel outil pour voir si oui ou non un tel logiciel peut accélérer la récupération de documents, et d'autre part, on peut trouver des applications pratiques où un individu a besoin de récupérer des informations en masse. De tels logiciels peuvent être utiles pour bien des professions, souvent en dehors de l'informatique : un système utilisable par des utilisateurs lambda serait un énorme plus dans un monde où bien des programmes sont inaccessibles au public du fait de leur complexité. -## Motivation {-} +L'objectif de ce travail est donc de proposer un logiciel, que l'on nommera NScrap, étant capable de télécharger des données en masse, suffisamment flexible pour qu'il soit compatible avec la très grande majorités des sites web. Il devra proposer d'une façon ou l'autre un système suffisamment simple pour permettre à un utilisateur lambda de s'en servir. Pour faire un tel logiciel, il est nécessaire de s'inspirer des solutions existantes sur Internet aujourd'hui. Une fois ces dernières présentées, il sera question d'implémenter NScrap en se basant sur la liste des technologies des autres logiciels. Une fois le logiciel conçu, il sera question de mesurer son efficacité et de la comparer avec d'autres logiciels du même genre. -Pourquoi je fais ça - -## Problématique {-} - -J'expliquerai ici la situation d'aujourd'hui; notre capacité à obtenir des informations à très grande vitesse, -l'ultraconnectivité, le paradoxe humain-machine et les problèmes qui en résultent. - -## Présentation du projet {-} - -Une présentation en quelques lignes du projet, ce qu'il permet de faire. - -## Approche méthodologique {-} - -Quelle a été ma façon d'amener la solution que je propose dans ce projet. - -## Structure du projet {-} - -Quels sont les modules, les unités organisationelles de chaque système et sous-système, -un glossaire général. +Nous allons donc suivre le cheminement suivant : commencer par l'analyse des solutions actuelles en passant par les techniques employées, s'inspirer de ses dernières pour implémenter le logiciel dont la structure et le fonctionnement seront présentés; enfin, on mesurera l'efficacité de NScrap sur deux sites web bien différents, de façon à se donner une idée de sa performance. On la comparera avec celles théoriques d'un humain et celles d'autres logiciels, pour enfin conclure ce projet en tentant de déterminer si les objectifs que nous avons fixés sont remplis. \pagebreak \ No newline at end of file diff --git a/rapport/text/3-etude.md b/rapport/text/3-etude.md index 1f3022ecf466fe2f267a3fb850c603be4a40e7f1..c2842345cf7d101a13dfa8409e3af7104858dd67 100644 --- a/rapport/text/3-etude.md +++ b/rapport/text/3-etude.md @@ -1,139 +1,154 @@ # Etude des approches actuelles -Il est aujourd'hui difficile de récupérer des documents en masse[^1]. Sans connaissances en informatique poussées, il est véritablement +Il est aujourd'hui difficile de récupérer des documents en masse. Sans connaissances en informatique poussées, il est véritablement complexe pour un utilisateur lambda d'arriver à ses fins dans ce domaine. -\cimg{figs/data-never-sleeps.png}{scale=0.2}{Ce que produit Internet chaque minute (en 2017)}{r}{200pt} +\cimg{figs/data-never-sleeps.png}{scale=0.2}{Ce que produit Internet chaque minute (en 2017)}{Source : tiré de \url{https://www.domo.com/learn/data-never-sleeps-5}, ref. URL01} + Faciliter la récupération de données est particulièrement important; Forbes estimait en 2018 la création de 2'500'000 *terabytes* de données par jour [@marr_how_nodate]. Cette quantité de données est affolante et il est très facile de se noyer dedans et de perdre de l'information. Pour se donner une idée, l'entreprise Nandex affirme qu'un employé perd 2.5 heures par jour à chercher des documents [@noi_workers_nodate]. La récupération en masse de données est une solution permettant de diminuer la surface de recherche. En récupérant les documents en masse d'un site, on élimine déjà une quantité de documents inutile tout à fait considérable, ce qui permettrait de réduire ces deux heures et demi de perdus chaque jour. -On dénombre aujourd'hui différentes possibilités de récupérer une quantité importante de documents; il n'existe en outre aucun standard -appliqué partout pour ces besoins. Chaque site web, application ou service propose le téléchargement de documents d'une façon différente. +On dénombre aujourd'hui plusieurs possibilités de récupérer une quantité importante de documents; il n'existe en outre aucun standard +pour ces besoins. Chaque site web, application ou service propose le téléchargement de documents d'une façon différente. -Commencons par étudier les différentes solutions dédiées à la récupération en masse de documents. Nous poursuivrons ensuite par -comparer les solutions actuelles avec celle proposée dans ce travail. Ensuite, nous analyserons de façon théorique puis pratique -la solution ici implémentée; nous verrons ensuite plusieurs exemples d'application de ma solution, pour enfin aboutir sur une analyse -critique de ce qui a été dit jusque là. Afin d'éviter de se disperser, nous allons dans ce travail nous limiter uniquement et volontairement -aux sites web comme seule source d'information possible; autrement dit, nous allons exclure par exemple la récupération de documents via une +Commençons par étudier les solutions dédiées à la récupération en masse de documents. Nous les comparerons sous différentes facettes, puis analyserons les points communs entre ces façons de faire. +Afin d'éviter de se disperser, nous allons dans ce travail nous limiter uniquement et volontairement +aux sites web comme seule source d'information possible. Autrement dit, nous allons exclure par exemple la récupération de documents via une application installée sur un poste. -[^1]: On entend par *en masse* la capacité à télécharger des documents en grande quantité, selon certains critères ou non. - ## Etude et analyse -Certains fournisseurs de données (entreprises, entités étatiques, etc.) facilitent l'obtention des documents, par exemple à l'aide d'une (+API_a)[^2], d'une publication régulière sur des flux lisibles directement par un ordinateur[^3]; certains mêmes proposent encore l'envoi de CDs par la poste pour -récupérer leurs données. -Les (+API_a)s restent de nos jours la meilleure méthode de récupération de données possible; elles donnent en effet la liberté à l'utilisateur de +Certains fournisseurs de données (entreprises, entités étatiques, etc.) facilitent l'obtention des documents, par exemple à l'aide d'une (+API_a)[^2], d'une publication régulière sur des flux lisibles directement par un ordinateur[^3]; certains proposaient même il y a encore quelques années l'envoi de CDs par la poste pour récupérer leurs données. +Les (+API_a)s restent de nos jours la meilleure méthode de récupération de données possible. Elles donnent en effet la liberté à l'utilisateur de faire exactement ce qu'il souhaite. Ainsi, il est possible de récupérer des documents correspondant à certains critères sans devoir télécharger l'entièreté du site, contrairement aux autres méthodes qui ne font "que" proposer un format de données déjà lisible pour l'ordinateur. -Malheureusement, les (+API_a)s ne font pas pléthore de nos jours. Beaucoup de sites ne proposent pas d\'(+API_a); dans le cas où elles en proposent, -elles sont souvent payantes, ou accessibles sur permission uniquement. Une (+API_a) représente dans la majorité des cas une fonctionnalité -supplémentaire au site, ce qui signifie des coûts d'exploitation plus élevés pour le propriétaire du site. +Malheureusement, les (+API_a)s sont rares : beaucoup de sites n'en ont pas. Dans le cas où elles en proposent, +elles sont souvent payantes ou accessibles sur permission uniquement. Une (+API_a) représente dans la majorité des cas une fonctionnalité +supplémentaire au site, ce qui augmentes les coûts d'exploitation pour le propriétaire du site. Sans (+API_a), une seule source de données est accessible: le site web lui-même. Dans ce cas, la récupération de documents doit être faite soit par un utilisateur de façon régulière, soit par une machine. C'est naturellement la seconde option que nous allons étudier ici. -Il y a un manque de logiciel de (+scraping_g) existant sur le marché aujourd'hui; très peu de solutions proposant de télécharger des documents -en masse pour un site précis, et il y en a encore moins permettant de télécharger des documents sur n'importe quel site. Deux types de services -existent actuellement sur le marché : les solutions payantes en ligne, de type (+SAAS_a) et les solutions de type (+framework_g). +Il y a un manque de logiciel de scraping existant sur le marché aujourd'hui. Très peu de solutions proposent de télécharger des documents +en masse pour un site précis et il y en a encore moins permettant de télécharger des documents sur n'importe quel site. Deux types de services +existent actuellement sur le marché : les solutions payantes en ligne, de type (+SAAS_a) et les solutions de type framework[^4]. -[^2]: Interface dans un logiciel ou un site permettant à des tierces parties d'interagir de façon controllée avec le service. +[^2]: Interface dans un logiciel ou un site permettant à des tierces parties d'interagir de façon contrôlée avec le service. [^3]: (+RSS_a) est un exemple de flux lisibles par un ordinateur. +[^4]: Un framework est un ensemble de composants permettant de poser les fondations d'un logiciel de façon à ne pas tout programmer de zéro. ## Comparaison et résumé des approches existantes Comme nous l'avons soulevé plus haut, il existe deux solutions dominantes sur le marché à l'heure actuelle. Nous allons maintenant les analyser -sous différents points de vue, ce afin de comprendre les différences de façon de plus profonde. +sous différents points de vue, afin de comprendre les différences de façon de plus profonde. ### Comparaison technique -Les _frameworks_ sont de manière générale offerts, sans support et demandant des connaissances en informatique poussées. Ces derniers sont +Les _framework_ sont, de manière générale, offerts sans support et demandant des connaissances en informatique poussées. Ces derniers sont proposés "en l'état", parfois mal documentés et ont chacun leur lot de complexité (complexité parfois même variable selon les -versions). Toutefois, une fois un (+framework_g) apprivoisé, il est possible, du moment que le (+framework_g) le supporte, de faire absolument n'importe -quoi. Les prérequis pour l'utilisation d'un (+framework_g) sont donc la possession d'un ordinateur connecté à Internet et des connaissances en +versions). Toutefois, une fois un framework maîtrisé, il est possible, du moment que le framework le supporte, de faire absolument ce que l'on veut. +Les prérequis pour l'utilisation d'un framework sont donc la possession d'un ordinateur connecté à Internet et des connaissances en programmation. -Les plateformes (+SAAS_a) possèdent les caractéristiques inverses; elles sont payantes, possèdent un support et demandent moins de connaissances +Les plateformes (+SAAS_a) possèdent les caractéristiques inverses. Elles sont payantes, possèdent un support et demandent moins de connaissances en informatique. Certains services proposent un système "intelligent" capable de détecter précisément ce que souhaite obtenir un utilisateur sur un site juste en surveillant ses clics. Contrairement aux frameworks, la prise en main d'un service en ligne est généralement plus rapide. -Toutefois, les (+SAAS_a) supportent un set de fonctionnalités bien défini; il est donc difficile d'obtenir -des fonctionnalités supplémentaires. Les (+SAAS_a) étant pour la plupart situés sur un ordinateur externe, il est encore nécessaire d'importer les -données récupérées dans son réseau interne (fonctionnalité parfois soumise à des coûts supplémentaires). +Toutefois, les (+SAAS_a) supportent un éventail de fonctionnalités bien défini, il est donc difficile d'obtenir des fonctionnalités supplémentaires. +Les (+SAAS_a) étant pour la plupart situés sur un ordinateur externe, il est encore nécessaire d'importer les données récupérées dans son réseau interne (fonctionnalité parfois soumise à des coûts supplémentaires). -Dans les deux cas, il est nécessaire de prendre du temps pour avoir une compréhension du logiciel; un coût d'application permettra de diminuer +Dans les deux cas, il est nécessaire de prendre du temps pour comprendre comment le logiciel fonctionne. Un coût d'application a tendance à diminuer la courbe d'apprentissage, mais réduira la fenêtre d'action possible; un prix nul et la courbe sera plus forte mais cela permettra de faire plus -une fois les difficultés passées. Un exemple intéressant pourrait être un site web complexe; il sera beaucoup plus facile de gérer cela nous-mêmes -que via des fonctionnalités pré-pensées. +une fois les difficultés passées. Un exemple intéressant pourrait être un site web complexe, il serait beaucoup plus facile de gérer cela nous-mêmes +en entier que via des fonctionnalités pré-pensées. -Au vu de cette comparaison, il n'y a pas de solution meilleure qu'une autre; les deux sont viables et utilisables, dépendamment de qui nous sommes. -Si toutefois les données que nous souhaitons récupérer sont hébergées sur un site complexe[^4], le (+framework_g) s'impose comme la meilleure solution. +Au vu de cette comparaison, il n'y a pas de solution meilleure qu'une autre. Les deux sont viables et utilisables, dépendamment de qui nous sommes et du site que nous essayons de traiter. +Si toutefois les données que nous souhaitons récupérer sont hébergées sur un site complexe[^5], le framework s'impose comme la meilleure solution en terme de maniabilité car elle offre une plus grande liberté d'action à l'utilisateur. -[^4]: Utilisant des technologies comme JavaScript, Flash, etc. +[^5]: Utilisant des technologies comme JavaScript, Flash, etc. ### Comparaison morale -L'informatique propose de nombreuses applications, capables d'à peu près tout. L'intérêt de comprendre comment un logiciel fonctionne ne se limite -plus aujourd'hui à la simple compréhension du logiciel; elle permet aussi d'analyser la moralité de ce dernier. +L'informatique est un outil extrêmement polyvalent. Il y a un véritable intérêt de comprendre comment un logiciel fonctionne qui dépasse la compréhension du code : une bonne compréhension du code permet aussi d'analyser la moralité de ce dernier. Il peut être facile d'ignorer cette facette, en se justifiant par l'argument que la moralité dans un logiciel de téléchargement de données en masse -importe peu. Le marché prouve le contraire; aujourd'hui, Amazon propose _Mechanical Turk_, un service permettant à toute personne souhaitant récupérer -des masses de documents de payer une personne pour le faire. Elle sera payée entre 4 et 5 dollars par jour [@semuels_online_nodate] pour des actions répetitives (comme par exemple récupérer des documents en masse). En supposant qu'une journée de travail est composée de 8 heures, que chaque document +importe peu. Le marché prouve le contraire; en guise d'exemple, Amazon propose _Mechanical Turk_, un service permettant à tous et à toutes de récupérer +des masses de documents en payant une autre personne pour le faire. Elle sera payée entre 4 et 5 dollars par jour [@semuels_online_nodate] pour des actions répétitives (comme par exemple récupérer des documents en masse). En supposant qu'une journée de travail est composée de 8 heures, que chaque document prend 30 secondes à télécharger et qu'il y a un nombre de documents suffisant pour au moins une journée, le téléchargement d'un document est payé entre 0.004$ et 0.005$. Avec de telles sommes, une nouvelle catégorie de précarité est ouverte. -De telles plateformes sont qui plus est perverses; les *workers*[^5] dépendent du maigre revenu pour survivre. Elles ne sont pas toujours en mesure -de quitter leur précarité, et elles éprouvent donc une grande difficulté de se séparer de ces plateformes. +De telles plateformes sont qui plus est perverses; les *turkers*[^6] dépendent du maigre revenu pour survivre. Elles ne sont pas toujours en mesure +de quitter leur précarité, et elles éprouvent donc une grande difficulté à se séparer de ces plateformes. -Soutenir de telles plateformes est bien évidemment amoral; un tel salaire représente environ 50% du plus bas salaire minimum en Europe. [@noauthor_monthly_nodate]. Et la plateforme d'Amazon n'est qu'un exemple parmis d'autres : de tels _sweatshops_ similaires à _Mechanical Turk_ -existent par dizaines, simplement sous d'autres noms. D'autres services, utiles au scraping, proposent la résolution de (+captcha_g) par des humains -(0.001$ par (+captcha_g)) dans des pays pour la plupart pauvres. +Soutenir de telles plateformes est amoral selon certains, qui parlent même "d'esclavage moderne" [@soyez_turc_nodate]. Un tel salaire représente environ 50% du plus bas salaire minimum en Europe. [@noauthor_monthly_nodate]. La plateforme d'Amazon n'est qu'un exemple parmi d'autres : de tels ateliers de misère similaires à _Mechanical Turk_ existent par dizaines. D'autres services, utiles au scraping, proposent la résolution de captcha[^7] par des humains ($0.001\$$ par captcha) dans des pays pour la plupart pauvres. -\cimg{figs/anticaptcha-stats.png}{scale=1.2}{Les statistiques des travailleurs d'un service similaire à Mechanical Turk} +\cimg{figs/anticaptcha-stats.png}{scale=1.2}{Statistique des origines des travailleurs d'un service similaire à Mechanical Turk}{Source : tiré de \url{https://anti-captcha.com/}, ref. URL02} -A l'inverse d'un framework, l'utilisation d'un service tiers est donc un grand risque moral: il n'y a aucune façon de savoir comment un logiciel -fabriqué par un tiers fonctionne. Dès lors, on ignore s'il y a utilisation de plateformes telles que celles citées plus haut. +A l'inverse d'un framework, l'utilisation d'un service tiers pose donc une question morale: il n'y a aucune façon de savoir comment un logiciel +conçu par un tiers fonctionne. Dès lors, on ignore s'il y a utilisation de plateformes telles que celles citées plus haut. -L'utilisation d'un (+framework_g) ne garantit naturellement pas d'éviter d'être amoral; toutefois, avoir un contrôle total du comportement de -l'application évite d'utiliser "par accident" une plateforme exploitant des êtres humains. +L'utilisation d'un framework n'évite naturellement pas d'éviter d'être amoral. Toutefois, avoir un contrôle total du comportement de +l'application permet d'éviter l'utilisation accidentelle une plateforme exploitant des êtres humains. -[^5]: Les travailleurs de cette plateforme. +[^6]: Les travailleurs de cette plateforme. +[^7]: Un système permettant de différencier une machine d'un humain en demandant par exemple de faire une addition ou lire du texte ### Comparaison légale -Dans les analyses faites pour ce produit, aucun service quel qu'il soit n'a semblé violer de loi. Toutefois, certaines pratiques douteuses sont -ressorties de la recherche, en particulier du côté des fournisseurs de service (+SAAS_a). +Dans les analyses faites dans le cadre de ce travail, aucun service quel qu'il soit n'a semblé violer la loi. Toutefois, certaines pratiques douteuses sont +ressorties lors des recherches, en particulier du côté des fournisseurs de service (+SAAS_a). Par exemple, certains services proposent la possibilité de récupérer des masses de données importantes en changeant régulièrement d'adresse IP. -Cette technique permet d'éviter d'être bloqué du service; de cette façon il n'est plus possible pour l'hébergeur de bloquer un client accaparant la -bande passante de son service. Il y a un problème de _fair play_ en utilisant ce genre de logiciel. -On peut aussi noter l'utilisation de service de résolution de (+captcha_g), dont nous parlions plus haut; outre l'aspect amoral de sous-payer des travailleurs +Cette technique permet d'éviter d'être bloqué hors du service. De cette façon il n'est plus possible pour l'hébergeur de bloquer un client accaparant la +bande passante de son service. Il y a un problème de fair play en utilisant ce genre de logiciel. +On peut aussi noter l'utilisation de services de résolution de captcha, dont nous parlions plus haut. Outre l'aspect amoral de sous-payer des travailleurs dans des pays dont la plupart sont en difficulté, l'aspect légal de contourner une protection est tout à fait douteux. C'est toutefois un sujet à -controverse; l'avocate Jennifer Granick dit, en parlant des (+captcha_g)s : _"Technologically and legally (+captcha_g)s can be thought of as -nothing more than a speed bump as opposed to a barrier"_ ("Techniquement et légalement, les (+captcha_g)s peuvent être conçus comme qu'un dos d'âne et non -comme une barrière") [@zetter_is_2010]. -Certains systèmes particulièrement perfectionnés sont mêmes capables de simuler un comportement humain [@zetter_is_2010]. +controverse. L'avocate Jennifer Granick dit, en parlant des captchas : _"Technologically and legally captchas can be thought of as +nothing more than a speed bump as opposed to a barrier"_ ("Techniquement et légalement, les captchas peuvent être compris comme un simple dos d'âne et non comme une barrière") [@zetter_is_2010]. +Certains systèmes particulièrement perfectionnés sont même capables de simuler un comportement humain [@zetter_is_2010]. + +Employer des techniques douteuses n'est pas puni par la loi mais peut être vu du public comme socialement inacceptable[@soyez_turc_nodate]; si une entreprise dépendant de sa renommée utilisait de +telles techniques (et que cela se venait à s'apprendre), cela pourrait nuire à leur image de marque. + +La question légale du scraping est complexe. C'est un sujet décrié par les grandes entreprises ne souhaitant pas voir "leurs" données s'échapper [@bode_court_2019], mais qui semble commencer à être réglementé [@igor_us_2018]. La règle d'or semble être de faire preuve de bon sens en ne causant aucun tord +à l'entreprise fournissant des données[^8]. Pour pouvoir le vérifier, un contrôle total de l'application est nécessaire, ce qui est uniquement possible avec un framework. + +[^8]: Ne pas faire preuve de fair play, comme nous en parlions plus haut, est un exemple d'une entreprise ne faisant pas usage du bon sens. + +## Points communs + +Que l'on parle de scraper ou de (+SAAS_a), les deux méthodes utilisent des systèmes tout à fait similaires. C'est ceux que nous allons analyser ici. -Employer des techniques douteuses n'est pas puni par la loi, mais est socialement inacceptable; si une entreprise dépendant de sa renommée utilisait de -telles techniques et que cela se savait, cela pourrait nuire gravement à leur image de marque. +### XPath -La question légale du scraping est complexe. C'est un sujet décrié par les grandes entreprises ne souhaitant pas voir "leurs" données s'échapper [@bode_court_2019], mais qui commence à être légalisé [@igor_us_2018]. La règle d'or semble être de faire preuve de bon sens en ne causant aucun tord -à l'entreprise fournissant des données[^6]. Pour pouvoir l'affirmer, un contrôle total de l'application est nécessaire, ce qui est à uniquement possible avec un (+framework_g). +Chaque scraper simule les actions d'un humain : cliquer sur tel lien, remplir tel champ, etc. Il est nécessaire de préciser où cliquer : c'est le rôle de XPath. Il permet de traverser la structure d'un document (+XML_a) (comme une page (+HTML_a)) et de se "diriger" vers un ou plusieurs éléments d'une page. Une expression XPath ressemble par exemple à ceci : `//div[contains(@class, "entete")]`. Les structures en HTML étant répétitives et prévisibles, on peut par exemple récolter grâce à une seule expression XPath l'intégralité des articles d'une page. -[^6]: Ne pas faire preuve de _fair play_, comme nous en parlions plus haut, est un exemple d'une entreprise ne faisant pas usage du bon sens. +La très grande majorité des systèmes utilisent XPath car il permet de se rendre sur un élément simplement et de façon très rapide. + +### Navigateur + +Pour scraper un site, il faut un navigateur permettant d'aller d'une page à une autre. Les différentes solutions utilisées n'utilisent pas tous le même navigateur, mais la méthode utilisée semble être relativement la même : le navigateur démarré est contrôlé par le système l'ayant démarré. De cette façon, ce n'est pas un humain qui doit cliquer sur les éléments du navigateur mais des instructions envoyées par le programme. De cette façon, un utilisateur et un scraper sont difficilement distinguables, les deux utilisant le même point d'accès pour se connecter à un site web. + +### Accélération + +Les frameworks ou les (+SAAS_a) utilisent différentes méthodes pour accélérer la récupération de documents, cependant la plus populaire semble être le multiprocessing. Le principe du multiprocessing consiste à démarrer plusieurs fois le même processus, pour pouvoir effectuer une série de tâches en parallèle. C'est une alternative au multithreading, aussi utilisé entre autres pour l'accélération de longues tâches. ## Bilan -Le choix d'un logiciel de scraping n'est pas évident; il demande une réflexion certaine afin de ne pas faire les mêmes erreurs que d'autres. Dépendemment entre autres des documents à télécharger, de la forme juridique de l'utilisateur du (+scraper_g) et de son budget, chaque solution se vaut. -Peu importe la solution choisie, une vigilance accrue doit être prise; respecter les règles, quelles qu'elles soient, est indispensable. Les services de -scraping étant de façon générale mal vus par les entreprises, elles n'ont pas hésité (et n'hésiteront pas) à saisir la justice pour faire arrêter le scraping [@rummler_facebook_nodate] [@schaal_ryanair_2018] de leur site. +Le choix d'un logiciel de scraping n'est pas évident; il demande une réflexion certaine afin de ne pas faire les mêmes erreurs (morales, légales, etc.) que d'autres. Dépendamment entre autres des documents à télécharger, de la forme juridique de l'utilisateur du scraper[^9] et de son budget, chaque solution se vaut. +Peu importe la solution choisie, une vigilance accrue doit être prise. Respecter les règles, quelles qu'elles soient, est indispensable. Les services de +scraping étant de façon générale mal vus par les entreprises, elles n'ont pas hésité (et n'hésitent pas) à saisir la justice pour faire arrêter le scraping [@rummler_facebook_nodate] [@schaal_ryanair_2018] de leur site. -Les frameworks ne sont pas parfaits : leur principal désavantage est leur complexité variable, les rendant impraticables pour les usagers n'étant pas familiers avec la programmation ou l'informatique en général. Toutefois, ils permettent un contrôle accru de la récupération des données, ce qui permet +Les frameworks ne sont pas parfaits : leur principal désavantage est leur complexité variable, les rendant inutilisables pour les usagers n'étant pas familiers avec la programmation ou l'informatique en général. Toutefois, ils permettent un contrôle accru de la récupération des données, ce qui permet d'éviter les problèmes cités plus haut. -Une solution, qui en l'occurence est la solution que nous allons adopter ici, est la création d'un framework permettant de simplifier l'utilisation d'un +Que l'on prenne un framework ou un (+SAAS_a), ces deux solutions n'ont qu'une seule différente notable : leur prix. Les technologies sont fondamentalement les mêmes, peu importe le nombre de fonctionnalités disponibles. + +Une solution, qui en l'occurence est la solution que nous allons étudier ici, est la création d'un framework permettant de simplifier l'utilisation d'un système de scraping. De cette façon, un utilisateur lambda averti serait en mesure de récupérer des informations de n'importe quel site rapidement. Nous allons donc étudier la conception d'un tel système et ce qu'il implique. +[^9]: Logiciel permettant la récupération en masse de documents + \pagebreak \ No newline at end of file diff --git a/rapport/text/4-conception.md b/rapport/text/4-conception.md index 4fac0312d5f3e890ca5cf693ebc6f2a7988dce7f..4796a0c752e29ca23a124db3e6650a29658a0601 100644 --- a/rapport/text/4-conception.md +++ b/rapport/text/4-conception.md @@ -1,53 +1,60 @@ # Méthodologie -Ce chapitre parle en détail de la conception du (+framework_g) NScrap. Nous commencerons par parler en détail de l'architecture, en commençant par l'infrastructure du projet, son langage de programmation, des structures observables; nous continuerons en parlant des structures de données implémentées, pour enfin parler de la communication du projet. +Ce chapitre décrit la conception du framework NScrap. Nous commencerons par parler en détail de l'architecture, en commençant par l'infrastructure du projet, son langage de programmation, des structures observables; nous continuerons en évoquant les structures de données implémentées, pour enfin discuter de la communication du projet. Une fois la partie architecture réalisée, nous décrirons la réalisation de ce projet, en donnant deux exemples de systèmes de scraping implémentés dans ce projet. ## Architecture du projet -L'infrastructure de ce projet a été pensée pour être flexible. En effet, la récupération de données par (+scraping_g) peut être catastrophiquement longue. +L'infrastructure de ce projet a été pensée pour être flexible. En effet, la récupération de données par scraping peut être très longue. En proposant une architecture flexible, les pannes sont tolérables et n'impacteront qu'une fraction du projet. De cette façon, il est tout de même possible de récupérer dans la majorité des cas une partie des informations scrapées. Cela est particulièrement utile sur les scraping de très longue durée. En plus d'être flexible, le but final de NScrap est d'éviter au maximum à l'utilisateur de devoir programmer. Le système proposera des _modules_, capables chacun d'effectuer une activité précise; l'utilisateur pourra ensuite les lier pour créer son programme à la carte; il pourra donc par exemple indiquer de télécharger des données spécifiques du site X, qui sont téléchargées au format XLSX (Excel); les convertir ensuite dans un format facilement lisible comme le format (+CSV_a) pour enfin supprimer les anciens fichiers Excel. -Les modules ne sont, du point de vue de l'utilisateur, que des boîtes noires [^7]. L'utilisateur rentre un certain nombre de paramètre, et un fichier sort du module. Il n'a de cette façon pas besoin de se préoccuper de la partie programmation. +Les modules ne sont, du point de vue de l'utilisateur, que des boîtes noires [^10]. L'utilisateur entre un certain nombre de paramètre, et un fichier sort du module. Il n'a ainsi pas besoin de se préoccuper de la partie programmation. -Du côté utilisateur, on ne s'attend pas de l'utilisateur qu'il sache programmer. Un fichier, nommé _playbook_, décrit chaque action à effectuer et dans quel ordre. Il suffit à l'utilisateur d'utiliser le manuel d'utilisation de NScrap pour savoir s'en servir. _[L'annexe un](#exemple-de-fichier-playbook)_ donne un exemple de _playbook_ sur lequel [nous reviendrons](#Application-pratique-complete). +Du côté utilisateur, on n'attend pas de l'utilisateur qu'il sache programmer. Un fichier, nommé _playbook_, décrit chaque action à effectuer et dans quel ordre. Il suffit à l'utilisateur d'utiliser le manuel d'utilisation de NScrap pour savoir s'en servir. L'annexe un donne un exemple de _playbook_ sur lequel [nous reviendrons](#Application-pratique-complete). -[^7]: En vérité, il ne s'agit pas véritablement de boîtes noires comme l'entendrait par exemple Stallman [@williams_hackers_2002]. L'utilisateur serait tout à fait en mesure d'aller voir comment fonctionne le module et le modifier s'il le souhaitait. +[^10]: En vérité, il ne s'agit pas véritablement de boîtes noires comme l'entendrait par exemple Stallman [@williams_hackers_2002]. L'utilisateur serait tout à fait en mesure d'aller voir comment fonctionne le module et le modifier s'il le souhaitait. ### Infrastructure Scraper un site est une action qui peut être longue. Sur des sites simples, c'est une action qui est relativement rapide, mais sur des sites complexes embarquant du JavaScript pour naviguer sur le site, cela prend beaucoup plus de temps. De plus, tout processus long a un risque plus élevé de planter qu'un processus plus court. -Il est intéressant pour d'énormes masses de données de départager la charge de travail. Ce travail propose deux répartisseurs; le premier, nommé _Schnell_[^8], permet de créer plusieurs processus sur un même hôte. Le second, quant à lui, permet de répartir la quantité de travail sur plusieurs machines. Ces deux répartitions permettent d'effectuer un grand nombre de tâches en même temps. +Il est intéressant pour d'énormes masses de données de répartir la charge de travail. Ce travail propose deux répartisseurs: le premier, nommé _Schnell_[^11], permet de créer plusieurs processus (qu'on appelle _workers_, ou _travailleurs_) sur un même hôte. Le second, quant à lui, permet de répartir la quantité de travail sur plusieurs machines. Ces deux répartitions permettent d'effectuer un grand nombre de tâches en même temps. Les machines travaillant sur une ou plusieurs tâches sont considérées comme les machines _clientes_ : elles n'ont aucun contrôle sur le flux d'exécution et ne connaissent jamais les autres machines. Une machine, quant à elle, est considérée comme le _serveur_ : c'est elle qui va envoyer les tâches aux clients, qui va décider si un client doit s'arrêter et qui peut récupérer les documents téléchargés de chaque client. Le serveur respecte la tolérance aux pannes de l'infrastructure; en cas de plantage, seul le serveur cessera de fonctionner car une fois les tâches envoyées, les clients ne dépendent plus du serveur. Enfin, un second serveur est nécessaire au fonctionnement optimal du service : une base de données permettant de stocker les tâches. Même si la base de données plante, les tâches, effectuées ou non, seront conservées. -\cimg{figs/infra.png}{scale=0.45}{Infrastructure du projet} +\cimg{figs/infra.png}{scale=0.45}{Infrastructure du projet}{Source : réalisé par Théo Pirkl} Le serveur est assez simpliste. Une fois démarré, il va lire un fichier qui permettra de créer les tâches à envoyer aux clients. Une fois ces dernières distribuées, il reste allumé dans le seul but de laisser un accès au panneau de contrôle. Il permet de récupérer les fichiers téléchargés par les clients. Les clients, en revanche, sont plus complexes. Ils sont à l'écoute en permanence de nouvelles commandes de la part du serveur, mais doivent en plus supporter toute l'infrastructure pour les différents processus (en l'occurence, ceux téléchargeant les documents). -Chaque client possède _N_ processus, où _N_ est fixé à l'avance et un processus "principal", contenant deux threads : un en charge de la communication vers l'extérieur et un autre en charge de gérer les communications entre les processus travaillant sur une tâche. Cette configuration, bien que compliquée, permet de gérer n'importe quelle tâche de façon aisée. +Chaque client possède $N$ processus, où $N$ est fixé à l'avance. Ces $N$ threads sont ici pour effectuer les tâches envoyées par le serveur de façon concurrente (c'est l'implémentation du multiprocessing). +Un autre processus, dit "principal", contient deux threads : un en charge de la communication vers l'extérieur et un autre en charge de gérer les communications entre les processus travaillant sur une tâche. Cette configuration, bien que compliquée, permet de gérer n'importe quelle tâche de façon aisée. -\cimg{figs/client-infra.png}{scale=.3}{Infrastructure interne du client} +\cimg{figs/client-infra.png}{scale=.3}{Infrastructure interne du client}{Source : réalisé par Théo Pirkl} -[^8]: _Schnell_ signifie _vite_ ou _rapidement_ en allemand. +[^11]: _Schnell_ signifie _vite_ ou _rapidement_ en allemand. -### Langage de programmation +### Langage de programmation choisi -Le langage choisi pour ce projet a été Python. Python est un langage particulièrement populaire, et ce pour deux raisons : sa facilité de lecture et sa capacité à effectuer des tâches complexes (ce malgré sa simplicité). +Le langage choisi pour ce projet est Python. Python est un langage particulièrement populaire pour deux raisons : sa facilité de lecture et sa capacité à effectuer des tâches complexes (ce malgré sa simplicité). Python est considéré comme le second langage recommandé à apprendre après le HTML [@alison_10_nodate]; c'est donc le premier langage de programmation polyvalent recommandé aux débutants. Il est tellement populaire qu'il est choisi quasiment systématiquement dans les projets de recherche dans l'(+IA_a). +Un de nos buts étant de proposer quelque chose d'accessible au public, il semble logique de choisir un langage qui l'est aussi. En outre, des centaines de milliers de paquets Python existent déjà, rendant la tâche d'interconnecter NScrap à un système extrêmement facile dans bien des cas. Au vu de ces faits, Python est un candidat idéal à l'implémentation de ce projet. +### Technologies choisies + +Nous avons parlé dans le chapitre précédent des technologies en commun entre les (+SAAS_a) et les framework. Certaines technologies existantes ont été réutilisées dans ce projet. La technologie XPath est un excellent exemple : tous les modules utiliseront pour se repérer des expressions XPath. Il n'y a pas plus efficace, et les XPath sont relativement bien documentées, raisons pour lesquelles les XPath seront utilisées dans ce projet. +Nous nous servirons aussi des technologies de multiprocessing, car elles permettent d'accélérer de longues tâches : dans le cadre du scraping, chaque seconde de gagnée est précieuse. +Enfin, nous nous servirons aussi comme tous les autres logiciels de scraping d'un navigateur : nous utiliserons Firefox, installé sur les machines de l'HEPIA, et suffisamment répandu sur les distributions Linux pour ne pas poser de problème de compatibilité. Selenium WebDriver sera le contrôleur permettant au code Python de gérer Firefox. Selenium WebDriver est un contrôleur régulièrement utilisé pour faire du scraping, raison pour laquelle il a été choisi. ### Modèles de données -Différents modèles sont implémentés dans ce projet. Les deux principaux sont certainement les tâches et les modules : un module est en charge d'une action spécifique (les boîtes noires dont nous parlions plus haut). Une tâche, quant à elle, est une instance d'un module. Un module est défini par un numéro d'identification unique, un nom, un fanion déterminant si le module doit effectuer une tâche complexe ou non, et un tableau contenant les arguments attendus pour lancer le module en question. +Différents modèles sont implémentés dans ce projet. Les deux principaux sont les tâches et les modules : un module est en charge d'une action spécifique (les boîtes noires que nous avons cité plus haut). Une tâche, quant à elle, est une instance d'un module. Un module est défini par un numéro d'identification unique, un nom et un fanion déterminant si le module doit effectuer une tâche complexe ou non, et un tableau contenant les arguments attendus pour lancer le module en question. Les tâches sont définies elles aussi par un numéro d'identification unique, par le numéro unique du module que représente la tâche, les arguments à fournir au module pour fonctionner et le nombre de fois que cette tâche a été effectuée. Chaque tâche est effectuée au moins une fois. Si la tâche est accomplie avec succès à la première exécution, alors la tâche est supprimée, sinon elle est relancée. Elle sera relancée au maximum trois fois, puis mise dans la table des tâches en échec. De cette façon il est possible de déterminer quelle tâche a échoué systématiquement et pourquoi (le dernier message d'erreur est inclus avec la tâche). @@ -55,15 +62,17 @@ Enfin, NScrap effectue des mesures de performance pour chaque tâche, ce afin de ### Communication -La communication est faite de deux façons : dans la très grande majorité des cas, on utilise (+ZeroMQ_g) (ou ZMQ), qui permet une communication inter-hôte +La communication est faite de deux façons : dans la très grande majorité des cas, on utilise ZeroMQ[^12] (ou ZMQ), qui permet une communication inter-hôte et inter-processus. ZeroMQ est particulièrement populaire, propose une implémentation en Python et est extrêmement bien documenté. Il possède différents modèles de communication dans lesquels nous ne rentrerons pas en détail; ces derniers permettent en somme d'émettre un message à un ou plusieurs destinataires. +[^12]: Un librairie d'envoi et de réception de messages open-source. + Quand la communication avec ZMQ n'est pas souhaitable ou possible, le protocole (+HTTP_a) est utilisé : le panneau de contrôle utilise par exemple exclusivement HTTP. Les scrapers utilisent aussi (+HTTP_a) car il ne leur est pas possible d'utiliser ZMQ. Pour gérer certains évènements générés par les pages web qu'ils visitent, il est nécessaire d'injecter du javascript dans la page web en question. Ainsi, si la page web fonctionne en partie ou totalement avec Javascript, il est possible d'intercepter les évènements signalant qu'une action s'est produite et agir en conséquence. Utiliser ZMQ dans cette situation aurait été bien plus compliqué qu'utiliser (+HTTP_a). Qui plus est, Javascript permet de lancer des appels HTTP. Il suffit donc de créer un petit serveur web capable de réceptionner les appels HTTP lancés par Javascript. Ainsi, on est tout à fait capable de récupérer les évènements générés par la page web dans notre infrastructure. Un seul serveur web de "surveillance" est démarré par client afin d'éviter de surcharger la machine. -\cimg{figs/js-infra.png}{scale=.4}{Gestion des évènements Javascript} +\cimg{figs/js-infra.png}{scale=.4}{Gestion des évènements Javascript}{Source : réalisé par Théo Pirkl} L'avantage de gérer Javascript est énorme. On estime en 2020 que 95% des sites web se servent de ce langage [@noauthor_usage_nodate] . Dans certains cas, il n'est utilisé qu'à des fins esthétiques. Dans d'autres, toute la navigation du site en dépend. Dans tous les cas, la capacité à pouvoir gérer ce langage est cruciale pour un scraper se voulant modulaire. @@ -72,9 +81,9 @@ Dans d'autres, toute la navigation du site en dépend. Dans tous les cas, la cap Chaque tâche est générée selon le _playbook_ fourni par l'utilisateur. Chaque module spécifié dans le playbook est analysé et génère un nombre de tâches soit pour le client, soit pour le serveur. C'est le serveur qui génère les tâches et les distribue aux clients. Chaque module spécifié dans le playbook peut inclure un nombre variable de paramètres _simples_ ou _complexes_. Les paramètres complexes permettent de rapidement générer une série de valeurs. Prenons un exemple : -\cimg{figs/playbook-complex.png}{}{Exemple de paramètre complexe} +\cimg{figs/playbook-complex.png}{}{Exemple de paramètre complexe}{Source : réalisé par Théo Pirkl} -Le module Swiss Impex va ici considérer le paramètre _year_ et voir qu'une valeur _start_ et _stop_ ont été définies. Il va alors automatiquement remplacer _year_ par toutes les valeurs possibles entre 1989 et 2020 (2020 non inclus). En voyant ensuite _month_, il fera de même. Une fois cela fait pour les tous les paramètres ayant défini _start_ et _stop_, le système générera toutes les combinaisons de valeurs possibles : Swiss Impex avec _month_ à 0, _year_ à 1989, Swiss Impex avec _month_ à 1, _year_ à 1989, etc. +Le module Swiss Impex va ici considérer le paramètre _year_ et voir qu'une valeur _start_ et _end_ ont été définies. Il va alors automatiquement remplacer _year_ par toutes les valeurs possibles entre 1989 et 2020 (2020 non inclus). En voyant ensuite _month_, il fera de même. Une fois cela fait pour les tous les paramètres ayant défini _start_ et _end_, le système générera toutes les combinaisons de valeurs possibles : Swiss Impex avec _month_ à 0, _year_ à 1989, Swiss Impex avec _month_ à 1, _year_ à 1989, etc. Cela permet de générer un très grand nombre de tâches en très peu de lignes. @@ -87,22 +96,20 @@ Différents sites web ont été analysés et traités par NScrap. Ces sites ont | FAO Genève | La Feuille d'Avis Officielle (ou FAO) publie tous les jours des informations sur ces citoyens et entreprises en tout genre. Il peut être intéressant de s'y abonner si l'on souhaite recevoir des nouvelles sur certains mots-clés. Le site ne propose toutefois aucun système d'abonnement et n'en semble pas disposé à en ajouter un. | | | | Swiss Impex | Swiss-Impex propose toutes les statistiques d'import/export de la Suisse. Les informations sur ce site ont déjà permis de détecter des irrégularités et de dévoiler des scandales. Les informations de ce site sont difficiles à récupérer automatiquement, et elles sont en très grand nombre. L'automatisation de la récupération d'informations de ce site serait intéressant. | | | | | | | | -Table: Etude de deux sites intéressants à traiter par NScrap - -Ces deux sites proposent des données étatiques permettant de donner des informations tout à fait intéressantes : des sites en font même la collecte pour les revendre[^9]. +Table: Etude de deux sites intéressants à traiter par NScrap. Source : réalisé par Théo Pirkl -[^9]: [Lex Oculus](https://www.lexoculus.ch), [Easy Monitoring](https://www.easymonitoring.ch/fr/surveillance-fosc) +Ces deux sites proposent des données étatiques permettant de donner des informations tout à fait intéressantes : des sites en font même la collecte pour les revendre[^13]. -\pagebreak +[^13]: [Lex Oculus](https://www.lexoculus.ch), [Easy Monitoring](https://www.easymonitoring.ch/fr/surveillance-fosc) ## Catégorie un : Scrapers simples On définit par un _scraper simple_ un scraper n'ayant pas besoin d'intervenir dans le javascript pour traiter un site. Concrètement, cela signifie qu'il suffit de cliquer sur des éléments hypertexte (boutons, images, liens) pour arriver au-x document-s souhaité-s. La catégorie un regroupe donc tout site ne dépendant pas de Javascript pour naviguer à travers les pages. -Plutôt que de réinventer la roue, NScrap utilise un framework, nommé Scrapy, capable de traiter les sites web rentrant dans la catégorie un. -Ce dernier permet le téléchargement très rapide[^10] de documents sur un site web. +NScrap utilise un framework existant, nommé Scrapy, capable de traiter les sites web rentrant dans la catégorie un. +Ce dernier permet le téléchargement très rapide[^14] de documents sur un site web. -[^10]: Pour plus d'informations sur les performances de Scrapy, voir la section mesures +[^14]: Pour plus d'informations sur les performances de Scrapy, voir la section mesures ### Application pratique : FAO Genève @@ -113,25 +120,25 @@ Les modules présentés ci-dessus sont tout à fait compatibles avec Scrapy, mai ## Catégorie deux : Scrapers complexes -On définit par _scraper complexe_ un scraper ayant *obligatoirement* besoin de Javascript pour traiter un site. En vérité, les scrapers de cette catégorie en ont même besoin ne serait-ce que pour naviguer dessus. Dans cette configuration, tous les modules mentionnés plus tôt sont nécessaires au traitement de documents : la complexité étant plus importante, chaque document prend plus de temps à être récupéré. +On définit par _scraper complexe_ un scraper ayant obligatoirement besoin de Javascript pour traiter et naviguer sur un site. Dans cette configuration, tous les modules mentionnés plus tôt sont nécessaires au traitement de documents : la complexité étant plus importante, chaque document prend plus de temps à être récupéré. Aucun framework de scraping n'est ici utilisé. Pour faire fonctionner un scraper de catégorie deux, on démarre un navigateur (dans notre cas, Firefox) qui va, comme son nom l'indique, naviguer sur le site qu'on veut traiter. On donne au navigateur les instructions à effectuer et elles sont lancées séquentiellement. ### Application pratique : Swiss-Impex Swiss-Impex fonctionne sur une technologie Java-Javascript nommée IceFaces. IceFaces se base sur des appels (+AJAX_a) qui oblige le support de javascript. -Par conséquent, la catégorie deux de scrapers est idéale. Le module _SwissImpex Parser_ interagit avec le navigateur et est capable de se diriger jusqu'au document recherché. Ici, chaque action est envoyé au serveur Swiss-Impex. Il est donc nécessaire d'attendre que chaque action soit acquittée par le serveur avant d'effectuer le prochain clic. Le module de communication Javascript est donc ici utilisé pour garantir une réception des évènements javascript : ici, on s'intéresse aux acquittements du serveur Swiss-Impex. +Par conséquent, la catégorie deux de scrapers est idéale. Le module _SwissImpex Parser_ interagit avec le navigateur et est capable de se diriger jusqu'au document recherché. Ici, chaque action est envoyée au serveur Swiss-Impex. Il est donc nécessaire d'attendre que chaque action soit acquittée par le serveur avant d'effectuer le prochain clic. Le module de communication Javascript est donc ici utilisé pour garantir une réception des évènements javascript : ici, on s'intéresse aux acquittements du serveur Swiss-Impex. -_[L'annexe un](#exemple-de-fichier-playbook)_ donne un exemple de _playbook_ dans lequel on peut voir Swiss Impex apparaître. Ce playbook propose d'effectuer les tâches suivantes : +L'annexe un donne un exemple de _playbook_ dans lequel on peut voir Swiss Impex apparaître. Ce playbook propose d'effectuer les tâches suivantes : - Lire le fichier contenu dans `./resources/EUMerchIDs.txt` (ce fichier contient l'identificateur de chaque catégorie de marchandises catégorisé en Europe) -- Filtrer les identificateurs et garder ceux respectant une expression régulière[^11] +- Filtrer les identificateurs et garder ceux respectant une expression régulière[^15] - Envoyer aux clients (dans le cas de l'annexe un, il y en a deux) un ensemble de tâches Swiss-Impex également réparti. - Lors de la réception des tâches Swiss-Impex, le client va les lancer dans l'ordre de réception (ce qui va aboutir au téléchargement du document au format Excel) - A la fin de chaque tâche Swiss Impex, le fichier XLSX est converti en CSV pour faciliter la lecture; Enfin, le fichier Excel est supprimé. Chaque instruction "attend" la précédente : le travail est donc fait de façon séquentielle. Toutefois, chaque travailleur n'en attend aucun autre : autrement dit, chaque processus va séquentiellement effectuer les tâches spécifiées dans le _playbook_ de son côté. -[^11]: Une expression régulière, ou Regex (ou encore RegExp) sont une chaîne de caractères décrivant un ensemble de chaînes possibles. +[^15]: Une expression régulière, ou Regex (ou encore RegExp) sont une chaîne de caractères décrivant un ensemble de chaînes possibles. ## Bilan diff --git a/rapport/text/5-solution.md b/rapport/text/5-solution.md deleted file mode 100644 index 234a3b7f09ff0767b8cbb32b6ebbde53a4e7e52f..0000000000000000000000000000000000000000 --- a/rapport/text/5-solution.md +++ /dev/null @@ -1,82 +0,0 @@ -# Performances de NScrap - -Dans cette partie, nous étudierons plusieurs exécutions de NScrap afin de déterminer son comportement, ses performances et les résultats produits. -Nous commencerons par analyser un lancement de la FAO Genève en configuration réduite, puis sur plusieurs coeurs, puis sur deux machines avec plusieurs coeurs. -Nous continuerons par analyser un lancement réduit sur Swiss-Impex, c'est-à-dire un lancement sur une seule catégorie de marchandises; nous terminerons ce chapitre par l'analyse d'un lancement total sur Swiss-Impex. Nous partirons du principe qu'il y aura toujours une base de données, un serveur et au moins un client fonctionnel en tout temps. - -Le but de cette section est de répondre à deux questions : - -* Est-ce que l'automatisation de la récupération des documents est plus rapide que le téléchargement des documents un par un ? -* Est-ce que la distribution des tâches de téléchargement accélère le traitement des tâches ? - -## Analyse FAO Genève - -Nous allons nous intéresser au lancement de la récupération de 1000 documents sur la FAO Genève. La configuration de NScrap sera faite de trois façons différentes : - -* Une machine, un travailleur -* Une machine, six travailleurs -* Deux machines, six travailleurs - -On utilise un _playbook_ définissant seulement de lancer le module FAO Genève. - -### Théorie - -Les documents sont au nombre de 1'000. Si on part du principe que 50 documents sont sur une page, et que 50 documents sont récupérés en une minute[^12], on peut poser : - -$\frac{N_{documents} * T_{50 documents}}{50} = \frac{1000 * 60}{50} = 1200$ - -Soit 20 minutes théoriques dans le cas où nous n'avons qu'une machine et un travailleur. Dans le cas où nous avons $n$ travailleurs, il faudra diviser la durée par $n$; dans le cas où nous avons $n$ travailleurs et $k$ machines (où chaque machine dans $k$ a exactement $n$ travailleurs), il faudra diviser la durée théorique par $k*n$. - -[^12]: Vitesse supposée de téléchargement d'un humain ne faisant aucune faute et ne se fatiguant pas - -### Mesures - -Après envoi de la commande au-x client-s, on observe après chaque seconde le nombre de documents téléchargés au sein du dossier de chaque client. - -### Résultats - -Commençons par les résultats d'une machine ayant un travailleur. - -\cimg{figs/faogeneve-1m1c.svg}{scale=0.5}{Performances du module FAO Genève sur 1000 documents} - -Comme nous pouvons le constater, nous avons largement dépassé la théorie. En effet, nous arrivons à une moyenne pratique de trois documents par seconde (soit 180 documents par minute), bien plus que les 50 documents par minute escomptés. A la place des vingt minutes théoriques, nous sommes arrivés à un traitement de moins de cinq minutes (pour être exact, 4 minutes et 25 secondes). -Il est appréciable de constater que la vitesse de traitement de documents n'est pas par "crans", mais qu'elle reste plus ou moins constante durant toute la durée du téléchargement. -A partir des résultats présentés ci-dessus, nous pouvons répondre aux deux questions posées au début de ce chapitre. - -* Oui, l'automatisation de la récupération des documents permet d'aller plus vite qu'un humain : aucun humain ne peut prétendre télécharger trois documents à la seconde pendant une période de temps prolongée; -* La distribution des tâches de téléchargement accélère probablement le traitement des tâches, mais ici, nous n'avons qu'une seule machine (et un seul travailleur) qui a traité les documents. En se basant seulement sur les données récoltées, nous ne pouvons pas répondre à cette question. - -## Analyse Swiss-Impex réduite - -Nous allons maintenant analyser le module Swiss-Impex. Ce module est plus intéressant à étudier que la FAO Genève : en effet, Swiss-Impex est un scrapper de catégorie deux, plus complet et complexes que ceux de première catégorie. La récupération des données prendra bien plus de temps que la FAO Genève. -Dans le cas d'une analyse Swiss-Impex réduite, on ne s'intéresse qu'à une seule catégorie de marchandises. Dans ce cas, on s'intéressera à la catégorie *2709.0090*, ce qui correspond aux données pétrolières Suisses. - -On utilise le _playbook_ présenté dans le fichier `projet/resources/playbooks/swiss-impex-petroleum.yml` - -### Théorie - -Il y a un rapport d'import/export par mois présent sur Swiss-Impex depuis 1988 jusqu'à 2019 (les informations de 2020 étant encore relativement inexactes). -On peut donc calculer le nombre de documents à $12 * (2019 - 1989) = 360 $. - -On part du principe que chaque document prend 3 minutes. Avec une seule machine ayant six workers, cela prendrait donc 3 heures. Pour réduire au plus ce temps, nous allons utiliser vingt machines. Chacune de ces machines aura six travailleurs. Nous aurons donc un total de 120 travailleurs capables d'effectuer des tâches simultanément. -Nous passons donc de trois heures à neuf minutes. - -### Mesures -Après envoi de la commande aux clients, on observe toutes les dix secondes[^12] : - -* Le nombre de documents téléchargés (le total calculé sur toutes les machines) -* Le nombre de tâches restantes au sein de la base de données - -[^12]: Observer au dessous de dix secondes serait saturer inutilement le protocole de communication : les mesures arriveraient tardivement et seraient décalées à la réalité. - -### Résultats - -TODO LES RESULTATS - -## Analyse Swiss-Impex totale - -Nous allons finalement lancer un téléchargement complet de Swiss-Impex, sur toutes les données possibles à télécharger. - -## Bilan - -\pagebreak \ No newline at end of file diff --git a/rapport/text/6-reflexion-critique.md b/rapport/text/6-reflexion-critique.md deleted file mode 100644 index ce80915534d3a9fc0ee1e0fe3584f882d43d4d65..0000000000000000000000000000000000000000 --- a/rapport/text/6-reflexion-critique.md +++ /dev/null @@ -1,5 +0,0 @@ -# Réflexion critique - -Réflexion par rapport aux travaux existants, discussion des problèmes non résolus - -\pagebreak \ No newline at end of file diff --git a/rapport/text/7-conclusion.md b/rapport/text/7-conclusion.md deleted file mode 100644 index 10f28160595062831ab01480a6cee0aee3dce78e..0000000000000000000000000000000000000000 --- a/rapport/text/7-conclusion.md +++ /dev/null @@ -1,9 +0,0 @@ -# En résumé {-} - -Résumé de tout ce qui a été dit jusqu'ici, travail futur. - -# Conclusion {-} - -... - -\pagebreak \ No newline at end of file diff --git a/rapport/text/8-annexes.md b/rapport/text/8-annexes.md deleted file mode 100644 index d342786693db7444546fe7590fdece562b1e08d5..0000000000000000000000000000000000000000 --- a/rapport/text/8-annexes.md +++ /dev/null @@ -1,41 +0,0 @@ -# Annexes {-} - -\newappendix{Exemple de fichier playbook} -```yaml -clients: # The default management port for a client is 18965 - - "129.194.187.141" - - "129.194.187.142" - -chapters: - File Parser: - file: ./resources/EUMerchIDs.txt - server: yes # Will be run on server - instructions: - read: yes - then: - - Regex Parser: - input: "!fileParserOutput" - regex: "[0-9]{4}.[0-9]{4}" - server: yes # Will not be sent to client - then: # Sent to client from here only ! - - Swiss Impex: - year: {start: 1989, end: 2020} # 1989 - 2019 - month: {start: 0, end: 12} - merchandiseId: "!regexParserOutput" - then: - - XLSX Parser: - file: "!swissImpexOutputfileName" - from: "A6" - to: "H197" - instructions: - - replace: - - "*" - - "" - - export: csv - - cleanup: yes -``` - -\pagebreak \ No newline at end of file diff --git a/rapport/text/9-bibliographie.md b/rapport/text/9-bibliographie.md deleted file mode 100644 index 3b5583f182a59a405705141d0ff375e94466c08a..0000000000000000000000000000000000000000 --- a/rapport/text/9-bibliographie.md +++ /dev/null @@ -1 +0,0 @@ -# Références documentaires {-} diff --git a/rapport/text/ZZ-glossaire.tex b/rapport/text/ZZ-glossaire.tex index 7cfdc0f1d09f3beb4c29e1aa9451bea38bd3f317..23137a4bb9f8400f2ed9d8b66c4a9eddb9af321b 100644 --- a/rapport/text/ZZ-glossaire.tex +++ b/rapport/text/ZZ-glossaire.tex @@ -1,13 +1,5 @@ % USAGE : https://github.com/tomncooper/pandoc-gls -% Insérez les termes pour le glossaire ici. -% Ne mettez pas de points à la fin d'une entrée, ils sont mis pour vous ! -\newglossaryentry{scraper_g}{name=scraper,description=Logiciel permettant la récupération en masse de documents} -\newglossaryentry{scraping_g}{name=scraping,description=Utilisation d'un \gls{scraper_g}} -\newglossaryentry{framework_g}{name=framework,description=Un framework est un ensemble de composants permettant de poser les fondations d'un logiciel de façon à ne pas tout programmer de zéro} -\newglossaryentry{captcha_g}{name=captcha,description=Un système permettant de différencier une machine d'un humain en demandant par exemple de faire une addition ou lire du texte} -\newglossaryentry{ZeroMQ_g}{name=ZeroMQ,description=Un librairie d'envoi et de réception de messages open-source.} - % Insérez les termes pour la table des acronymes ici. % Ne mettez pas de points à la fin d'une entrée, ils sont mis pour vous ! \newacronym{API_a}{API}{Application Programming Interface} @@ -16,4 +8,7 @@ \newacronym{IA_a}{IA}{Intelligence Artificielle} \newacronym{CSV_a}{CSV}{Comma Separated Value} \newacronym{HTTP_a}{HTTP}{HyperText Transfer Protocol} -\newacronym{AJAX_a}{AJAX}{Asynchronous JavaScript and XML} \ No newline at end of file +\newacronym{AJAX_a}{AJAX}{Asynchronous JavaScript and XML} +\newacronym{WYSIWYG_a}{WYSIWYG}{What You See Is What You Get} +\newacronym{HTML_a}{HTML}{HyperText Markup Language} +\newacronym{XML_a}{XML}{eXtensible Markup Language} \ No newline at end of file