#author("2023-11-04T16:14:27+00:00","","") #author("2023-11-04T16:15:09+00:00","","") [[技術資料]] 以前のバージョンはこちら~ [[Blocly技術資料(2023/10以前)バックアップ]] *目次 [#e80b3d5] #CONTENTS **1. 目標 [#i67428c5] ビジュアルプログラミングによるデータ処理を行う。Blocklyというオープンソースのビジュアルプログラミングを用いる。使用するプログラミング言語は主にJavascript/Pythonである。 **2. 環境構築及び実行 [#e321d51d] ***必要なもの [#j04453c8] -パソコン(OSはいずれでもよいがLinuxで運用するのが普通だと思う) - - - - ***Windows SubSystem for Linux2(WSL2)(Linux、UNIXでも可) [#v743175a] とりあえず、WSL2のインストールから始める。以下のサイト見ながらでできる。 https://docs.microsoft.com/ja-jp/windows/wsl/install-win10 一応ここにその内容を記す。まず、管理者権限でPowerShellを開き、次のコマンドを入力する。 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 次に、同じくpowershellでwindowsのどのシステムを使用しているか次のコマンドで確認する。 systeminfo | Select-String "システムの種類" → x64 や ARM64 などが表示される %%コマンドプロンプトの場合はこれ%%~ %% systeminfo | find "システムの種類"%% 次にwindowsのバージョンとビルド番号を確認する。~ Windows ロゴ キー + R キー を押して、「 winver 」と入力し、 [OK] を選択する。 (または、Windows コマンド プロンプトで ver コマンドを入力)。 #ref(ver_build.png,,40%) 上図が出るので、適切なバージョンを満たしているか確認する -x64 システムの場合: バージョン 1903 以降、 ビルド 18362 以上。 -ARM64 システムの場合: バージョン 2004 以降、 ビルド 19041 以上。 --18362 より前のビルドは WSL 2 をサポートしていません。 Windows 更新アシスタントを使用して、お使いのバージョンの Windows を更新します。Windows 10 バージョン 1903 または 1909 を実行している場合は、Windows メニューから [設定] を開き、[更新とセキュリティ] に移動して、[更新プログラムのチェック] を選択します。 ビルド番号は、18362.1049+ または 18363.1049+ で、マイナー ビルド番号は .1049 より大きい必要があります。windowsのマイナービルド番号を満たしていない場合は、windowsマークをクリックして、歯車マークをクリックして設定を開きWindows Updateを行う。 WSL 2 をインストールする前に、" 仮想マシン プラットフォーム " オプション機能を有効にする必要がある。~ 管理者として PowerShell を開き、以下を実行する。 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart PCを&size(20){&color(red,white){再起動};};して WSL のインストールを完了し、WSL 2 に更新する。 次にWSL2Linuxカーネル更新プログラムパッケージをダウンロードする。システムがx64の場合はx64、ARM64の場合はARM64をクリックする。 [[x64:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi]] [[ARM64:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_arm64.msi]] ダウンロード後、ダウンロードしたファイルを実行する。 次に、次のコマンドで、新しい Linux ディストリビューションをインストールする際の既定のバージョンとして WSL 2 を設定する。 wsl --set-default-version 2 次に、Ubuntu 20.04 LTSをMicrosoft Storeからインストールする。 下のリンクに行って入手を選択する。 [[Ubuntu 20.04 LTS:https://www.microsoft.com/store/apps/9n6svws3rx71]] 複数のデバイスで使うか聞かれたら必要ないと答える。 -ubuntuのインストールボタンが出ない場合は、下記のエラー対応集(10)へ その後、起動し、ユーザー名とパスワードを設定する。どちらも覚えるか&size(20){&color(red,white){記録};};しておく。 --このユーザー名およびパスワードは、インストールする Linux ディストリビューションごとに固有であり、Windows ユーザー名とは関係ありません。 ユーザーがユーザー名およびパスワードを作成すると、そのアカウントがディストリビューションの既定のユーザーとなり、起動時に自動的にサインインされます。 このアカウントは、Linux 管理者と見なされ、sudo (Super User Do) 管理コマンドを実行できます。 ***WSL2のBlocklyのための環境構築 [#s827ee10] ここから、Ubuntuで作業する。Ubuntuで次のコマンドを実行する。 sudo apt update sudo apt -yV upgrade WSL2を再起動する(Ubuntuを閉じて再度開く)。再起動後、次のコマンドを実行する。 sudo apt install apache2 apache2 -v -このコマンドはapache2というWebサーバーソフトウェアをインストールしている。インターネット上で企業や官公庁の公式サイトで情報を入手したり、動画やSNSを利用したりする場合には、必ずWebサーバーソフトウェアのお世話になる。そのうち半数でApacheが稼働している。 ***WSL2へのpyenv(python)のインストール [#m9448d25] 以下のコマンドはpythonを使用するために必要な機能をインストールしている。 sudo apt install -y build-essential libffi-dev zlib1g-dev liblzma-dev libbz2-dev libreadline-dev libsqlite3-dev git net-tools libssl-dev ここでWSL2(Ubuntu)を再起動。 次に以下のコマンドでpyenv本体のダウンロードとインストールをする。 git clone https://github.com/pyenv/pyenv.git ~/.pyenv 次に、以下のコマンドで.bashrcの更新をする。 echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc source ~/.bashrc WSL2(Ubuntu)を再起動。再起動後に次へ 以下のコマンドでpyenvがインストールできたかを確認(pyenvはLinuxにおいて、Pythonの実行環境を管理するツール。つまりいろんなバージョンのpythonを管理する有能) pyenv -v 以下のコマンドでpythonのインストール pyenv install 3.8.5 # 例えば,version 3.8.5 pyenv versions # インストール済みのpyenvのバージョンを確認できる pyenv global 3.8.5 以下必要なライブラリのインストール python -m pip install pyocr matplotlib pydotplus pulp pandas scikit-learn graphviz opencv-python docopt sudo apt install tesseract-ocr libtesseract-dev tesseract-ocr-jpn sudo apt-get dist-upgrade sudo apt-get install build-essential sudo apt-get update sudo apt-get install graphviz mecab libmecab-dev mecab-ipadic-utf8 cd ~ sudo apt install swig →エラーが出たらエラー対応集(11)へ sudo apt install python3-pip sudo pip3 install mecab-python3 sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev https://www.engineer-log.com/entry/2019/10/31/tesseract5-install 下記のライブラリは必要に応じてインストールする(専門ゼミでは飛ばす) -自然言語処理系のBlockを動かす場合 git clone https://github.com/neologd/mecab-ipadic-neologd.git cd mecab-ipadic-neologd sudo bin/install-mecab-ipadic-neologd → 所要時間約13分 cd /etc sudo vim mecabrc # ここで:set pasteをし,aを押し,以下にコピペで変更する dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd :wq で保存 -手書き文字認識(OCR)や画像処理系のBlockを動かす場合 cd git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git cd ~/opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_OPENGL=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D OPENCV_GENERATE_PKGCONFIG=ON .. make -j7 → 所要時間約7分 sudo make install *** エラー対応集 [#ee6d4148] (10)「Ubuntu 20.04」のインストール項目が出ない場合、 -管理者powershellで以下コマンドを打ちインストールする curl.exe -L -o ubuntu-2004.appx https://aka.ms/wslubuntu2004 -エクスプローラーで「C:\Windows\System32」に行くと下の方に「Ubuntu 20.04」に似た名前のフォルダができているので、それをクリックしてインストールする --ubuntuのコンソール画面が出ればOK 参考「https://qiita.com/choco227/items/38c141b6b105d9a7cf56」 %%20.04前後のverだとpip installやBlockly操作が上手くいかない可能性%% (11)「E: Unable to locate package swig」の表示で,swigのインストールができない -以下のコマンドを試した後に再度「sudo apt install swig」を実行 git clone https://github.com/swig/swig.git 参考「https://askubuntu.com/questions/893932/sudo-apt-get-install-swig-on-ubuntu-14-04」 ***WSL2内でのBlockly環境構築 [#v88fa7b7] ダウンロードすべきファイルを以下のzipファイルにまとめたので、これをダウンロード&解答し、任意のフォルダに置く。~ #ref(20201118product.zip) エクスプローラーのパスのところで、\\wsl$と入力しEnter。アクセス許可がないと言われたら許可する。 #ref(ubuntu_dir.png,,70%) -これによって、Ubuntu(Blocklyサーバー側)のファイルにアクセスできる -以下のパスを辿る Ubuntu-20.04 > var > www > html Ubuntu-20.04 > usr > lib > cgi-bin 簡単アクセスのため、両方を右クリックで「クイックアクセスにピン止めする」~ #ref(ubuntu_copy.png,,50%) DLした「20201118product」にある「html」の中身を、「/var/www/html」に入れる。~ 「20201118product」にある「cgi-bin」の中身を「/usr/lib/cgi-bin」に入れる。 htmlにはBlocklyサイトを構成するファイル、cgi-binにはpythonで動かすデータ処理に関するファイルが入っている 次に以下のchmodコマンドでファイルのアクセス権限を変更する -Linuxでは管理者/準管理者グループ/外部ユーザの人に対してと、読み込み/書き込み/実行許可に対しての2種類設定する -r(読み込み許可)、w(書き込み許可)、x(実行許可)とし、r=4, w=2, x=1と表現する -例えば「chmod 755」は、後ろに指定したファイルに対し、管理者はr,w,x全て可能、準管理者グループはr,xが可能、外部ユーザもr,xが可能を意味する(「ll /usr/lib/」などを打つと、そのディレクトリ内のファイルがr,w,xが可能か確認できる) sudo chmod 777 /usr/lib/cgi-bin sudo chmod 777 /usr/lib/cgi-bin/kaiki*.cgi sudo chmod 777 /var/www/html 例題では「回帰分析ブロック」を動かすので、以下のコマンドで「kaiki~.cgi」の編集画面を開く -Blockly処理時にはpythonのプログラムをそのまま認識できないので、cgiファイルにpythonのコードを書き込むことでデータ処理できるようにしている sudo nano /usr/lib/cgi-bin/kaiki_Analyze.cgi sudo nano /usr/lib/cgi-bin/kaiki_keisu.cgi sudo nano /usr/lib/cgi-bin/kaiki_yosoku.cgi 上のコマンドで開いた後、以下の二つの部分のrthetaというところを先ほど設定した自分のユーザー名に変更する #!/home/rtheta/.pyenv/shims/python 「Ctrl+X」→「y」→「Enter」で保存する。 次のコマンドでcgiモジュールを有効にできる。これはcgi-binに入っているファイルを実行するためのmodを有効にしている。 sudo a2enmod cgid %%次に、CSVファイル入れるところ作る。%% %% cd%%~ %% mkdir kaiki%%~ %% sudo chmod 777 kaiki%% %%入れるとき拒否られたら次のコマンドをubuntuで。chmodで読み込みや書き込みを他の人からでもできるようにしている。%%~ %% sudo chmod 777 /var/www/html%%~ %% sudo chmod 777 /usr/lib/cgi-bin%%~ %% cgi-binなかったら次のコマンド。cgi-binディレクトリを作成している%%~ %% mkdir /usr/lib/cgi-bin%%~ %% その後以下を実行。ファイルの権限を変えてる。755にするのは、この後のウェブ上のサイトから他のパソコンからでも使えるようにするため。(しかし書き込みはできない。これについて知りたかったらchmodについて調べて)%%~ %% sudo chmod 755 /usr/lib/cgi-bin%%~ %% sudo chmod 755 /usr/lib/cgi-bin/kaiki.cgi%%~ %% python -m pip install pandas%%~ %% python -m pip install scikit-learn%%~ %%以下のコマンドでエディタ開ける。%%~ %% sudo nano /usr/lib/cgi-bin/kaiki.cgi%%~ %%上のコマンドで開いた後、以下の二つの部分のzetaというところを自分のUbuntuのユーザー名に変える%%~ %% #!/home/zeta/.pyenv/shims/python%%~ %% wine.to_csv('/home/zeta/kaiki/123456.csv', header=False, index=False)%%~ %%「Ctrl+X」→「y」→「Enter」で保存する。%%~ %%次のコマンドでCGIモジュールを有効にできる。これはcgi-binに入っているファイルを実行するためのmodを有効にしている。%%~ %% sudo a2enmod cgid%%~ ***Blocklyの実行[#ic4c479f] 次のコマンドをWSL2上で実行するとサーバーが立ち上がる。 sudo service apache2 restart 自分のWSL2のIPアドレスを調べるためにWSL2上で次のコマンドを実行する。 ifconfig #ref(ifco.PNG,,40%) WSL2のIPアドレスはeth0のinetのところに書かれているIPアドレスである。次に自分のWindowsでそのIPアドレスをGoogle Chromeに入力し移動すると、Blocklyを開くことができる。 -Google Chromeはキャッシュが残るため&COLOR(red){シークレットタブで開くこと}を推奨 --Google Chrome上で「Ctrl+shift+n」を押すことでシークレットタブが開ける~ --シークレットタブでブロックの更新が反映されないときは、通常タブで開いて更新されているか確認する #ref(blockly_index.png,,40%) ~ ***ビジュアルプログラミングの例題(回帰分析) [#fef035eb] 以下のデータを用いる。 #ref(kaiki_keisu_yosoku.csv) -このCSVファイルは、数種類の説明変数と1つの目的変数から構成されたデータとなっている -このデータを「回帰Block」に入れることで、目的変数と説明変数の関係(関数)を予測する。 #ref(kaiki_data.png,,40%) -csvファイルの一行目はデータ数を表す。 -二行目は、回帰分析であれば、1~11列が説明変数、12列目が目的変数など、入力と出力のような関係を表す。 -三行目は、その列のデータのラベルである。文字であれば何でもよい。 -四行目は、その列のデータの型である。例えば、intやfloat、stringなどが入る。 -それ以下の行は、データである。 #ref(Block1.png,,40%) まず、「FILE_INPUT」から入力「CSV読み込み」ブロック、「ANALYZE→DIV1」から分析「回帰分析」ブロック(上図オレンジ)、「OUTPUT」から出力「CSV出力」ブロックを取り出す。 #ref(Block2.png,,60%) 赤ブロックの「CSVファイルを選択してください」をクリックして、先ほどのcsvを入れる -入れるとデータの中身(1599)が表示される -入力、分析、出力ブロックをパズルのように合体させ、上図の形を作る ~ #ref(Block3.png,,60%) 中央の歯車をクリックし、ラベルリストに左のブロックのいずれかを入れる --「ラベルを一つ選択」を入れると一列を目的変数、別一列を説明変数とする単回帰分析になる --「ラベルを一つ選択」を複数入れると、それらの列を説明変数、一列を目的変数とする重回帰分析となる --「ラベルをまとめて選択」を入れると、ある列からある列を説明変数、一列を目的変数とする重回帰分析となる オレンジ右端で回帰予測をするか回帰係数を出力するかを選べる -例えば「ラベルをまとめて選択」にした場合、目的変数の欄にl(CSVのl列)、説明変数の欄にa~k(CSVのa~k列)と入れれば重回帰分析が行える 単回帰or重回帰、回帰予測or回帰係数を選択したら、右上の「実行」をクリックする -出力ファイル保存画面が出るので保存 -出力ファイルを開くと回帰予測なら「Predictの列」、回帰係数なら別CSVファイルが新たにできているので、確認する 実行時に「Ajax失敗」と出る場合、下記のエラー対応を参照 ***Blockly実行時のエラー対応 [#a1100621] #ref(error_f12.png,,60%) (1)表面的なエラー対応 -Blocklyの画面で「F12キー」を押し、上図のディベロッパー画面を出す -右上の赤×を押すと、赤字のエラー文が出てくる -400番台の数字エラーなら、PC側のエラーを表し、赤字の文を見て対処する -500番台やその他のエラーはubuntu側のエラーなので(2)へ (2-1)内部的なエラー対応(ubuntu側) ubuntuで以下のコマンドを打つ vim /var/log/apache2/error.log -この「error.log」のファイル内にはBlockly操作で起こったエラーが記される -最下部(「↓キー」で移動)に最新のエラーが表示されているので、それを見て対処する (2-2)「error.log」に「(2)No such file or directory: AH01241: exec of '/usr/lib/cgi-bin/kaiki_Analyze.cgi' failed」が書かれている場合、 -「kaiki_Analyze.cgi」の1行目を正しいパスに変更する ファイルの編集 sudo nano /usr/lib/cgi-bin/kaiki_Analyze.cgi 開いたファイル内 #!/home/(ubuntuユーザ名)/.pyenv/shims/python (3)ファイルを修正したら以下でサーバを更新してBlocklyを開く sudo service apache2 restart -シークレットタブを一度閉じ、再度IPアドレスを入力して開くことを推奨 ~ ※課題は 4. だが、時間がない場合は2. までできればOK ※課題は 4. だが、時間がない場合は 2. までできればOK ~ ~ **3. 新たな分析ブロックの作成 [#e321d51d] #ref(Analyze1.png,,60%) -Blocklyのメリットの一つに様々な統計分析をプログラミングなしにブロック操作のみで行える点がある -「ANALYZE→DIV1」にある分析ブロックは、今までにブロック化された統計手法である。 -ここにはない統計手法を実装することが重要なテーマとなる *** 分析ブロックの作成方法 [#xd8f382a] 以下2つの手順を行う -分析ブロックのもととなる処理をPythonで記述した「~.cgi」ファイルを作成する。 --ダウンロードフォルダ「cgi-bin」に作成する -ダウンロードフォルダ(html)中に入っている「average.js」「average_block.js」「toolbox.xml」を編集する。 **3.1 CGI(Common Gateway Interface)プログラム(データ処理)の作成 [#ib1fca70] -こちらからデータを送ってそのデータに基づいてサーバで処理を行い、結果を返すものをCGIという。今回は、CGIプログラムをpythonで作る。pythonを使う理由は、機械学習やデータ処理の部分を書くことが簡単だからである。以下がpythonで書かれた拡張子.cgiのプログラムである。 ***新規CGIファイル(分析ブロックのプログラム)の作り方 [#ua705440] cgi-binの権限を変更する sudo chmod 777 /usr/lib/cgi-bin/ -これによりUbuntu側でコマンド操作せずに、エクスプローラー側でcgiファイルを作れるようになる エクスプローラのパスの部分で、「\\wsl.localhost\Ubuntu-20.04\usr\lib\cgi-bin」と入力し、cgi-binフォルダ内で新たな.cgiファイルを作る -ファイルは「(分析手法名).cgi」などにする 編集できるようにcgiファイルの権限を許可する sudo chmod 777 /usr/lib/cgi-bin/(分析手法名).cgi 基本的に、以下の「kaiki_yosoku.cgi」の中身をコピペし、Pythonの処理部分だけを変更すればよい(VScodeなどでcgiファイルを開く) #ref(kaiki_yosoku.cgi); 以下、「kaiki_yosoku.cgi」を参考にしてcgiファイルを変更していく -pythonのcgiプログラム(ajaxを用いたPOST通信で動かすときのpythonプログラム)は以下のようなプログラムの形にする必要がある。 回帰分析ブロック(kaiki_yosoku.cgi) #ref(cgiteigi1.PNG,,60%) #ref(cgiteigi2.PNG,,60%) #ref(cgiteigi3.PNG,,60%) (1) 1行目をrthetaの部分をubuntuユーザー名に変える。 #!/home/rtheta/.pyenv/shims/python -1行目は使用する、プログラミング言語の実行コマンド(今回はpython)を入力している。 (2)2行目にこのcgiプログラムの文字コードを記述する。 # -*- coding: utf-8 -*- -UTF-8が楽なのでUTF-8を推奨する。 (3)Pythonライブラリimport部分をプログラムに合わせて変更する -「sys」「json」「cgi」は必ず残しておく (4) 15,16行目のようなおまじないをつける print("Content-type: application/json") print("\n\n") -このおまじないは、ajax通信で送られてきたものがjson形式で書かれていることをcgiプログラムに認識させている。 (5) 74,75行目のようなクライアントに返すためのおまじないをつける。 -wine_jsonの部分がクライアントに送信するものである。 -JSONにエンコードしているのは、ajax通信ではjsonで送られてきたものはjsonで返信しなければならない掟があるからである。 &size(20){&color(black,white){※上と下のおまじないの間(25~65行目)に実装したい分析手法(Pythonプログラム)を書けば新しい分析ブロックを作れる。};}; (6)入力ブロックからのデータ受け取り部分の実装 #ref(make1.png,,40%) -赤の入力ブロックに入れたファイルは19行目の「data」に入る 26行目で受け取ったデータをデータフレームにしている -入力データによく使うのはcsvなのでデータフレームの加工が多くなる -26行目は通常のPythonコードだと以下と同じような意味になる wine_df = pd.read_csv('data',encoding="shift-jis(or utf-8)",header=None) #ref(make_df.png,,60%) -上図のようなインデックスとカラム番号が自動で割り振られたwine_df(データフレーム)となる -31行目でインデックス4(5行目)以降のデータのみを取り出して回帰分析を行っている (7)生成したデータフレームを出力ブロックに送信 #ref(make2.png,,40%) -Pythonの処理が終わり、結果のデータフレーム(wine_df)をwine_json(67行目)に格納している -データフレームを再びjsonデータにしてサーバーに返送している **3.2 jsファイルの編集 [#ib1fca70] -cgi(分析ブロック)を動かすために「average.js」「average_block.js」「toolbox.xml」を編集する。 あらかじめ3つのファイルをVScodeなどで編集できるように権限を許可しておく sudo chmod 777 /var/www/html sudo chmod 777 /var/www/html/average* sudo chmod 777 /var/www/html/toolbox.xml (1)average.jsの編集 #ref(average.png,,50%) --average.jsには実行ボタンを押したときの動きが定義されている。 -デフォルトのaverage.jsではこのOCR(184行目)が一番最後の分析ブロックになっている -新たなcgi(分析ブロック)を作る際は、この下の行にOCRの5行をそのままコピペする -['ocr']の行を['bunseki12']など適当な名前にする -"read_csv11"の行を"read_csv12"に変更する --&size(15){&color(red,white){新たなブロックを追加するたびに12,13,14・・・と増やしていく};}; -「url: '../cgi-bin/~~~.cgi」の部分に自分の作ったcgiファイル名を入れる -「value_jpg」となっている2箇所を「value_csv」に変更する (2)average_block.jsの編集 #ref(average_block.png,,50%) --average_block.jsには、ブロックの見た目と表示されたときの動作が定義されている -同じようにocr(879行目)の約15行を下の行にコピペする -['ocr']の行を(1)と同じ['bunseki12']にする -"read_csv11"の行を"read_csv12"に変更する -.setCheckの中身を"csvFile"にする -.appendField("をOCRにより文字")の部分を「を(統計分析の名前)により(出力されるデータ形式)をCSVで出力する」の文章になるようにする --「を(統計分析の名前)により(出力されるデータ形式)」の部分だけ考える -.setOutput(true, "txtFile")を "csvFile"にする -「this.setTooltip("入力は画像ファイル。出力はテキストファイル。\n画像にある文字を判別する。")」はブロックの説明文になるので、適当なものに変更する (3)toolbox.xmlの編集 #ref(toolbox.png,,50%) --toolbox.xmlにはBlockly画面上でのブロックの並びが定義されている -ocr(44,45行目)の下に以下2行を追加する <block type="bunseki12"> </block> 3つのファイルを編集したら以下でサーバーを更新し、Blockly画面を開く sudo service apache2 restart 「Ajax失敗」が出るときは以下を見て対処する vim /var/log/apache2/error.log **4.【課題】行列計算ブロックの実装 [#e0e96358] -5x5行列が書かれたCSVを入力すると、逆行列/固有値/固有ベクトルが出力されるブロック 3.1, 3.2を参考に、「kaiki_yosoku.cgi」のPython処理部分を以下のPythonプログラムに書き換え、「matrix_calc.cgi」を作成する。 #ref(matrix_calc.py); 赤のブロックに入れるCSVファイルは以下を用いる #ref(input_data.csv); ブロック組み合わせのイメージ #ref(kadai_block.png,,50%); 最終的に以下のCSVが出力されるようにする #ref(kadai_output.png,,60%);