Mercurial > hg > Papers > 2019 > koo-prosym
changeset 14:3f4ba3dacff5 default tip
比較時間等の修正
author | e165727 <e165727@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 11 Jan 2020 00:07:09 +0900 |
parents | 4e34198dcd05 |
children | |
files | Slide/Slide.html Slide/Slide.md Slide/Slide.pdf.html Slide/fig/abyss.pdf Slide/fig/abyss.svg |
diffstat | 5 files changed, 270 insertions(+), 125 deletions(-) [+] |
line wrap: on
line diff
--- a/Slide/Slide.html Thu Jan 09 18:49:36 2020 +0900 +++ b/Slide/Slide.html Sat Jan 11 00:07:09 2020 +0900 @@ -128,8 +128,9 @@ <pre><code>macOS Mojave version 10.14.5 メモリ8GB プロセッサ2.7GHz Intel Core i5 +</code></pre> -ruby 2.3.7p456 +<pre><code>ruby 2.3.7p456 python 2.7.10 raku 2019.03.1 perl5 v5.18.4 @@ -143,29 +144,25 @@ <!-- _S9SLIDE_ --> <h2 id="raku-と他言語の起動時間の比較-1">Raku と他言語の起動時間の比較</h2> <ul> - <li>perl5,ruby,raku,pythonでhelloworldを出力するだけのプログラムを用いて行なった実行結果である.</li> + <li>perl5,ruby,raku,pythonでhelloworldを出力するプログラムを用いて行なった実行結果である.</li> </ul> <pre><code>perl5 -real 0m0.011s user 0m0.004s sys 0m0.005s ===== Raku -real 0m0.209s user 0m0.249s sys 0m0.048s ==== ruby -real 0m0.131s user 0m0.083s sys 0m0.038s ==== python -real 0m0.036s user 0m0.013s sys 0m0.021s ==== @@ -181,7 +178,7 @@ <!-- _S9SLIDE_ --> <h2 id="rakudo">Rakudo</h2> <ul> - <li>Rakudoとは現在のRakuの主力な実装である.</li> + <li>Rakudoとは現在のRakuの主力な実装である.(Raku は言語名, Rakudo はコンパイラ)</li> <li>Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である.</li> </ul> @@ -224,8 +221,25 @@ <!-- _S9SLIDE_ --> <h2 id="perl6-の名称変更">Perl6 の名称変更</h2> <ul> - <li>Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しない.</li> - <li>そのため現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた.</li> + <li>Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました.</li> + <li>現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた.</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="rakudoの語源">Rakudoの語源</h2> +<ul> + <li>ちなみに Rakudo の語源は, 楽土と駱駝道で</li> + <li>楽土の方はLallyが楽に言語を作りたいという意味で Rakudo</li> + <li>駱駝道の方は Perlのマスコットキャラクターが🐪だったからです + <ul> + <li>http://blogs.perl.org/users/zoffix_znet/2017/07/the-hot-new-language-named-rakudo.html</li> + </ul> + </li> </ul> @@ -239,8 +253,11 @@ <li>通常 Ruby のようなスクリプト言語ではまず YARV などのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む.</li> <li>Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して低速である.</li> <li>これは Rakudo 自体が Raku と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである.</li> - <li>また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である.</li> - <li>(incokeとは何か書く)</li> + <li>また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. + <ul> + <li>invoke はMoarVM の method 呼び出しのbyte codeです.</li> + </ul> + </li> </ul> @@ -249,14 +266,14 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="raku-による-abyssサーバーの実装">Raku による Abyssサーバーの実装</h2> +<h2 id="raku-による-abyss-server-の実装">Raku による Abyss Server の実装</h2> <ul> - <li>提案手法に沿い『Abyssサーバー』を実装した.</li> - <li>AbyssサーバーはUnix domain socketを用いて送信した Raku スクリプトを実行するためのサーバーである.</li> - <li>下記の図は,Abyss サーバーを用いたスクリプト言語の実行手順である.</li> + <li>提案手法に沿い『Abyss Server』を実装した.</li> + <li>Abyss Server はUnix domain socketを用いて送信した Raku スクリプトを実行するための Server である.</li> + <li>下記の図は, Abyss Server を用いたスクリプト言語の実行手順です.</li> </ul> -<p><img src="fig/abyss.svg" alt="" /></p> +<p><img src="fig/Abyss.svg" alt="" /></p> @@ -266,8 +283,19 @@ <!-- _S9SLIDE_ --> <h2 id="raku-の-unix-domain-socket-実装">Raku の Unix domain socket 実装</h2> <ul> - <li>Rakuには現在Unix domain socketの実装がないため,Unix domain socket の実装を行なった.</li> - <li></li> + <li>Unix domain socket でなくINET で実装した場合, 他者からスクリプトを送りつけられる可能性がある. + <ul> + <li>そのため今回はUnix domain socket を用いて実装しました.</li> + </ul> + </li> + <li>Rakuには現在Unix domain socketの実装がないため, Unix domain socket の実装を行なった.</li> + <li>IO::Socketがroleとして定義されている</li> + <li>現状 Raku にはIO::Socket::INETとIO::Socket::Asyncの実装がある</li> + <li>IO::Socketを実装した IO::Socket::Unix を実装しました + <ul> + <li>IO::Socket::Unixの中ではnqpの機能を使う必要がある</li> + </ul> + </li> </ul> @@ -299,7 +327,7 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="実行結果">実行結果</h2> +<h2 id="1回だけ呼び出した場合">1回だけ呼び出した場合</h2> <ul> <li>通常実行 @@ -316,6 +344,33 @@ <li>0.0275 sec</li> </ul> </li> + <li>提案手法は通常実行に比べて約10倍早い実行結果になった</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="10回呼び出した場合">10回呼び出した場合</h2> + +<ul> + <li>通常実行 + <ul> + <li>2.187491 sec</li> + <li>2.242387 sec</li> + <li>2.198792 sec</li> + </ul> + </li> + <li>提案手法 + <ul> + <li>0.2552448 sec</li> + <li>0.2340882 sec</li> + <li>0.2795233 sec</li> + </ul> + </li> + <li>提案手法は通常実行に比べて約10倍早い実行結果になった</li> </ul> @@ -326,7 +381,7 @@ <!-- _S9SLIDE_ --> <h2 id="abyss-server側の実装">Abyss Server側の実装</h2> <ul> - <li>Abyss Server は起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後 ファイルを受け取るための待機ループに入る.</li> + <li>Abyss Server は起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後ファイルを受け取るための待機ループに入る.</li> <li>ファイルパスを受け取ると, ファイルを開き実行する.</li> </ul> @@ -377,7 +432,7 @@ <!-- _S9SLIDE_ --> <h2 id="raku-のeval">Raku のEVAL</h2> <ul> - <li>Raku では EVAL 関数があり文字列を Perl6 のソースコード自身として評価できる</li> + <li>Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる</li> <li>Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.</li> </ul> @@ -394,7 +449,11 @@ <!-- _S9SLIDE_ --> <h2 id="abyss-serverの利点">Abyss Serverの利点</h2> <ul> - <li>Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる.</li> + <li>Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる. + <ul> + <li>約10分の1</li> + </ul> + </li> </ul> @@ -406,7 +465,14 @@ <h2 id="abyss-serverの欠点">Abyss Serverの欠点</h2> <ul> <li>現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある</li> - <li>Raku に eval の出力を socket に切り替える機能が存在しないので出力がサーバー側に返ってしまう</li> + <li>Raku に eval の出力を socket に切り替える機能が存在しないので出力が Server 側に返ってしまい,ユーザー側に返ってこない</li> + <li>同時に二つ以上のタスクを与えられると実行順のスケジューリングができない + <ul> + <li>与えられた順番に処理していく</li> + </ul> + </li> + <li>異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない</li> + <li>起動時のオプションが選択出来ない</li> </ul> @@ -419,8 +485,8 @@ <ul> <li>Raku の新たな実行方法の提案,及び実装を行なった.</li> <li>Raku にUnix domain socket の実装を行なった.</li> - <li>Raku の速度改善において, 同一ホスト内でサーバープロセスを立ち上げて,サーバープロセス内であらかじめ立ち上げておいたコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる</li> - <li>今後は</li> + <li>Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる</li> + <li>今後は一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組みを入れて開発を進めたいです.</li> </ul> @@ -438,6 +504,14 @@ <p><img src="fig/Raku.svg" alt="" /></p> + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="rakuの導入">Rakuの導入</h2> + + </div>
--- a/Slide/Slide.md Thu Jan 09 18:49:36 2020 +0900 +++ b/Slide/Slide.md Sat Jan 11 00:07:09 2020 +0900 @@ -22,7 +22,9 @@ macOS Mojave version 10.14.5 メモリ8GB プロセッサ2.7GHz Intel Core i5 +``` +``` ruby 2.3.7p456 python 2.7.10 raku 2019.03.1 @@ -30,29 +32,25 @@ ``` ## Raku と他言語の起動時間の比較 -- perl5,ruby,raku,pythonでhelloworldを出力するだけのプログラムを用いて行なった実行結果である. +- perl5,ruby,raku,pythonでhelloworldを出力するプログラムを用いて行なった実行結果である. ``` perl5 -real 0m0.011s user 0m0.004s sys 0m0.005s ===== Raku -real 0m0.209s user 0m0.249s sys 0m0.048s ==== ruby -real 0m0.131s user 0m0.083s sys 0m0.038s ==== python -real 0m0.036s user 0m0.013s sys 0m0.021s ==== @@ -61,7 +59,7 @@ Raku は 最も早いperl5 の約62.25倍起動速度が遅いことがわかる. ## Rakudo -- Rakudoとは現在のRakuの主力な実装である. +- Rakudoとは現在のRakuの主力な実装である.(Raku は言語名, Rakudo はコンパイラ) - Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である. ![](fig/Rakudo.svg) @@ -78,26 +76,37 @@ - JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある ## Perl6 の名称変更 -- Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しない. -- そのため現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた. +- Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました. +- 現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた. + +## Rakudoの語源 +- ちなみに Rakudo の語源は, 楽土と駱駝道で +- 楽土の方はLallyが楽に言語を作りたいという意味で Rakudo +- 駱駝道の方は Perlのマスコットキャラクターが🐪だったからです + - http://blogs.perl.org/users/zoffix_znet/2017/07/the-hot-new-language-named-rakudo.html ## Rakuが遅い理由 - 通常 Ruby のようなスクリプト言語ではまず YARV などのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む. - Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して低速である. - これは Rakudo 自体が Raku と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである. - また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. -- (incokeとは何か書く) + - invoke はMoarVM の method 呼び出しのbyte codeです. -## Raku による Abyssサーバーの実装 -- 提案手法に沿い『Abyssサーバー』を実装した. -- AbyssサーバーはUnix domain socketを用いて送信した Raku スクリプトを実行するためのサーバーである. -- 下記の図は,Abyss サーバーを用いたスクリプト言語の実行手順である. +## Raku による Abyss Server の実装 +- 提案手法に沿い『Abyss Server』を実装した. +- Abyss Server はUnix domain socketを用いて送信した Raku スクリプトを実行するための Server である. +- 下記の図は, Abyss Server を用いたスクリプト言語の実行手順です. -![](fig/abyss.svg) +![](fig/Abyss.svg) ## Raku の Unix domain socket 実装 -- Rakuには現在Unix domain socketの実装がないため,Unix domain socket の実装を行なった. -- +- Unix domain socket でなくINET で実装した場合, 他者からスクリプトを送りつけられる可能性がある. + - そのため今回はUnix domain socket を用いて実装しました. +- Rakuには現在Unix domain socketの実装がないため, Unix domain socket の実装を行なった. +- IO::Socketがroleとして定義されている +- 現状 Raku にはIO::Socket::INETとIO::Socket::Asyncの実装がある +- IO::Socketを実装した IO::Socket::Unix を実装しました + - IO::Socket::Unixの中ではnqpの機能を使う必要がある ## 通常実行と提案手法の速度比較 - 今回は,提案手法での実行速度と通常実行での実行速度, この二つの速度の比較を行う @@ -108,7 +117,7 @@ ## 予測 - 前述した通り, Raku はコンパイラの起動に時間がかかっているため, 提案手法を用いることで起動時間分早く実行することができると予測する. -## 実行結果 +## 1回だけ呼び出した場合 - 通常実行 - 0.2695 sec @@ -120,8 +129,24 @@ - 0.0219 sec - 0.0275 sec +- 提案手法は通常実行に比べて約10倍早い実行結果になった + +## 10回呼び出した場合 + +- 通常実行 + - 2.187491 sec + - 2.242387 sec + - 2.198792 sec + +- 提案手法 + - 0.2552448 sec + - 0.2340882 sec + - 0.2795233 sec + +- 提案手法は通常実行に比べて約10倍早い実行結果になった + ## Abyss Server側の実装 -- Abyss Server は起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後 ファイルを受け取るための待機ループに入る. +- Abyss Server は起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後ファイルを受け取るための待機ループに入る. - ファイルパスを受け取ると, ファイルを開き実行する. ``` @@ -158,7 +183,7 @@ ``` ## Raku のEVAL -- Raku では EVAL 関数があり文字列を Perl6 のソースコード自身として評価できる +- Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる - Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる. ``` @@ -169,17 +194,22 @@ ## Abyss Serverの利点 - Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる. + - 約10分の1 ## Abyss Serverの欠点 - 現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある -- Raku に eval の出力を socket に切り替える機能が存在しないので出力がサーバー側に返ってしまう - +- Raku に eval の出力を socket に切り替える機能が存在しないので出力が Server 側に返ってしまい,ユーザー側に返ってこない +- 同時に二つ以上のタスクを与えられると実行順のスケジューリングができない + - 与えられた順番に処理していく +- 異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない +- 起動時のオプションが選択出来ない ## まとめと今後の課題 - Raku の新たな実行方法の提案,及び実装を行なった. - Raku にUnix domain socket の実装を行なった. -- Raku の速度改善において, 同一ホスト内でサーバープロセスを立ち上げて,サーバープロセス内であらかじめ立ち上げておいたコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる -- 今後は +- Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる +- 今後は一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組みを入れて開発を進めたいです. + ## Raku の実装に関わる様々な言語 - Raku は, Larry wall により設計されたオブジェクト指向スクリプト言語である. @@ -187,3 +217,5 @@ ![](fig/Raku.svg) +## Rakuの導入 +
--- a/Slide/Slide.pdf.html Thu Jan 09 18:49:36 2020 +0900 +++ b/Slide/Slide.pdf.html Sat Jan 11 00:07:09 2020 +0900 @@ -112,8 +112,9 @@ <pre><code>macOS Mojave version 10.14.5 メモリ8GB プロセッサ2.7GHz Intel Core i5 +</code></pre> -ruby 2.3.7p456 +<pre><code>ruby 2.3.7p456 python 2.7.10 raku 2019.03.1 perl5 v5.18.4 @@ -127,29 +128,25 @@ <!-- _S9SLIDE_ --> <h2 id="raku-と他言語の起動時間の比較-1">Raku と他言語の起動時間の比較</h2> <ul> - <li>perl5,ruby,raku,pythonでhelloworldを出力するだけのプログラムを用いて行なった実行結果である.</li> + <li>perl5,ruby,raku,pythonでhelloworldを出力するプログラムを用いて行なった実行結果である.</li> </ul> <pre><code>perl5 -real 0m0.011s user 0m0.004s sys 0m0.005s ===== Raku -real 0m0.209s user 0m0.249s sys 0m0.048s ==== ruby -real 0m0.131s user 0m0.083s sys 0m0.038s ==== python -real 0m0.036s user 0m0.013s sys 0m0.021s ==== @@ -165,7 +162,7 @@ <!-- _S9SLIDE_ --> <h2 id="rakudo">Rakudo</h2> <ul> - <li>Rakudoとは現在のRakuの主力な実装である.</li> + <li>Rakudoとは現在のRakuの主力な実装である.(Raku は言語名, Rakudo はコンパイラ)</li> <li>Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である.</li> </ul> @@ -208,8 +205,25 @@ <!-- _S9SLIDE_ --> <h2 id="perl6-の名称変更">Perl6 の名称変更</h2> <ul> - <li>Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しない.</li> - <li>そのため現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた.</li> + <li>Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました.</li> + <li>現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた.</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="rakudoの語源">Rakudoの語源</h2> +<ul> + <li>ちなみに Rakudo の語源は, 楽土と駱駝道で</li> + <li>楽土の方はLallyが楽に言語を作りたいという意味で Rakudo</li> + <li>駱駝道の方は Perlのマスコットキャラクターが🐪だったからです + <ul> + <li>http://blogs.perl.org/users/zoffix_znet/2017/07/the-hot-new-language-named-rakudo.html</li> + </ul> + </li> </ul> @@ -223,8 +237,11 @@ <li>通常 Ruby のようなスクリプト言語ではまず YARV などのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む.</li> <li>Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して低速である.</li> <li>これは Rakudo 自体が Raku と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである.</li> - <li>また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である.</li> - <li>(incokeとは何か書く)</li> + <li>また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. + <ul> + <li>invoke はMoarVM の method 呼び出しのbyte codeです.</li> + </ul> + </li> </ul> @@ -233,14 +250,14 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="raku-による-abyssサーバーの実装">Raku による Abyssサーバーの実装</h2> +<h2 id="raku-による-abyss-server-の実装">Raku による Abyss Server の実装</h2> <ul> - <li>提案手法に沿い『Abyssサーバー』を実装した.</li> - <li>AbyssサーバーはUnix domain socketを用いて送信した Raku スクリプトを実行するためのサーバーである.</li> - <li>下記の図は,Abyss サーバーを用いたスクリプト言語の実行手順である.</li> + <li>提案手法に沿い『Abyss Server』を実装した.</li> + <li>Abyss Server はUnix domain socketを用いて送信した Raku スクリプトを実行するための Server である.</li> + <li>下記の図は, Abyss Server を用いたスクリプト言語の実行手順です.</li> </ul> -<p><img src="fig/abyss.svg" alt="" /></p> +<p><img src="fig/Abyss.svg" alt="" /></p> @@ -250,8 +267,19 @@ <!-- _S9SLIDE_ --> <h2 id="raku-の-unix-domain-socket-実装">Raku の Unix domain socket 実装</h2> <ul> - <li>Rakuには現在Unix domain socketの実装がないため,Unix domain socket の実装を行なった.</li> - <li></li> + <li>Unix domain socket でなくINET で実装した場合, 他者からスクリプトを送りつけられる可能性がある. + <ul> + <li>そのため今回はUnix domain socket を用いて実装しました.</li> + </ul> + </li> + <li>Rakuには現在Unix domain socketの実装がないため, Unix domain socket の実装を行なった.</li> + <li>IO::Socketがroleとして定義されている</li> + <li>現状 Raku にはIO::Socket::INETとIO::Socket::Asyncの実装がある</li> + <li>IO::Socketを実装した IO::Socket::Unix を実装しました + <ul> + <li>IO::Socket::Unixの中ではnqpの機能を使う必要がある</li> + </ul> + </li> </ul> @@ -283,7 +311,7 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="実行結果">実行結果</h2> +<h2 id="1回だけ呼び出した場合">1回だけ呼び出した場合</h2> <ul> <li>通常実行 @@ -300,6 +328,33 @@ <li>0.0275 sec</li> </ul> </li> + <li>提案手法は通常実行に比べて約10倍早い実行結果になった</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="10回呼び出した場合">10回呼び出した場合</h2> + +<ul> + <li>通常実行 + <ul> + <li>2.187491 sec</li> + <li>2.242387 sec</li> + <li>2.198792 sec</li> + </ul> + </li> + <li>提案手法 + <ul> + <li>0.2552448 sec</li> + <li>0.2340882 sec</li> + <li>0.2795233 sec</li> + </ul> + </li> + <li>提案手法は通常実行に比べて約10倍早い実行結果になった</li> </ul> @@ -310,7 +365,7 @@ <!-- _S9SLIDE_ --> <h2 id="abyss-server側の実装">Abyss Server側の実装</h2> <ul> - <li>Abyss Server は起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後 ファイルを受け取るための待機ループに入る.</li> + <li>Abyss Server は起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後ファイルを受け取るための待機ループに入る.</li> <li>ファイルパスを受け取ると, ファイルを開き実行する.</li> </ul> @@ -361,7 +416,7 @@ <!-- _S9SLIDE_ --> <h2 id="raku-のeval">Raku のEVAL</h2> <ul> - <li>Raku では EVAL 関数があり文字列を Perl6 のソースコード自身として評価できる</li> + <li>Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる</li> <li>Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.</li> </ul> @@ -378,7 +433,11 @@ <!-- _S9SLIDE_ --> <h2 id="abyss-serverの利点">Abyss Serverの利点</h2> <ul> - <li>Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる.</li> + <li>Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる. + <ul> + <li>約10分の1</li> + </ul> + </li> </ul> @@ -390,7 +449,14 @@ <h2 id="abyss-serverの欠点">Abyss Serverの欠点</h2> <ul> <li>現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある</li> - <li>Raku に eval の出力を socket に切り替える機能が存在しないので出力がサーバー側に返ってしまう</li> + <li>Raku に eval の出力を socket に切り替える機能が存在しないので出力が Server 側に返ってしまい,ユーザー側に返ってこない</li> + <li>同時に二つ以上のタスクを与えられると実行順のスケジューリングができない + <ul> + <li>与えられた順番に処理していく</li> + </ul> + </li> + <li>異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない</li> + <li>起動時のオプションが選択出来ない</li> </ul> @@ -403,8 +469,8 @@ <ul> <li>Raku の新たな実行方法の提案,及び実装を行なった.</li> <li>Raku にUnix domain socket の実装を行なった.</li> - <li>Raku の速度改善において, 同一ホスト内でサーバープロセスを立ち上げて,サーバープロセス内であらかじめ立ち上げておいたコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる</li> - <li>今後は</li> + <li>Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる</li> + <li>今後は一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組みを入れて開発を進めたいです.</li> </ul> @@ -422,6 +488,14 @@ <p><img src="fig/Raku.svg" alt="" /></p> + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="rakuの導入">Rakuの導入</h2> + + </div>
--- a/Slide/fig/abyss.svg Thu Jan 09 18:49:36 2020 +0900 +++ b/Slide/fig/abyss.svg Sat Jan 11 00:07:09 2020 +0900 @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="585pt" height="322pt" viewBox="0 0 585 322" version="1.1"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="585pt" height="288pt" viewBox="0 0 585 288" version="1.1"> <defs> <g> <symbol overflow="visible" id="glyph0-0"> @@ -50,24 +50,6 @@ <symbol overflow="visible" id="glyph0-15"> <path style="stroke:none;" d="M 2.390625 -4.828125 C 2.390625 -5.304688 2.441406 -5.773438 2.546875 -6.234375 C 2.648438 -6.691406 2.8125 -7.097656 3.03125 -7.453125 C 3.257812 -7.804688 3.5625 -8.085938 3.9375 -8.296875 C 4.320312 -8.515625 4.789062 -8.625 5.34375 -8.625 C 5.894531 -8.625 6.367188 -8.519531 6.765625 -8.3125 C 7.160156 -8.101562 7.476562 -7.828125 7.71875 -7.484375 C 7.96875 -7.140625 8.148438 -6.742188 8.265625 -6.296875 C 8.378906 -5.847656 8.4375 -5.382812 8.4375 -4.90625 C 8.4375 -4.445312 8.378906 -3.992188 8.265625 -3.546875 C 8.160156 -3.109375 7.988281 -2.710938 7.75 -2.359375 C 7.507812 -2.015625 7.195312 -1.734375 6.8125 -1.515625 C 6.4375 -1.304688 5.976562 -1.203125 5.4375 -1.203125 C 4.914062 -1.203125 4.460938 -1.300781 4.078125 -1.5 C 3.691406 -1.707031 3.375 -1.976562 3.125 -2.3125 C 2.875 -2.65625 2.6875 -3.046875 2.5625 -3.484375 C 2.445312 -3.921875 2.390625 -4.367188 2.390625 -4.828125 Z M 10 0 L 10 -13.5625 L 8.375 -13.5625 L 8.375 -8.515625 L 8.34375 -8.515625 C 8.164062 -8.804688 7.945312 -9.046875 7.6875 -9.234375 C 7.425781 -9.429688 7.148438 -9.59375 6.859375 -9.71875 C 6.566406 -9.84375 6.273438 -9.925781 5.984375 -9.96875 C 5.691406 -10.019531 5.421875 -10.046875 5.171875 -10.046875 C 4.421875 -10.046875 3.765625 -9.910156 3.203125 -9.640625 C 2.640625 -9.367188 2.171875 -9 1.796875 -8.53125 C 1.421875 -8.070312 1.140625 -7.53125 0.953125 -6.90625 C 0.773438 -6.289062 0.6875 -5.632812 0.6875 -4.9375 C 0.6875 -4.238281 0.78125 -3.578125 0.96875 -2.953125 C 1.15625 -2.335938 1.4375 -1.796875 1.8125 -1.328125 C 2.1875 -0.859375 2.65625 -0.484375 3.21875 -0.203125 C 3.78125 0.0664062 4.441406 0.203125 5.203125 0.203125 C 5.890625 0.203125 6.515625 0.0820312 7.078125 -0.15625 C 7.648438 -0.394531 8.070312 -0.785156 8.34375 -1.328125 L 8.375 -1.328125 L 8.375 0 Z M 10 0 "/> </symbol> -<symbol overflow="visible" id="glyph0-16"> -<path style="stroke:none;" d="M 2.53125 -6.78125 C 2.53125 -7.46875 2.617188 -8.140625 2.796875 -8.796875 C 2.972656 -9.460938 3.25 -10.0625 3.625 -10.59375 C 4.007812 -11.132812 4.5 -11.566406 5.09375 -11.890625 C 5.6875 -12.210938 6.394531 -12.375 7.21875 -12.375 C 8.039062 -12.375 8.75 -12.210938 9.34375 -11.890625 C 9.9375 -11.566406 10.421875 -11.132812 10.796875 -10.59375 C 11.179688 -10.0625 11.460938 -9.460938 11.640625 -8.796875 C 11.816406 -8.140625 11.90625 -7.46875 11.90625 -6.78125 C 11.90625 -6.09375 11.816406 -5.414062 11.640625 -4.75 C 11.460938 -4.09375 11.179688 -3.5 10.796875 -2.96875 C 10.421875 -2.4375 9.9375 -2.007812 9.34375 -1.6875 C 8.75 -1.363281 8.039062 -1.203125 7.21875 -1.203125 C 6.394531 -1.203125 5.6875 -1.363281 5.09375 -1.6875 C 4.5 -2.007812 4.007812 -2.4375 3.625 -2.96875 C 3.25 -3.5 2.972656 -4.09375 2.796875 -4.75 C 2.617188 -5.414062 2.53125 -6.09375 2.53125 -6.78125 Z M 0.71875 -6.78125 C 0.71875 -5.851562 0.851562 -4.960938 1.125 -4.109375 C 1.394531 -3.253906 1.800781 -2.5 2.34375 -1.84375 C 2.894531 -1.1875 3.578125 -0.664062 4.390625 -0.28125 C 5.203125 0.101562 6.144531 0.296875 7.21875 0.296875 C 8.289062 0.296875 9.234375 0.101562 10.046875 -0.28125 C 10.859375 -0.664062 11.535156 -1.1875 12.078125 -1.84375 C 12.628906 -2.5 13.039062 -3.253906 13.3125 -4.109375 C 13.582031 -4.960938 13.71875 -5.851562 13.71875 -6.78125 C 13.71875 -7.707031 13.582031 -8.597656 13.3125 -9.453125 C 13.039062 -10.304688 12.628906 -11.0625 12.078125 -11.71875 C 11.535156 -12.382812 10.859375 -12.910156 10.046875 -13.296875 C 9.234375 -13.691406 8.289062 -13.890625 7.21875 -13.890625 C 6.144531 -13.890625 5.203125 -13.691406 4.390625 -13.296875 C 3.578125 -12.910156 2.894531 -12.382812 2.34375 -11.71875 C 1.800781 -11.0625 1.394531 -10.304688 1.125 -9.453125 C 0.851562 -8.597656 0.71875 -7.707031 0.71875 -6.78125 Z M 0.71875 -6.78125 "/> -</symbol> -<symbol overflow="visible" id="glyph0-17"> -<path style="stroke:none;" d="M 9.34375 0 L 9.34375 -9.828125 L 7.734375 -9.828125 L 7.734375 -4.28125 C 7.734375 -3.832031 7.671875 -3.421875 7.546875 -3.046875 C 7.429688 -2.671875 7.253906 -2.34375 7.015625 -2.0625 C 6.773438 -1.789062 6.472656 -1.578125 6.109375 -1.421875 C 5.742188 -1.273438 5.316406 -1.203125 4.828125 -1.203125 C 4.203125 -1.203125 3.710938 -1.378906 3.359375 -1.734375 C 3.003906 -2.085938 2.828125 -2.566406 2.828125 -3.171875 L 2.828125 -9.828125 L 1.21875 -9.828125 L 1.21875 -3.359375 C 1.21875 -2.828125 1.269531 -2.34375 1.375 -1.90625 C 1.476562 -1.46875 1.664062 -1.085938 1.9375 -0.765625 C 2.207031 -0.453125 2.554688 -0.210938 2.984375 -0.046875 C 3.410156 0.117188 3.945312 0.203125 4.59375 0.203125 C 5.320312 0.203125 5.953125 0.0625 6.484375 -0.21875 C 7.015625 -0.5 7.453125 -0.945312 7.796875 -1.5625 L 7.828125 -1.5625 L 7.828125 0 Z M 9.34375 0 "/> -</symbol> -<symbol overflow="visible" id="glyph0-18"> -<path style="stroke:none;" d="M 1.265625 -9.828125 L 1.265625 3.75 L 2.890625 3.75 L 2.890625 -1.3125 L 2.921875 -1.3125 C 3.097656 -1.019531 3.316406 -0.773438 3.578125 -0.578125 C 3.835938 -0.378906 4.113281 -0.222656 4.40625 -0.109375 C 4.695312 0.00390625 4.988281 0.0820312 5.28125 0.125 C 5.582031 0.175781 5.851562 0.203125 6.09375 0.203125 C 6.84375 0.203125 7.5 0.0703125 8.0625 -0.1875 C 8.625 -0.457031 9.09375 -0.820312 9.46875 -1.28125 C 9.84375 -1.738281 10.117188 -2.28125 10.296875 -2.90625 C 10.484375 -3.53125 10.578125 -4.191406 10.578125 -4.890625 C 10.578125 -5.578125 10.484375 -6.234375 10.296875 -6.859375 C 10.109375 -7.484375 9.828125 -8.03125 9.453125 -8.5 C 9.078125 -8.976562 8.609375 -9.351562 8.046875 -9.625 C 7.484375 -9.90625 6.820312 -10.046875 6.0625 -10.046875 C 5.375 -10.046875 4.742188 -9.921875 4.171875 -9.671875 C 3.609375 -9.429688 3.191406 -9.039062 2.921875 -8.5 L 2.890625 -8.5 L 2.890625 -9.828125 Z M 8.875 -5 C 8.875 -4.519531 8.820312 -4.050781 8.71875 -3.59375 C 8.613281 -3.132812 8.445312 -2.726562 8.21875 -2.375 C 8 -2.019531 7.703125 -1.734375 7.328125 -1.515625 C 6.953125 -1.304688 6.484375 -1.203125 5.921875 -1.203125 C 5.367188 -1.203125 4.894531 -1.304688 4.5 -1.515625 C 4.101562 -1.722656 3.78125 -1.992188 3.53125 -2.328125 C 3.289062 -2.671875 3.113281 -3.066406 3 -3.515625 C 2.882812 -3.972656 2.828125 -4.441406 2.828125 -4.921875 C 2.828125 -5.378906 2.878906 -5.828125 2.984375 -6.265625 C 3.097656 -6.710938 3.273438 -7.109375 3.515625 -7.453125 C 3.753906 -7.804688 4.0625 -8.085938 4.4375 -8.296875 C 4.820312 -8.515625 5.285156 -8.625 5.828125 -8.625 C 6.347656 -8.625 6.800781 -8.519531 7.1875 -8.3125 C 7.570312 -8.113281 7.890625 -7.84375 8.140625 -7.5 C 8.390625 -7.15625 8.570312 -6.765625 8.6875 -6.328125 C 8.8125 -5.898438 8.875 -5.457031 8.875 -5 Z M 8.875 -5 "/> -</symbol> -<symbol overflow="visible" id="glyph0-19"> -<path style="stroke:none;" d="M 1.484375 -13.5625 L 1.484375 0 L 10.90625 0 L 10.90625 -1.515625 L 3.28125 -1.515625 L 3.28125 -6.21875 L 10.34375 -6.21875 L 10.34375 -7.734375 L 3.28125 -7.734375 L 3.28125 -12.046875 L 10.84375 -12.046875 L 10.84375 -13.5625 Z M 1.484375 -13.5625 "/> -</symbol> -<symbol overflow="visible" id="glyph0-20"> -<path style="stroke:none;" d="M 3.859375 -5.171875 L 0.171875 0 L 2.125 0 L 4.859375 -4.0625 L 7.59375 0 L 9.671875 0 L 5.875 -5.296875 L 9.25 -9.828125 L 7.3125 -9.828125 L 4.859375 -6.390625 L 2.515625 -9.828125 L 0.4375 -9.828125 Z M 3.859375 -5.171875 "/> -</symbol> -<symbol overflow="visible" id="glyph0-21"> -<path style="stroke:none;" d="M 7.890625 -6.671875 L 9.5625 -6.671875 C 9.5 -7.253906 9.34375 -7.753906 9.09375 -8.171875 C 8.851562 -8.597656 8.546875 -8.953125 8.171875 -9.234375 C 7.804688 -9.515625 7.378906 -9.71875 6.890625 -9.84375 C 6.398438 -9.976562 5.875 -10.046875 5.3125 -10.046875 C 4.539062 -10.046875 3.863281 -9.910156 3.28125 -9.640625 C 2.695312 -9.367188 2.210938 -8.992188 1.828125 -8.515625 C 1.441406 -8.046875 1.15625 -7.488281 0.96875 -6.84375 C 0.78125 -6.207031 0.6875 -5.519531 0.6875 -4.78125 C 0.6875 -4.050781 0.78125 -3.378906 0.96875 -2.765625 C 1.164062 -2.148438 1.457031 -1.617188 1.84375 -1.171875 C 2.238281 -0.734375 2.722656 -0.394531 3.296875 -0.15625 C 3.867188 0.0820312 4.53125 0.203125 5.28125 0.203125 C 6.53125 0.203125 7.519531 -0.125 8.25 -0.78125 C 8.976562 -1.4375 9.429688 -2.375 9.609375 -3.59375 L 7.96875 -3.59375 C 7.863281 -2.832031 7.582031 -2.242188 7.125 -1.828125 C 6.675781 -1.410156 6.054688 -1.203125 5.265625 -1.203125 C 4.753906 -1.203125 4.316406 -1.300781 3.953125 -1.5 C 3.585938 -1.707031 3.289062 -1.976562 3.0625 -2.3125 C 2.832031 -2.644531 2.660156 -3.023438 2.546875 -3.453125 C 2.441406 -3.890625 2.390625 -4.332031 2.390625 -4.78125 C 2.390625 -5.28125 2.441406 -5.757812 2.546875 -6.21875 C 2.648438 -6.6875 2.816406 -7.097656 3.046875 -7.453125 C 3.285156 -7.804688 3.597656 -8.085938 3.984375 -8.296875 C 4.378906 -8.515625 4.867188 -8.625 5.453125 -8.625 C 6.140625 -8.625 6.679688 -8.453125 7.078125 -8.109375 C 7.484375 -7.765625 7.753906 -7.285156 7.890625 -6.671875 Z M 7.890625 -6.671875 "/> -</symbol> </g> </defs> <g id="surface1"> @@ -89,42 +71,25 @@ <use xlink:href="#glyph0-4" x="429.406" y="159.734001"/> <use xlink:href="#glyph0-8" x="439.609" y="159.734001"/> </g> -<path style="fill:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 198 100.078125 C 217.140625 94.042969 238.398438 90 261 90 C 279.925781 90 297.910156 92.832031 314.5 97.300781 "/> -<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 322.175781 99.542969 L 315.339844 94.417969 L 313.65625 100.179688 Z M 322.175781 99.542969 "/> -<path style="fill:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 324 198.363281 C 304.859375 203.535156 283.601562 207 261 207 C 242.109375 207 224.160156 204.582031 207.601562 200.765625 "/> -<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 199.84375 198.824219 L 206.875 203.675781 L 208.332031 197.855469 Z M 199.84375 198.824219 "/> +<path style="fill:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 198 145.441406 C 217.140625 144.578125 238.398438 144 261 144 C 279.777344 144 297.628906 144.398438 314.109375 145.027344 "/> +<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 322.101562 145.359375 L 314.234375 142.03125 L 313.984375 148.023438 Z M 322.101562 145.359375 "/> <g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-10" x="193.6695" y="68.734001"/> - <use xlink:href="#glyph0-3" x="204.5755" y="68.734001"/> - <use xlink:href="#glyph0-2" x="208.7935" y="68.734001"/> - <use xlink:href="#glyph0-4" x="213.0115" y="68.734001"/> - <use xlink:href="#glyph0-11" x="223.2145" y="68.734001"/> - <use xlink:href="#glyph0-12" x="228.4965" y="68.734001"/> - <use xlink:href="#glyph0-13" x="242.2145" y="68.734001"/> - <use xlink:href="#glyph0-14" x="252.4175" y="68.734001"/> - <use xlink:href="#glyph0-4" x="268.6245" y="68.734001"/> - <use xlink:href="#glyph0-11" x="278.8275" y="68.734001"/> - <use xlink:href="#glyph0-7" x="284.1095" y="68.734001"/> - <use xlink:href="#glyph0-4" x="296.4215" y="68.734001"/> - <use xlink:href="#glyph0-5" x="306.6245" y="68.734001"/> - <use xlink:href="#glyph0-15" x="317.1885" y="68.734001"/> + <use xlink:href="#glyph0-10" x="218.7022" y="113.468002"/> + <use xlink:href="#glyph0-3" x="229.6082" y="113.468002"/> + <use xlink:href="#glyph0-2" x="233.8262" y="113.468002"/> + <use xlink:href="#glyph0-4" x="238.0442" y="113.468002"/> + <use xlink:href="#glyph0-11" x="248.2472" y="113.468002"/> + <use xlink:href="#glyph0-12" x="253.5292" y="113.468002"/> + <use xlink:href="#glyph0-13" x="267.2472" y="113.468002"/> + <use xlink:href="#glyph0-14" x="277.4502" y="113.468002"/> + <use xlink:href="#glyph0-4" x="293.6572" y="113.468002"/> + <use xlink:href="#glyph0-11" x="303.8602" y="113.468002"/> </g> <g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-16" x="231.5975" y="239.734001"/> - <use xlink:href="#glyph0-17" x="246.0375" y="239.734001"/> - <use xlink:href="#glyph0-6" x="256.6015" y="239.734001"/> - <use xlink:href="#glyph0-18" x="262.5865" y="239.734001"/> - <use xlink:href="#glyph0-17" x="273.8535" y="239.734001"/> - <use xlink:href="#glyph0-6" x="284.4175" y="239.734001"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-19" x="226.6955" y="151.734001"/> - <use xlink:href="#glyph0-20" x="238.3045" y="151.734001"/> - <use xlink:href="#glyph0-4" x="248.1465" y="151.734001"/> - <use xlink:href="#glyph0-21" x="258.3495" y="151.734001"/> - <use xlink:href="#glyph0-17" x="268.5525" y="151.734001"/> - <use xlink:href="#glyph0-6" x="279.1165" y="151.734001"/> - <use xlink:href="#glyph0-4" x="285.1015" y="151.734001"/> + <use xlink:href="#glyph0-7" x="239.1082" y="136"/> + <use xlink:href="#glyph0-4" x="251.4202" y="136"/> + <use xlink:href="#glyph0-5" x="261.6232" y="136"/> + <use xlink:href="#glyph0-15" x="272.1872" y="136"/> </g> </g> </svg>