<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Literate Computing for Reproducible Infrastructure
<img src="./images/literate_computing-logo.png" alt='LC_LOGO' align='left'/>
NII Cloud Operation is a team supporting researchers and teachers in our institute.  To make users more productive our team serves many roles, which are maintaining private OpenStack infrastructure, setting up various software stacks, consulting their configuration and optimization, and managing almost everything.<br>
Literate Computing for Reproducible Infrastrucre is our project, which seeks to utilize Jupyter Notebook in operational engineering area for seeking ..<br>
計算機インフラの御守では種々雑多なドキュメンテーションが不可欠です。日々の作業で証跡を残す、手順を整理して共有・再利用する、ユーザマニュアルや教材を整備する.. 国立情報学研究所（NII）のクラウド運用担当では、これらをシームレスに記述・蓄積する方法を研究しています。
表題の Literate Computing for Reproducible Infrastructure は、そのような取り組みのプロジェクト名です。プロジェクトでは Jupyter Notebook を用いてドキュメンテーションを行うことで、運用作業の信頼性向上、手順やノウハウの蓄積・流通が容易になることを目指しています。
インフラ運用の場面において 機械的に再現できる、人が読み解ける手順 を手段として、過度に自動化に依存することのない、レジリエントな 人間中心の機械化 をめざしています。そこでは、作業を効率化しつつもブラックボックス化せず、作業に対する理解をチーム内でコミュニケーションできる、また、目的と手段の整合性や限界を理解し議論・評価できると言った場を維持することで、ノウハウの移転・共有を促し運用者のスキル向上とエンジニアリングチームの再生産をはかる ことを重視しています。
多くの現場では、管理サーバにログインしコンソール上で作業を行う、作業内容や証跡はWiki等に随時転記して共有する.. といった形態が一般的と思います。これに対しLC4RIでは運用管理サーバ上にNotebookサーバを配備し、作業単位毎にNotebookを作成、作業内容やメモを記述しながら随時実行するといった作業形態を推奨しています。作業の証跡を齟齬なく記録する仕組み、過去の作業記録を参照して機械的に再現あるいは流用できる仕組み、機械的に実行できるとともに人が読み解き補完することもできるNotebook手順を整備しています。
プロジェクトの成果物は GitHub NII Cloud Operation Teamで公開しています。
Hadoop や Elastic Search など学術機関でポピュラーなインフラにに関する構築や 運用の手順を整理したもの、また、構築や運用の手順を記述するために便利な Jupyterの機能拡張 を掲載しています。
This notebook demonstrates our project's extensions for Literate Computing for Reproducible Infrastructure. <br>
この Notebook では拡張した機能の概要を紹介します。 
(2019.06.20)
Jupyter-run_through <span lang="ja">- まとめ実行機能</span>
Usage
Step1:  "echo" に修正して実行してみましょう。
Step2:  Jupyter-LC_wrapper
Usage
Step3:  Jupyter-multi_outputs
用途
Step4:  上の例では、タブをクリックすると以前の出力結果を参照することができます。
Step5:  以前の出力結果を選択表示すると <span class='fa fa-fw fa-thumb-tack'></span> が <span class='fa fa-fw fa-exchange'></span> に変わります。この <span class='fa fa-fw fa-exchange'></span>をクリックすると、選択している出力と現在の出力を比較することができます。
<ASSISTANT_TASK:>
Python Code:
! echo "This is 1st step" > foo; cat foo
! echo ".. 2nd step..." >> foo && cat foo
!echooooo ".. 3rd step... will fail" >> foo && cat foo
Explanation: Literate Computing for Reproducible Infrastructure
<img src="./images/literate_computing-logo.png" alt='LC_LOGO' align='left'/>
NII Cloud Operation is a team supporting researchers and teachers in our institute.  To make users more productive our team serves many roles, which are maintaining private OpenStack infrastructure, setting up various software stacks, consulting their configuration and optimization, and managing almost everything.<br>
Literate Computing for Reproducible Infrastrucre is our project, which seeks to utilize Jupyter Notebook in operational engineering area for seeking ..<br>
計算機インフラの御守では種々雑多なドキュメンテーションが不可欠です。日々の作業で証跡を残す、手順を整理して共有・再利用する、ユーザマニュアルや教材を整備する.. 国立情報学研究所（NII）のクラウド運用担当では、これらをシームレスに記述・蓄積する方法を研究しています。
表題の Literate Computing for Reproducible Infrastructure は、そのような取り組みのプロジェクト名です。プロジェクトでは Jupyter Notebook を用いてドキュメンテーションを行うことで、運用作業の信頼性向上、手順やノウハウの蓄積・流通が容易になることを目指しています。
インフラ運用の場面において 機械的に再現できる、人が読み解ける手順 を手段として、過度に自動化に依存することのない、レジリエントな 人間中心の機械化 をめざしています。そこでは、作業を効率化しつつもブラックボックス化せず、作業に対する理解をチーム内でコミュニケーションできる、また、目的と手段の整合性や限界を理解し議論・評価できると言った場を維持することで、ノウハウの移転・共有を促し運用者のスキル向上とエンジニアリングチームの再生産をはかる ことを重視しています。
多くの現場では、管理サーバにログインしコンソール上で作業を行う、作業内容や証跡はWiki等に随時転記して共有する.. といった形態が一般的と思います。これに対しLC4RIでは運用管理サーバ上にNotebookサーバを配備し、作業単位毎にNotebookを作成、作業内容やメモを記述しながら随時実行するといった作業形態を推奨しています。作業の証跡を齟齬なく記録する仕組み、過去の作業記録を参照して機械的に再現あるいは流用できる仕組み、機械的に実行できるとともに人が読み解き補完することもできるNotebook手順を整備しています。
プロジェクトの成果物は GitHub NII Cloud Operation Teamで公開しています。
Hadoop や Elastic Search など学術機関でポピュラーなインフラにに関する構築や 運用の手順を整理したもの、また、構築や運用の手順を記述するために便利な Jupyterの機能拡張 を掲載しています。
This notebook demonstrates our project's extensions for Literate Computing for Reproducible Infrastructure. <br>
この Notebook では拡張した機能の概要を紹介します。 
(2019.06.20)
Jupyter-run_through <span lang="ja">- まとめ実行機能</span>
Usage:
* Freeze: Preventing miss-operation; once a code cell has been executed, it freezes against unintended execution and modification. Note that the freeze is implemented as different state from standard cell lock's. The freeze only make an executed cell un-editable temporally.<br>
//誤操作を防ぐ; いったんセルを実行すると"凍結"され解凍しないと再実行できない。また、セルの編集をロックすることもできる。
Bricks: Giving a summarized perspective for execution control; embedded "cells" underneath are represented as bricks and be able to run through altogether with a click, while markdowns and codes are collapsed using <span class='fa fa-fw fa-external-link'></span>Collapsible Headings<br>
//まとめ実行; マークダウンを畳み込んだ際に、畳み込まれた範囲にあるすべての"Cell"を一連の"brick"として表示する。一連の"brick"を1-clickでまとめて実行できる。
Run_through: Execute collapsed code cells as a whole; Simply reuse workflows without paying much attention to details, whithout needs for arrenge nor customization. Run throughout the notebook as an executable checklist, then verify error if it occurs.<br>
//定型的な作業をまとめて実行する; 詳細は気にせずNotebook形式の手順を気軽に利用, アレンジやカスタマイズはあまり必要がない。まとめて実行してエラーが発生した時だけ詳細を確認したい; 実行可能なチェックリストとして用いる。
<span class='fa fa-fw fa-external-link'></span> GitHub: Jupyter-LC_run_through
<div style="width:30%;right">
[![DEMO LC_run_through](http://img.youtube.com/vi/pkzE_nwtEKQ/0.jpg)<span class='fa fa-fw fa-youtube'></span>LC_run_through](https://www.youtube.com/watch?v=pkzE_nwtEKQ)</div>
How-to: run_through <br>
The <span class='fa fa-fw fa-caret-right' style='color:#a0a0a0;'></span> on the collapsed headding indicates there are collapsed markdowns and cells.  With clicking <span class='fa fa-fw fa-caret-right' style='color:#a0a0a0;'></span> and <span class='fa fa-fw fa-caret-down' style='color:#a0a0a0;'></span> switch the expand/collapse.<br clear="right">
<img src="./images/run_through.png" align="right" width=30% />When headings are collapsed, executable cells underneath are represented as blicks. Each blick <span class='fa fa-fw fa-square' style='color:#cccccc;'></span> represents its collesponding cell's status, the gray means 'not executed yet'. 
Click <span class='fa fa-fw fa-play-circle'></span> runs through cells altogeather.<br clear="right">
<img src="./images/run_through_OK.png" width=30% align=right /> Normally executed and completed cells truned to light green <span class='fa fa-fw fa-square' style='color:#88ff88;'></span>. In addition completed cells are "frozen" <span class='fa fa-fw fa-snowflake-o' style='background-color:cornflowerblue;color:white;'></span>, that would not be executed again until "unfrozen" via toolbar <span class='fa fa-fw fa-snowflake-o'style='color:gray;'></span>.<br clear="right">
<img src="./images/run_through_NG.png" width=30% align=right /> In the case of error cells' execution is aborted and the blick turned to light coral<span class='fa fa-fw fa-square' style='color:#ff8888;'></span>.  You can examine the error by expanding folded cells with <span class='fa fa-fw fa-caret-right'></span>.
まとめ実行機能 <br>
表題の左側にある <span class='fa fa-fw fa-caret-right' style='color:#a0a0a0;'></span> は、詳細な手順が畳み込まれていることを示しています。  <span class='fa fa-fw fa-caret-right' style='color:#a0a0a0;'></span>  をクリックすると、 <span class='fa fa-fw fa-caret-down' style='color:#a0a0a0;'></span>  に変化し、畳み込まれている内容を表示することができます。この畳み込み表示機能は "Collapsible Headings"を利用しています。オリジナルの Collapsible Headings ではマークダウンの階層を畳み込むだけだったのですが、、
<br><br>
<img src="./images/run_through.png" align="right" width=30% /> まとめ実行機能では、畳みこまれている内容に「手順」（実行可能なセル）が含まれていると右のように正方形の箱 <span class='fa fa-fw fa-square' style='color:#cccccc;'></span>として可視化されます。箱の数は畳み込まれている手順のステップ数を示しています。
また、表示領域右上の<span class='fa fa-fw fa-play-circle'></span> を押すと、配下の手順をまとめて実行することができます。<br clear="right">
<img src="./images/run_through_OK.png" width=30% align=right /> すべてのステップが終了すると右のように箱の表示が変化します。実行が正常に完了したステップは薄緑 <span class='fa fa-fw fa-square' style='color:#88ff88;'></span>に表示されます。また、完了したステップは、再度 まとめ実行ボタン<span class='fa fa-fw fa-play-circle'></span>をクリックしても実行されないよう凍結されます。 箱内側のスノーフレーク &ldquo;<span class='fa fa-fw fa-snowflake-o' style='background-color:#cccccc;color:white;'></span>&rdquo; 
は、セルが凍結状態 <span class='fa fa-fw fa-snowflake-o' style='background-color:#88ff88;color:white;'></span><span class='fa fa-fw fa-snowflake-o' style='background-color:cornflowerblue;color:white;'></span>であることを示しています。<br clear="right">
<img src="./images/run_through_NG.png" width=30% align=right /> 途中でエラーが発生した場合は当該のステップが薄紅<span class='fa fa-fw fa-square' style='color:#ff8888;'></span>に表示されます。畳み込み表示を <span class='fa fa-fw fa-caret-right' style='color:#a0a0a0;'></span> をクリックし解除すると、それぞれのステップの実行内容を確認することができます。<br clear="right">
<img src="./images/run_through_Frozen2.png" width=20% align=right /> セルの凍結 <br>
実行が正常に終わったセルは凍結 <span class='fa fa-fw fa-snowflake-o' style='background-color:cornflowerblue;color:white;'></span> されます。凍結状態のセルはそのままでは実行することも、修正することもできません。凍結状態を解除するにはツールから<span class='fa fa-fw fa-snowflake-o' style='color:gray;'></span>をクリックします。
凍結機能は、実行済みの範囲を識別するとともに、偶発的な重複実行を防止するためのものです。また、まとめ実行ボタン<span class='fa fa-fw fa-play-circle'></span>は一定期間、チャタリングを防止するように制御しています。<br>
エラーのセル<span class='fa fa-fw fa-square' style='color:#ff8888;'></span>は内容を修正して再実行することができます。実行が終わって凍結状態 <span class='fa fa-fw fa-snowflake-o' style='background-color:cornflowerblue;color:white;'></span> のセルはスキップされるので、エラーを修正した後、まとめ実行ボタン<span class='fa fa-fw fa-play-circle'></span>を再度押すことで作業を継続できます。修正したセル<span class='fa fa-fw fa-square' style='color:#ff8888;'></span>（未実行）と継続する未実行のセル<span class='fa fa-fw fa-square' style='color:#cccccc;'></span>が実行されます。<br>
<br>
エラーの原因が当該のセル単体ではなく、遡ったセルの実行結果に依存している場合は、必要な範囲まで凍結を解除することになります。まとめて凍結を解除するには、ツールから<span class='fa fa-fw fa-snowflake-o' style='color:gray;'></span><span class='fa fa-fw fa-fast-forward'></span>、<span class='fa fa-fw fa-snowflake-o' style='color:gray;'></span><span class='fa fa-fw fa-forward'></span>を利用することができます。
<br clear="right">
Example
Run_through:  Try &ldquo;<span class='fa fa-fw fa-caret-right' style='color:#a0a0a0;'></span>&rdquo;, which will collapse cells, then, &ldquo;<span class='fa fa-fw fa-play-circle'></span>&rdquo; will run through four bricks.<br>
<br>
<span class='fa fa-fw fa-square' style='color:#88ff88;'></span>: The light green bricks indicate successfull completion.<br>
<span class='fa fa-fw fa-square' style='color:#ff8888;'></span>: The third light coral brick indicates some error.<br>
<br>
<span class='fa fa-fw fa-snowflake-o' style='background-color:#cccccc;color:white;'></span><span class='fa fa-fw fa-snowflake-o' style='background-color:#88ff88;color:white;'></span><span class='fa fa-fw fa-snowflake-o' style='background-color:cornflowerblue;color:white;'></span>: The snow flake indicates those bricks are frozen.  Executions and edits are prohibitted.  The &ldquo;<span class='fa fa-fw fa-snowflake-o' style='color:gray;'></span>&rdquo; will unfrozen bricks.<br>
The succeeded cells <span class='fa fa-fw fa-square' style='color:#88ff88;'></span> will be automatically frozen in order to prevent accidental duplicate operations.  Error cells
<span class='fa fa-fw fa-square' style='color:#ff8888;'></span> remain unfrozen, then you can fix errors and re-execute the cell.  You can continue execution on following not-yet-executed cells <span class='fa fa-fw fa-square' style='color:#cccccc;'></span>.
畳み込んだステップのまとめ実行: 表題の横に <span class='fa fa-fw fa-caret-down' style='color:#a0a0a0;'></span> が表示されている場合はクリックしてセルを畳み込んでください。畳み込まれた状態では <span class='fa fa-fw fa-caret-right' style='color:#a0a0a0;'></span>に変化します。<br>
この例では <span class='fa fa-fw fa-play-circle'></span> をクリックすると４ステップをまとめ実行します。実行が終わったステップは薄緑の表示<span class='fa fa-fw fa-square' style='color:#88ff88;'></span>となります。以下では３番目がエラーとなり薄紅表示<span class='fa fa-fw fa-square' style='color:#ff8888;'></span>され、実行が中断します。<br>
<span class='fa fa-fw fa-caret-right' style='color:#a0a0a0;'></span> をクリックしてエラーの内容を確認します。
エラーのセルを修正すると、続きから実行することができます。<br>
<br>
凍結状態のセルは実行することも、修正することもできません。再度実行する場合にはウインドウ上部の<span class='fa fa-fw fa-snowflake-o' style='color:gray;'></span>をクリックすることで凍結を解除します。<br>
End of explanation
! cat foo
Explanation: "echo" に修正して実行してみましょう。
End of explanation
%env lc_wrapper 8:8:10:10
# lc_wrapper s:h:e:f
#
# s : Summary starts when # of output lines exceed 's' (default s=1)
# h : Summary displays the first h lines and max 2 x h error lines.
# e : Max # of output lines in progress. 
# f : Summary displays the last f lines (default f=1)
!!from time import sleep
with open("./resources/bootstrap.log", "r") as f: # "/var/log/bootstrap.log"
    count = 0
    limit = 100
    for line in f:
        count = count+1
        if count > limit: break
        print(line, end=''),
        sleep(0.05)
print ("after", limit, "lines are ignored")
#
# Emulate large log output..
Explanation: Jupyter-LC_wrapper
Usage:
* Summarize massive output lines.<br>
//大量のログ出力を要約表示する。
* At each cell’s execution all original output lines are saved into an individual file with a time stamp.<br>
//複数の実行ログを各々ファイルに保存し、後で全体を参照したり、結果を比較できるようにする。
<span class='fa fa-fw fa-external-link'></span> GitHub: Jupyter-LC_wrapper
<p lang="all"><div style="width:30%">
[![DEMO LC_wrapper](http://img.youtube.com/vi/-28XG7aHYY8/0.jpg) <span class='fa fa-fw fa-youtube'></span>LC_wrapper Kernel](https://www.youtube.com/watch?v=-28XG7aHYY8)</div>
</p>
You can review whole output and compare with previous results from different executions.<br>
When you install some pakages, there would be massive log lines.  Jupyter Web UI is inefficient for handling a large number of output lines.
例えば、某かのパッケージ群をインストールしたりすると大量のログが出力されますが、JupyetrのWeb UI上で大量の出力を扱うのはなにかと不便です。 Jupyterの Cell の中でログの内容を検索したり、比較したりするのはまどろっこしく手間がかかります。<br>
Jupyter-LC_wrapper を用いると:<br>
・ Output Cell には要約されてた結果が出力されるようになります（例：最初10行と最後の10行）。<br>
・ オリジナルの出力結果全体はファイルに保存されます。<br>
・ 実行毎に各々のファイルに結果が保存されるので出力結果を比較することができます。<br>
・ 要約中でも、エラーなど特定のパターン含む行を表示します（lc_wrapper_regex.txt などいくつかの方法でカスタマイズ可）。<br>
Cellでコマンドを実行する際に先頭に "!!" を付加すると、LC_wrapper の機能が有効になります。
Cellで shell を呼び出す場合は "!!!" を付加してください。
End of explanation
import pandas
import matplotlib
import matplotlib.pyplot as plt
import random
%matplotlib inline
plot_df = pandas.DataFrame({
    'col1': [12, 3, random.randint(1,10), 4],
    'col2': [3, 12, 5, 2],
    'col3': [random.randint(4,7), 10, 3, random.randint(0,2)],
    'col4': [random.randint(0,11), 5, random.randint(6,12), random.randint(0,5)],
})
plot_df
plot_df.plot()
Explanation: Jupyter-multi_outputs
用途:
* 出力結果を保存する。
* 現在の出力結果と、以前の出力結果を比較する（いまのところ文字列のみ）。
<span class='fa fa-fw fa-external-link'></span> Jupyter-multi-outputs
<img src="./images/multi_outputs.png" align="right" width=40% />実行後セルの左側に表示される <span class='fa fa-fw fa-thumb-tack'></span> をクリックすると、出力セルの内容がタブ形式で保存されます。
保存された出力のタブを選択した際に表示される <span class='fa fa-fw fa-exchange'></span> をクリックすると、現在の出力と比較することができます。<br><br>
何度もセルを試行する場合、毎回の結果を保存しておくことができます。<br>
お手本となる手順や教材を Notebook で作成する際に、期待される結果や正解を保存しておくなどの用途が考えられます。
End of explanation
plot_df
Explanation: 上の例では、タブをクリックすると以前の出力結果を参照することができます。
End of explanation
plot_df.transpose
Explanation: 以前の出力結果を選択表示すると <span class='fa fa-fw fa-thumb-tack'></span> が <span class='fa fa-fw fa-exchange'></span> に変わります。この <span class='fa fa-fw fa-exchange'></span>をクリックすると、選択している出力と現在の出力を比較することができます。
End of explanation
<END_TASK>