<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Takahiro</id>
		<title>Eospedia - 利用者の投稿記録 [ja]</title>
		<link rel="self" type="application/atom+xml" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Takahiro"/>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Takahiro"/>
		<updated>2026-05-05T08:57:49Z</updated>
		<subtitle>利用者の投稿記録</subtitle>
		<generator>MediaWiki 1.23.6</generator>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-15T09:14:57Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* ctffind4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&amp;lt;BR&amp;gt;&lt;br /&gt;
例えば、.bash_profileに以下を書き加えます。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffind4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解凍して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
例えば、ホームの.bash_profileに以下のように書き込んでください。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;***&amp;quot;には、それぞれのフォルダ、ファイルまでのパスを書き込んでください。&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
gsコマンド、latexコマンド、dvipdfコマンドなども使えると、解析結果をRELION上で確認することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
同様に、インストールしておくと良いでしょう。&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-15T09:12:18Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* ctffindD4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&amp;lt;BR&amp;gt;&lt;br /&gt;
例えば、.bash_profileに以下を書き加えます。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffind4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
例えば、ホームの.bash_profileに以下のように書き込んでください。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;***&amp;quot;には、それぞれのフォルダ、ファイルまでのパスを書き込んでください。&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
gsコマンド、latexコマンド、dvipdfコマンドなども使えると、解析結果をRELION上で確認することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
同様に、インストールしておくと良いでしょう。&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T10:08:32Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 環境設定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&amp;lt;BR&amp;gt;&lt;br /&gt;
例えば、.bash_profileに以下を書き加えます。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
例えば、ホームの.bash_profileに以下のように書き込んでください。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;***&amp;quot;には、それぞれのフォルダ、ファイルまでのパスを書き込んでください。&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
gsコマンド、latexコマンド、dvipdfコマンドなども使えると、解析結果をRELION上で確認することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
同様に、インストールしておくと良いでしょう。&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T10:08:12Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* Relion2.0 のインストール */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&amp;lt;BR&amp;gt;&lt;br /&gt;
例えば、.bash_profileに以下を書き加えます。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
例えば、ホームの.bush_profileに以下のように書き込んでください。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;***&amp;quot;には、それぞれのフォルダ、ファイルまでのパスを書き込んでください。&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
gsコマンド、latexコマンド、dvipdfコマンドなども使えると、解析結果をRELION上で確認することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
同様に、インストールしておくと良いでしょう。&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T10:04:56Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* Relion2.0 のインストール */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&amp;lt;BR&amp;gt;&lt;br /&gt;
例えば、.bush_profileに以下を書き加えます。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
例えば、ホームの.bush_profileに以下のように書き込んでください。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;***&amp;quot;には、それぞれのフォルダ、ファイルまでのパスを書き込んでください。&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
gsコマンド、latexコマンド、dvipdfコマンドなども使えると、解析結果をRELION上で確認することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
同様に、インストールしておくと良いでしょう。&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:55:49Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* その他 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
例えば、ホームの.bush_profileに以下のように書き込んでください。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;***&amp;quot;には、それぞれのフォルダ、ファイルまでのパスを書き込んでください。&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
gsコマンド、latexコマンド、dvipdfコマンドなども使えると、解析結果をRELION上で確認することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
同様に、インストールしておくと良いでしょう。&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:53:16Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 環境設定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
例えば、ホームの.bush_profileに以下のように書き込んでください。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;***&amp;quot;には、それぞれのフォルダ、ファイルまでのパスを書き込んでください。&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:52:58Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 環境設定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
例えば、ホームの.bush_profileに以下のように書き込んでください。&lt;br /&gt;
&amp;quot;***&amp;quot;には、それぞれのフォルダ、ファイルまでのパスを書き込んでください。&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:51:34Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 環境設定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&amp;quot;***&amp;quot;には、それぞれのフォルダ、ファイルまでのパスを書き込んでください。&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:50:28Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 環境設定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/***/relion/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/***/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/***/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/***/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:47:55Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 環境設定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/home/people/takahiro/src/relion2-beta/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/home/people/takahieo/src/relion2-beta/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion2-beta/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/home/people/takahiro/src/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:46:13Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* ResMap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、pythonのバージョンを確認しましょう。&lt;br /&gt;
 $ python --version&lt;br /&gt;
numpy、scipy、python-matplotlibをインストールします。&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
それぞれのバージョンを確認します。&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import numpy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; numpy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import scipy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; scipy.version.version&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import matlplotlib&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; matlplotlib.__version__&lt;br /&gt;
確認できたら、&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/home/people/takahiro/src/relion2-beta/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/home/people/takahieo/src/relion2-beta/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion2-beta/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/home/people/takahiro/src/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Enforce cluster jobs to occupy entire nodes with 24 hyperthreads&lt;br /&gt;
 export RELION_MINIMUM_DEDICATED=24&lt;br /&gt;
 # Do not allow the user to change the enforcement of entire nodes&lt;br /&gt;
 export RELION_ALLOW_CHANGE_MINIMUM_DEDICATED=0&lt;br /&gt;
&lt;br /&gt;
 # Ask for confirmation if users try to submit local jobs with more than 12 MPI nodes&lt;br /&gt;
 export RELION_WARNING_LOCAL_MPI=12&lt;br /&gt;
↑何のためかよくわからないが、Relionのホームページに載っていた&lt;br /&gt;
&lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:28:53Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ctffindD4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからctffind4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&lt;br /&gt;
 $ python --version&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
 #Setup openMPI&lt;br /&gt;
 export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
 #Setup RELION&lt;br /&gt;
 export PATH=/home/people/takahiro/src/relion2-beta/build/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/home/people/takahieo/src/relion2-beta/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 # Where is qsub template script stored&lt;br /&gt;
 export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion2-beta/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Default PDF viewer&lt;br /&gt;
 export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Default MOTIONCORR executable&lt;br /&gt;
 export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/home/people/takahiro/src/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Default CTFFIND executable, version 4.1.x&lt;br /&gt;
 export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Default ResMap executable&lt;br /&gt;
 export RELION_RESMAP_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Enforce cluster jobs to occupy entire nodes with 24 hyperthreads&lt;br /&gt;
 export RELION_MINIMUM_DEDICATED=24&lt;br /&gt;
 # Do not allow the user to change the enforcement of entire nodes&lt;br /&gt;
 export RELION_ALLOW_CHANGE_MINIMUM_DEDICATED=0&lt;br /&gt;
&lt;br /&gt;
 # Ask for confirmation if users try to submit local jobs with more than 12 MPI nodes&lt;br /&gt;
 export RELION_WARNING_LOCAL_MPI=12&lt;br /&gt;
↑何のためかよくわからないが、Relionのホームページに載っていた&lt;br /&gt;
&lt;br /&gt;
 # CUDA for RELION&lt;br /&gt;
 export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
 export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
 export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:25:54Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* RESMAP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからCTFFIND4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===ResMap===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ResMapを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&lt;br /&gt;
 $ python --version&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
relionからResMapが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
#Setup openMPI&lt;br /&gt;
export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
#Setup RELION&lt;br /&gt;
        #Relion-1.4#&lt;br /&gt;
#export PATH=/home/people/takahiro/src/relion-1.4/bin:$PATH&lt;br /&gt;
#export LD_LIBRARY_PATH=/home/people/takahieo/src/relion-1.4/lib:$LD_LIBRARY_PATH&lt;br /&gt;
#export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion-1.4/bin/qsub.csh&amp;quot;&lt;br /&gt;
        #Relion-2.0#&lt;br /&gt;
export PATH=/home/people/takahiro/src/relion2-beta/build/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/home/people/takahieo/src/relion2-beta/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
# Where is qsub template script stored&lt;br /&gt;
export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion2-beta/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default PDF viewer&lt;br /&gt;
export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default MOTIONCORR executable&lt;br /&gt;
export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/home/people/takahiro/src/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# For CTFFIND3 this would be&lt;br /&gt;
#export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctf/ctffind3_mp.exe&amp;quot;&lt;br /&gt;
# For Ctffind3_mp&lt;br /&gt;
#export NCPUS=32&lt;br /&gt;
# Default CTFFIND executable, version 4.1.x&lt;br /&gt;
export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default ResMap executable&lt;br /&gt;
export RELION_RESMAP_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Enforce cluster jobs to occupy entire nodes with 24 hyperthreads&lt;br /&gt;
export RELION_MINIMUM_DEDICATED=24&lt;br /&gt;
# Do not allow the user to change the enforcement of entire nodes&lt;br /&gt;
export RELION_ALLOW_CHANGE_MINIMUM_DEDICATED=0&lt;br /&gt;
&lt;br /&gt;
# Ask for confirmation if users try to submit local jobs with more than 12 MPI nodes&lt;br /&gt;
export RELION_WARNING_LOCAL_MPI=12&lt;br /&gt;
↑何のためかよくわからないが、Relionのホームページに載っていた&lt;br /&gt;
&lt;br /&gt;
# CUDA for RELION&lt;br /&gt;
export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:24:54Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* RESMAP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからCTFFIND4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
RESMAPを使用するためには、python(2.7以上)、numpy(1.6以上)、scipy(0.12以上)、python-matplotlib(1.2以上)が必要です。&lt;br /&gt;
 $ python --version&lt;br /&gt;
 $ yum install numpy&lt;br /&gt;
 $ yum install scipy&lt;br /&gt;
 $ yum install python-matplotlib&lt;br /&gt;
relionからRESMAPが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
#Setup openMPI&lt;br /&gt;
export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
#Setup RELION&lt;br /&gt;
        #Relion-1.4#&lt;br /&gt;
#export PATH=/home/people/takahiro/src/relion-1.4/bin:$PATH&lt;br /&gt;
#export LD_LIBRARY_PATH=/home/people/takahieo/src/relion-1.4/lib:$LD_LIBRARY_PATH&lt;br /&gt;
#export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion-1.4/bin/qsub.csh&amp;quot;&lt;br /&gt;
        #Relion-2.0#&lt;br /&gt;
export PATH=/home/people/takahiro/src/relion2-beta/build/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/home/people/takahieo/src/relion2-beta/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
# Where is qsub template script stored&lt;br /&gt;
export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion2-beta/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default PDF viewer&lt;br /&gt;
export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default MOTIONCORR executable&lt;br /&gt;
export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/home/people/takahiro/src/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# For CTFFIND3 this would be&lt;br /&gt;
#export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctf/ctffind3_mp.exe&amp;quot;&lt;br /&gt;
# For Ctffind3_mp&lt;br /&gt;
#export NCPUS=32&lt;br /&gt;
# Default CTFFIND executable, version 4.1.x&lt;br /&gt;
export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default ResMap executable&lt;br /&gt;
export RELION_RESMAP_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Enforce cluster jobs to occupy entire nodes with 24 hyperthreads&lt;br /&gt;
export RELION_MINIMUM_DEDICATED=24&lt;br /&gt;
# Do not allow the user to change the enforcement of entire nodes&lt;br /&gt;
export RELION_ALLOW_CHANGE_MINIMUM_DEDICATED=0&lt;br /&gt;
&lt;br /&gt;
# Ask for confirmation if users try to submit local jobs with more than 12 MPI nodes&lt;br /&gt;
export RELION_WARNING_LOCAL_MPI=12&lt;br /&gt;
↑何のためかよくわからないが、Relionのホームページに載っていた&lt;br /&gt;
&lt;br /&gt;
# CUDA for RELION&lt;br /&gt;
export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:21:08Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* CTFFIND4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctf&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからCTFFIND4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
relionからRESMAPが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
#Setup openMPI&lt;br /&gt;
export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
#Setup RELION&lt;br /&gt;
        #Relion-1.4#&lt;br /&gt;
#export PATH=/home/people/takahiro/src/relion-1.4/bin:$PATH&lt;br /&gt;
#export LD_LIBRARY_PATH=/home/people/takahieo/src/relion-1.4/lib:$LD_LIBRARY_PATH&lt;br /&gt;
#export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion-1.4/bin/qsub.csh&amp;quot;&lt;br /&gt;
        #Relion-2.0#&lt;br /&gt;
export PATH=/home/people/takahiro/src/relion2-beta/build/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/home/people/takahieo/src/relion2-beta/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
# Where is qsub template script stored&lt;br /&gt;
export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion2-beta/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default PDF viewer&lt;br /&gt;
export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default MOTIONCORR executable&lt;br /&gt;
export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/home/people/takahiro/src/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# For CTFFIND3 this would be&lt;br /&gt;
#export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctf/ctffind3_mp.exe&amp;quot;&lt;br /&gt;
# For Ctffind3_mp&lt;br /&gt;
#export NCPUS=32&lt;br /&gt;
# Default CTFFIND executable, version 4.1.x&lt;br /&gt;
export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default ResMap executable&lt;br /&gt;
export RELION_RESMAP_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Enforce cluster jobs to occupy entire nodes with 24 hyperthreads&lt;br /&gt;
export RELION_MINIMUM_DEDICATED=24&lt;br /&gt;
# Do not allow the user to change the enforcement of entire nodes&lt;br /&gt;
export RELION_ALLOW_CHANGE_MINIMUM_DEDICATED=0&lt;br /&gt;
&lt;br /&gt;
# Ask for confirmation if users try to submit local jobs with more than 12 MPI nodes&lt;br /&gt;
export RELION_WARNING_LOCAL_MPI=12&lt;br /&gt;
↑何のためかよくわからないが、Relionのホームページに載っていた&lt;br /&gt;
&lt;br /&gt;
# CUDA for RELION&lt;br /&gt;
export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:20:54Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* RESMAP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctfからダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからCTFFIND4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/&lt;br /&gt;
からダウンロードします。&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
relionからRESMAPが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
#Setup openMPI&lt;br /&gt;
export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
#Setup RELION&lt;br /&gt;
        #Relion-1.4#&lt;br /&gt;
#export PATH=/home/people/takahiro/src/relion-1.4/bin:$PATH&lt;br /&gt;
#export LD_LIBRARY_PATH=/home/people/takahieo/src/relion-1.4/lib:$LD_LIBRARY_PATH&lt;br /&gt;
#export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion-1.4/bin/qsub.csh&amp;quot;&lt;br /&gt;
        #Relion-2.0#&lt;br /&gt;
export PATH=/home/people/takahiro/src/relion2-beta/build/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/home/people/takahieo/src/relion2-beta/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
# Where is qsub template script stored&lt;br /&gt;
export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion2-beta/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default PDF viewer&lt;br /&gt;
export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default MOTIONCORR executable&lt;br /&gt;
export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/home/people/takahiro/src/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# For CTFFIND3 this would be&lt;br /&gt;
#export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctf/ctffind3_mp.exe&amp;quot;&lt;br /&gt;
# For Ctffind3_mp&lt;br /&gt;
#export NCPUS=32&lt;br /&gt;
# Default CTFFIND executable, version 4.1.x&lt;br /&gt;
export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default ResMap executable&lt;br /&gt;
export RELION_RESMAP_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Enforce cluster jobs to occupy entire nodes with 24 hyperthreads&lt;br /&gt;
export RELION_MINIMUM_DEDICATED=24&lt;br /&gt;
# Do not allow the user to change the enforcement of entire nodes&lt;br /&gt;
export RELION_ALLOW_CHANGE_MINIMUM_DEDICATED=0&lt;br /&gt;
&lt;br /&gt;
# Ask for confirmation if users try to submit local jobs with more than 12 MPI nodes&lt;br /&gt;
export RELION_WARNING_LOCAL_MPI=12&lt;br /&gt;
↑何のためかよくわからないが、Relionのホームページに載っていた&lt;br /&gt;
&lt;br /&gt;
# CUDA for RELION&lt;br /&gt;
export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:20:25Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* CTFFIND4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctfからダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからCTFFIND4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/からダウンロードします。&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
relionからRESMAPが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
#Setup openMPI&lt;br /&gt;
export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
#Setup RELION&lt;br /&gt;
        #Relion-1.4#&lt;br /&gt;
#export PATH=/home/people/takahiro/src/relion-1.4/bin:$PATH&lt;br /&gt;
#export LD_LIBRARY_PATH=/home/people/takahieo/src/relion-1.4/lib:$LD_LIBRARY_PATH&lt;br /&gt;
#export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion-1.4/bin/qsub.csh&amp;quot;&lt;br /&gt;
        #Relion-2.0#&lt;br /&gt;
export PATH=/home/people/takahiro/src/relion2-beta/build/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/home/people/takahieo/src/relion2-beta/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
# Where is qsub template script stored&lt;br /&gt;
export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion2-beta/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default PDF viewer&lt;br /&gt;
export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default MOTIONCORR executable&lt;br /&gt;
export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/home/people/takahiro/src/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# For CTFFIND3 this would be&lt;br /&gt;
#export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctf/ctffind3_mp.exe&amp;quot;&lt;br /&gt;
# For Ctffind3_mp&lt;br /&gt;
#export NCPUS=32&lt;br /&gt;
# Default CTFFIND executable, version 4.1.x&lt;br /&gt;
export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default ResMap executable&lt;br /&gt;
export RELION_RESMAP_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Enforce cluster jobs to occupy entire nodes with 24 hyperthreads&lt;br /&gt;
export RELION_MINIMUM_DEDICATED=24&lt;br /&gt;
# Do not allow the user to change the enforcement of entire nodes&lt;br /&gt;
export RELION_ALLOW_CHANGE_MINIMUM_DEDICATED=0&lt;br /&gt;
&lt;br /&gt;
# Ask for confirmation if users try to submit local jobs with more than 12 MPI nodes&lt;br /&gt;
export RELION_WARNING_LOCAL_MPI=12&lt;br /&gt;
↑何のためかよくわからないが、Relionのホームページに載っていた&lt;br /&gt;
&lt;br /&gt;
# CUDA for RELION&lt;br /&gt;
export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:18:30Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctfからダウンロードします。&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&lt;br /&gt;
relionからCTFFIND4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/からダウンロードします。&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
relionからRESMAPが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
#Setup openMPI&lt;br /&gt;
export PATH=/usr/lib64/openmpi/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
#Setup RELION&lt;br /&gt;
        #Relion-1.4#&lt;br /&gt;
#export PATH=/home/people/takahiro/src/relion-1.4/bin:$PATH&lt;br /&gt;
#export LD_LIBRARY_PATH=/home/people/takahieo/src/relion-1.4/lib:$LD_LIBRARY_PATH&lt;br /&gt;
#export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion-1.4/bin/qsub.csh&amp;quot;&lt;br /&gt;
        #Relion-2.0#&lt;br /&gt;
export PATH=/home/people/takahiro/src/relion2-beta/build/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/home/people/takahieo/src/relion2-beta/build/lib:$LD_LIBRARY_PATH&lt;br /&gt;
&lt;br /&gt;
# Where is qsub template script stored&lt;br /&gt;
export RELION_QSUB_TEMPLATE=&amp;quot;/home/people/takahiro/src/relion2-beta/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default PDF viewer&lt;br /&gt;
export RELION_PDFVIEWER_EXECUTABLE=&amp;quot;evince&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default MOTIONCORR executable&lt;br /&gt;
export RELION_MOTIONCORR_EXECUTABLE=&amp;quot;/home/people/takahiro/src/MotionCor2-10-19-2016&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# For CTFFIND3 this would be&lt;br /&gt;
#export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctf/ctffind3_mp.exe&amp;quot;&lt;br /&gt;
# For Ctffind3_mp&lt;br /&gt;
#export NCPUS=32&lt;br /&gt;
# Default CTFFIND executable, version 4.1.x&lt;br /&gt;
export RELION_CTFFIND_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ctffind-4.1.5/ctffind&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default ResMap executable&lt;br /&gt;
export RELION_RESMAP_EXECUTABLE=&amp;quot;/home/people/takahiro/src/ResMap-1.1.4-linux64&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Enforce cluster jobs to occupy entire nodes with 24 hyperthreads&lt;br /&gt;
export RELION_MINIMUM_DEDICATED=24&lt;br /&gt;
# Do not allow the user to change the enforcement of entire nodes&lt;br /&gt;
export RELION_ALLOW_CHANGE_MINIMUM_DEDICATED=0&lt;br /&gt;
&lt;br /&gt;
# Ask for confirmation if users try to submit local jobs with more than 12 MPI nodes&lt;br /&gt;
export RELION_WARNING_LOCAL_MPI=12&lt;br /&gt;
↑何のためかよくわからないが、Relionのホームページに載っていた&lt;br /&gt;
&lt;br /&gt;
# CUDA for RELION&lt;br /&gt;
export PATH=/usr/local/cuda/bin:$PATH&lt;br /&gt;
export LD_LIBRARY_PATH=/use/local/cuda/lib64:$LD_LIBRARY_PATH&lt;br /&gt;
export CUDA_HOME=&amp;quot;/usr/local/cuda&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:17:04Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* Relion2.0 のインストール */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relionフォルダまでのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctfからダウンロードします。&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&lt;br /&gt;
relionからCTFFIND4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/からダウンロードします。&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
relionからRESMAPが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:16:18Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctfからダウンロードします。&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&lt;br /&gt;
relionからCTFFIND4.1が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
実行ファイルをhttp://resmap.sourceforge.net/からダウンロードします。&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
relionからRESMAPが実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:14:00Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* CTFFIND4.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
実行ファイルをhttp://grigoriefflab.janelia.org/ctfからダウンロードします。&lt;br /&gt;
ダウンロードするものは、&amp;quot;ctffind-4.1.5.tar.gz&amp;quot;です。解答して使います。&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:04:12Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5#.E7.92.B0.E5.A2.83.E8.A8.AD.E5.AE.9A 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:03:02Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5&amp;amp;section=7 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:02:03Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5&amp;amp;section=7 環境設定]を行います。&lt;br /&gt;
http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T09:00:22Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5　7 環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:59:54Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5　環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:58:45Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[[http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5　環境設定]]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:54:21Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[[環境設定]]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===環境設定===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:49:26Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[[環境設定]]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:47:15Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
relionからMotionCor2が実行できるよう、[環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:46:42Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&amp;lt;br&amp;gt;&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&lt;br /&gt;
relionからMotionCor2が実行できるよう、[環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:45:56Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* MotionCor2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
実行ファイルを&lt;br /&gt;
http://msg.ucsf.edu/em/software/motioncor2.html&lt;br /&gt;
からダウンロードします。&lt;br /&gt;
そのまま実行しようとすると、libcufft.so.7.5やlibtiff.so.3がないとエラーが出たので、&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3&lt;br /&gt;
を行います。&lt;br /&gt;
relionからMotionCor2が実行できるよう、[環境設定]を行います。&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:39:20Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* Relion2.0 のインストール */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
Relion2.0のダウンロードとインストールを行います。&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3・・・これをやらないとlibcufft.so.7.5やlibtiff.so.3がないと言われる&lt;br /&gt;
実行をファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:35:08Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* Cuda7.5 のインストール */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm -i cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clean all&lt;br /&gt;
 $ yum install cuda-7-5.x86_64 &lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3・・・これをやらないとlibcufft.so.7.5やlibtiff.so.3がないと言われる&lt;br /&gt;
実行をファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:29:48Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* Open MPI のインストール */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
yumコマンドを使ってインストールをしていきましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm --install cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clearn expire-cache&lt;br /&gt;
 $ yum install cuda-7-5.x86_64&lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3・・・これをやらないとlibcufft.so.7.5やlibtiff.so.3がないと言われる&lt;br /&gt;
実行をファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5</id>
		<title>RELION2のScientificLinux7への導入</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION2%E3%81%AEScientificLinux7%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5"/>
				<updated>2017-03-09T08:24:00Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: ページの作成:「===Open MPI のインストール=== Open MPIをインストールします。&amp;lt;br&amp;gt;  $ yum install openmpi  $ yum install openmpi-devel   ===Cuda7.5 のインストール=...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Open MPI のインストール===&lt;br /&gt;
Open MPIをインストールします。&amp;lt;br&amp;gt;&lt;br /&gt;
 $ yum install openmpi&lt;br /&gt;
 $ yum install openmpi-devel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Cuda7.5 のインストール===&lt;br /&gt;
まず、EPELリポジトリを使えるようにしておくと良いので、EPELレポジトリを使っていない方は、使えるようにしましょう。&lt;br /&gt;
 $ yum install epel-release.noarch&lt;br /&gt;
次に、Cuda7.5のダウンロードとインストールです。&lt;br /&gt;
 $ wget　http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ rpm --install cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm&lt;br /&gt;
 $ yum clearn expire-cache&lt;br /&gt;
 $ yum install cuda-7-5.x86_64&lt;br /&gt;
再起動します。&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Relion2.0 のインストール===&lt;br /&gt;
まず、cmake3コマンドとpatchコマンドを使えるようにしましょう。&lt;br /&gt;
 $ yum install cmake3&lt;br /&gt;
 $ yum install patch&lt;br /&gt;
&lt;br /&gt;
 $ git clone https://github.com/3dem/relion.git&lt;br /&gt;
 $ cd relion&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ cmake3&lt;br /&gt;
 $ make&lt;br /&gt;
エラーが出なければ、無事、インストール完了です。&lt;br /&gt;
最後に環境設定を行います。&lt;br /&gt;
 $ export PATH=/***/relion/build/bin:$PATH&lt;br /&gt;
 $ export LD_LIBRARY_PATH=/***/relion/build//lib:$LD_LIBRARY_PATH&lt;br /&gt;
 $ export RELION_QSUB_TEMPLATE=&amp;quot;/***/relion/build/bin/relion_qsub.csh&amp;quot;&lt;br /&gt;
&amp;quot;***&amp;quot;には、relion-1.4までのパスを書き込んでください。 &lt;br /&gt;
 $relion&lt;br /&gt;
でRelionが起動するはずです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===MotionCor2===&lt;br /&gt;
 $ echo “/usr/local/cuda-7.5/targets/x86_64-linux/lib” &amp;gt; /etc/ld.so.conf.d/cuda.conf&lt;br /&gt;
 $ ldconfig&lt;br /&gt;
 $ yum install campat-libtiff3・・・これをやらないとlibcufft.so.7.5やlibtiff.so.3がないと言われる&lt;br /&gt;
実行をファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CTFFIND4.1===&lt;br /&gt;
	実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RESMAP===&lt;br /&gt;
 $ python --version・・・バージョンを確認。&amp;gt;2.7が必要&lt;br /&gt;
 $ yum install numpy・・・&amp;gt;1.6が必要&lt;br /&gt;
 $ yum install scipy・・・&amp;gt;0.12が必要&lt;br /&gt;
 $ yum install python-matplotlib・・・&amp;gt;1.2が必要&lt;br /&gt;
実行ファイルをダウンロード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===その他===&lt;br /&gt;
	gsコマンド&lt;br /&gt;
	latexコマンド&lt;br /&gt;
	dvipdfコマンド&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION</id>
		<title>RELION</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION"/>
				<updated>2017-03-09T07:54:32Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* RELION2のLinuxへの導入 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''RELOION'''のアルゴリズムに関して、整理したページになります。すこしずつまとめたいと思います。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(\Theta | X, Y) = P(X|\Theta ,Y) P(\Theta |Y)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;: 観測されたデータ&lt;br /&gt;
&amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;: 事前情報&lt;br /&gt;
&amp;lt;math&amp;gt;\Theta&amp;lt;/math&amp;gt;：パラメータセット&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
尤度の定義：&amp;lt;math&amp;gt;(k, \phi, \Theta(n), Y)&amp;lt;/math&amp;gt; が与えられたときの画像&amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;となるときの尤度&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(X_i | k, \phi, \Theta^{(n)})=&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;: i番目の画像 &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt;: n回目 &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;: フーリエ成分j (2次元フーリエ空間：実験画像２Ｄ） &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;: フーリエ成分の数 &amp;lt;math&amp;gt;\sigma^{2}_{i}j^{(n)}&amp;lt;/math&amp;gt;: ノイズの分散（分解能毎で予測される）、データから推定 &amp;lt;math&amp;gt;\rm{CTF}_{ij}&amp;lt;/math&amp;gt;: i番目の画像のフーリエ成分jのCTF（コントラスト伝達関数）の値 &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;: フーリエ成分l(３次元フーリエ空間：３Ｄマップ） &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;: フーリエ成分の数 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;: k番目の３Ｄマップ &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: 回転（３自由度）＋平行移動（２自由）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== [[RELIONのMacへの導入]]====&lt;br /&gt;
====RELION2のLinuxへの導入====&lt;br /&gt;
* [[ハードウェア]]&lt;br /&gt;
* [[RELION2のUbuntuへの導入]]&lt;br /&gt;
* [[RELION2のCentOSへの導入]]&lt;br /&gt;
* [[RELION2のScientificLinux7への導入]]&lt;br /&gt;
&lt;br /&gt;
==== [[RELIONチュートリアル]]====&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89</id>
		<title>ダウンロード</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89"/>
				<updated>2016-05-31T01:39:01Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 簡易インストール (git版：初めて Eosを利用したい方、とにかくEosを画像処理に使ってみたい方) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Eos'''のダウンロード方法について&lt;br /&gt;
&lt;br /&gt;
== 前段階 ==&lt;br /&gt;
&lt;br /&gt;
=== OS-X(Mac)で利用したい方 ===&lt;br /&gt;
OS-Xで動作させたい方は、[[EosOnMac]]で示されたプログラムをインストールしてから、下記の手順でダウンロードしてください。&lt;br /&gt;
&lt;br /&gt;
=== Linuxで利用したい方 ===&lt;br /&gt;
Linux上で動作させたい方は、[[EosOnLinux]]で示されたプログラムをインストールしてから、下記の手順でダウンロードしてください。&lt;br /&gt;
&lt;br /&gt;
== gitが利用できる方 ==&lt;br /&gt;
&lt;br /&gt;
gitがご利用できる方は、SourceForge.jpからのダウンロード([[http://sourceforge.jp/projects/eos/ projects/eos]])が可能です。gitコマンド使い方の詳細は、[[http://sourceforge.jp/magazine/09/03/16/0831212 sourceforge]]をご覧下さい。以下は、簡単にインストールに関連するコマンドをまとめておきます。&lt;br /&gt;
&lt;br /&gt;
=== 簡易インストール (git版：初めて Eosを利用したい方、とにかくEosを画像処理に使ってみたい方) ===&lt;br /&gt;
　初めてEosを利用したい方は、次のコマンドで実行することが出来ます。&lt;br /&gt;
&lt;br /&gt;
==== install-eos.sh のダウンロード====&lt;br /&gt;
インストーラをダウンロードします。 &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;strike&amp;gt;curl -L  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/install-eos.sh?export=raw &amp;gt; /tmp/install-eos.sh&amp;lt;/strike&amp;gt;&lt;br /&gt;
 SourceForgeからではなく、OSDNからのダウンロードに変更して&lt;br /&gt;
 curl -L  https://osdn.jp/projects/eos/scm/git/base/blobs/master/env/install-eos.sh?export=raw &amp;gt; /tmp/install-eos.sh&lt;br /&gt;
 若しくは、&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;strike&amp;gt;wget -q -O -  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/install-eos.sh?export=raw &amp;gt; /tmp/install-eos.sh&amp;lt;/strike&amp;gt;&lt;br /&gt;
 wget -q -O -  https://osdn.jp/projects/eos/scm/git/base/blobs/master/env/install-eos.sh?export=raw &amp;gt; /tmp/install-eos.sh&lt;br /&gt;
&lt;br /&gt;
として、インストールコマンドをダウンロードします。&lt;br /&gt;
&lt;br /&gt;
==== Eos_env のダウンロード====&lt;br /&gt;
 &amp;lt;strike&amp;gt;curl -L  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw &amp;gt; /tmp/Eos_env&amp;lt;/strike&amp;gt;&lt;br /&gt;
 同様に、SourceForgeからではなく、OSDNからのダウンロードに変更して&lt;br /&gt;
 curl -L  https://osdn.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw &amp;gt; /tmp/Eos_env&lt;br /&gt;
 &lt;br /&gt;
 若しくは、&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;strike&amp;gt;wget -q -O -  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw &amp;gt; /tmp/Eos_env&amp;lt;/strike&amp;gt;&lt;br /&gt;
 wget -q -O -  https://osdn.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw &amp;gt; /tmp/Eos_env&lt;br /&gt;
&lt;br /&gt;
として、環境設定ファイルをダウンロードします。&lt;br /&gt;
&lt;br /&gt;
==== Eos本体のダウンロード(インストール） ====&lt;br /&gt;
&lt;br /&gt;
===== インストールコマンドの実行方法 =====&lt;br /&gt;
　上記の二つのファイルがダウンロード出来た後に次のコマンドを実行して下さい。&lt;br /&gt;
&lt;br /&gt;
 $ source /tmp/Eos_env&lt;br /&gt;
 &lt;br /&gt;
 $ source /tmp/install-eos.sh&lt;br /&gt;
          or&lt;br /&gt;
 $ source /tmp/install-eos.sh a_directory_to_be_installed&lt;br /&gt;
          or&lt;br /&gt;
 $ source /tmp/install-eos.sh a_directory_to_be_installed osdn_username&lt;br /&gt;
&lt;br /&gt;
インストールするべきディレクトリ（a_directory_to_be_installed）や、osdn_usernameが指定されている場合には、次からのいくつかのステップがスキップされます。&lt;br /&gt;
&lt;br /&gt;
＊以前に比べて、install-eos.shがバージョンアップしていますので、注意して下さい。&lt;br /&gt;
&lt;br /&gt;
===== インストール先ディレクトリの設定 =====&lt;br /&gt;
&lt;br /&gt;
　次に、インストール先のディレクトリを尋ねられますので、入力して下さい。上記で、インストール先のディレクトリが指定されている場合にはスキップされます。&lt;br /&gt;
そのままEnterキーを押すと、デフォールト（通常は、$HOME/Eos）となっている$HOME/Eosにインストールされます。&lt;br /&gt;
&lt;br /&gt;
 Set the directroy to be installed [/Users/xxxx/Eos]:  /Users/xxxx/EosTest&lt;br /&gt;
&lt;br /&gt;
として、空のディレクトリを指定して下さい。そのままエンターを押すと、現在表示されているディレクトリにインストールされることになります。&lt;br /&gt;
&lt;br /&gt;
＊　空のディレクトリでなく、既にインストールしているディレクトリが設定された場合には、下記のエラーを出して終了します。&lt;br /&gt;
 Already installed&lt;br /&gt;
 Use update-eos.sh for updating or set a new directory for installation&lt;br /&gt;
&lt;br /&gt;
＊　デフォールトディレクトリを予め変更したい場合には、環境変数EOS_HOME0を設定して下さい。&lt;br /&gt;
 $ export EOS_HOME0=/tmp/Eos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== gituserの設定 =====&lt;br /&gt;
　OSDNにユーザーとしてアカウントを持っているかどうかが尋ねられます。&lt;br /&gt;
&lt;br /&gt;
　自分自身でツールを開発するのでなければ、nまたはNを入力して下さい。&lt;br /&gt;
&lt;br /&gt;
 Do you have your git account for OSDN [Y|y or N|n] ? n&lt;br /&gt;
&lt;br /&gt;
　自分自身のツールを開発する場合には、&lt;br /&gt;
&lt;br /&gt;
 Do you have your git account for OSDN [Y|y or N|n] ? y&lt;br /&gt;
 Set the git account for OSDN [xxxxxxx]:xxxxx &lt;br /&gt;
&lt;br /&gt;
として、設定して下さい。&lt;br /&gt;
&lt;br /&gt;
===== 環境変数の設定方法 =====&lt;br /&gt;
&lt;br /&gt;
　環境変数などを設定するEos_envの呼び出しを.bash_profileを組み込むかどうかを選択します。&lt;br /&gt;
&lt;br /&gt;
 Do you want to rewrite /Users/tacyas/.bash_prfile ? [Y|y or N|n] n&lt;br /&gt;
&lt;br /&gt;
こちらを選択した場合には、自分で設定してもらうか、毎回、sourc $EOS_HOME/env/Eos_env を実行することになります。&lt;br /&gt;
&lt;br /&gt;
 Do you want to rewrite /Users/tacyas/.bash_prfile ? [Y|y or N|n] y&lt;br /&gt;
&lt;br /&gt;
こちらの場合には、.bash_profileに書き加えられます。&lt;br /&gt;
下記の範囲に書かれており、書き換えられる可能性があるので注意して下さい。&lt;br /&gt;
 ## Eos_env Start&lt;br /&gt;
 .....&lt;br /&gt;
 ## Eos_env End&lt;br /&gt;
&lt;br /&gt;
===== インストールの開始 =====&lt;br /&gt;
&lt;br /&gt;
　後は、自動的にダウンロードが始まります。&lt;br /&gt;
&lt;br /&gt;
　その後、順調に設定が終了すれば、最後に、&lt;br /&gt;
&lt;br /&gt;
 You finished Eos installation.&lt;br /&gt;
&lt;br /&gt;
が出力されます。&lt;br /&gt;
　&amp;lt;strike&amp;gt;ホームディレクトリの中の.bashrcファイルの中に、シェルの起動時にEos_envを実行するスクリプトが挿入されています。&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
うまくいかない場合には、ダウンロードしてきた/tmp/Eos_env、もしくは、上記で指定したディレクトリ/env/Eos_envを起動時に実行することになります。&lt;br /&gt;
 $ source Eos_env&lt;br /&gt;
にて実行できます。&lt;br /&gt;
&lt;br /&gt;
実行環境によっては、$HOME/.profileの中に書き込む必要がある場合があります。&lt;br /&gt;
&lt;br /&gt;
下記を参考にして下さい。$HOME/Eosとしてインストールされているものとなっています。&lt;br /&gt;
別の場所にインストール場合には、EOS_HOME0のコメントをはずして、設定する必要があります。&lt;br /&gt;
また、OSDN上にユーザーアカウントをもって、共同開発を考えている方は、EOS_GITUSER0を設定する必要があります。&lt;br /&gt;
&lt;br /&gt;
 ## Eos_env Start&lt;br /&gt;
 ##&lt;br /&gt;
 &lt;br /&gt;
 if [ ! -z $EOS_HOME0 ] ; then &lt;br /&gt;
     if [ -f $EOS_HOME0/env/Eos_env -a ! -f $HOME/.Eos_env ] ; then&lt;br /&gt;
         ln -s $EOS_HOME0/env/Eos_env $HOME/.Eos_env&lt;br /&gt;
     fi  &lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 #export EOS_HOME0=Eos&lt;br /&gt;
 #export EOS_GITUSER0=EosUser&lt;br /&gt;
 &lt;br /&gt;
 test -r $HOME/.Eos_env  &amp;amp;&amp;amp; . $HOME/.Eos_env&lt;br /&gt;
 &lt;br /&gt;
 ##&lt;br /&gt;
 ## Eos_env End&lt;br /&gt;
&lt;br /&gt;
==== 実行の確認 ====&lt;br /&gt;
&lt;br /&gt;
 $ mrcInfo -h&lt;br /&gt;
&lt;br /&gt;
が動けばひとまずインストールの完了です。&lt;br /&gt;
&lt;br /&gt;
●注意事項１：いくつかのコマンドは、cuda、X11などの環境がないために動作しない環境があったりします。その場合には、必要なライブラリ等をインストールしたりする必要があります。その詳細は別に述べます。&lt;br /&gt;
&lt;br /&gt;
●注意事項２：この状態で、自分自身のところで開発を行うことはできます。ただし、sourceforge上にアップロードすることはできません。アップロードしたい場合には、originのURLの変更とsourceforge上のアカウントの登録が必要です。また、最新版しかダウンロードしていません。過去の履歴を全てダウンロードしてこないと、gitの仕様上、アップロードしていくことができません。gitのunshallow機能をつかって、全てをダウンロードする必要があります。詳細は別に述べます。&lt;br /&gt;
&lt;br /&gt;
●注意事項３：OS-X(10.11, El Capitan)では、dyldの関係でcudaライブラリ等がロード出来ません。SIPをdisableにする必要が現在あります。このページの下にあるトラブルシューティングを参考にして下さい。&lt;br /&gt;
&lt;br /&gt;
=== gitコマンドを直接使ってインストールしたい方：初めてのディレクトリにインストールする場合 ===&lt;br /&gt;
Eosの複製をgitを使って作製します。&lt;br /&gt;
&lt;br /&gt;
==== Eosの共同開発を考えている場合（SourceForge上にアカウントが必要） ====&lt;br /&gt;
共同開発を考えている方、つまり、編集後、SourceForge上にソースをアップ(push)する事を前提とする場合についてこちらでは説明します。&lt;br /&gt;
&lt;br /&gt;
===== SourceForgeへの登録 =====&lt;br /&gt;
SourceForge上のUsernameとPassword及びpublic_keyをsourceforge上に登録する必要があります。&lt;br /&gt;
&lt;br /&gt;
===== 環境変数の設定 =====&lt;br /&gt;
下記を実行する場合、[https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw Eos_env] をダウンロードしてください。&lt;br /&gt;
これは、下記のダウンロード作業を行った場合には、$EOS_HOME/env/Eos_envとして登録されているものと同じです。&lt;br /&gt;
次に、下記のコマンドを実行してください。インストール先は、$HOME/Eosがデフォールトで設定されています。環境変数：EOS_HOME0 を設定すれば、自分がインストールしたいディレクトリにインストールすることも可能です。&lt;br /&gt;
&lt;br /&gt;
 $ source Eos_env&lt;br /&gt;
&lt;br /&gt;
これにより、各種の環境変数が設定されます。この作業無しで実行する場合には、環境変数がもつ、$EOS_HOMEの替わりにインストールしたいディレクトリを設定する必要があります。&lt;br /&gt;
&lt;br /&gt;
ユーザー名とSourceForge上のUsernameが異なる場合には、環境ファイルもしくは、手動にて、EOS_GITUSERの設定をします。&lt;br /&gt;
&lt;br /&gt;
 export EOS_GITUSER=(SourceForge上のUsername)&lt;br /&gt;
    or&lt;br /&gt;
 export EOS_GITUSER=$USER&lt;br /&gt;
&lt;br /&gt;
===== gitを用いたダウンロードの実行 =====&lt;br /&gt;
&lt;br /&gt;
$EOS_HOMEが既に設定されている場合には次のようにcloneを作成する事が出来ます。&lt;br /&gt;
&lt;br /&gt;
 $ git clone --depth 1 ${EOS_GITUSER}@git.sourceforge.jp:/gitroot/eos/base.git $EOS_HOME&lt;br /&gt;
    or &lt;br /&gt;
 $ git clone --depth 1 https://scm.sourceforge.jp/gitroot/eos/base.git $EOS_HOME&lt;br /&gt;
&lt;br /&gt;
インストールを指定したい場合、指定したいディレクトリを指定する必要があります。ここでは、$HOME/Eosの場合の例を示しています。&lt;br /&gt;
&lt;br /&gt;
 $ git clone --depth 1 ${EOS_GITUSER}@git.sourceforge.jp:/gitroot/eos/base.git $HOME/Eos&lt;br /&gt;
    or &lt;br /&gt;
 $ git clone --depth 1 https://scm.sourceforge.jp/gitroot/eos/base.git $HOME/Eos&lt;br /&gt;
&lt;br /&gt;
その後、それぞれのホストに応じて必要なバイナリやライブラリをダウンロードします。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ make setting&lt;br /&gt;
 $ cd $EOS_HOME/hostdepend&lt;br /&gt;
 $ git clone --depth 1  ${EOS_GITUSER}@git.sourceforge.jp:/gitroot/eos/hostdepend${EOS_HOSTDIR}.git ${EOS_HOSTDIR}&lt;br /&gt;
&lt;br /&gt;
※ EOS_HOSTDIRは、バイナリの存在場所を変更するための環境変数です。Eos_envの中で、自動的に設定されます。&lt;br /&gt;
&lt;br /&gt;
[[CUDA]]のインストールが必要な場合があります。[[EosOnCUDA]]を参考にして下さい。&lt;br /&gt;
&lt;br /&gt;
==== Eosを使いたいだけの場合、もしくは、自分の所だけで開発を行いたい場合（SourceForge上にアカウントが必要ない） ====&lt;br /&gt;
編集しないか、もしくは、編集してもSourceForge上にソースをアップ(push)する事を前提としない場合には次のような作業を行うことになります。簡易インストーラが実行している内容がこれに対応します。&lt;br /&gt;
&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/base.git $EOS_HOME&lt;br /&gt;
    or &lt;br /&gt;
 $ git clone --depth 1 http://scm.sourceforge.jp/gitroot/eos/base.git $EOS_HOME&lt;br /&gt;
&lt;br /&gt;
$EOS_HOMEが設定されていない場合には、直接、ディレクトリを指定して下さい。ただし、そのディレクトリを今後も利用する場合には、$EOS_HOMEとして設定する必要があります。&lt;br /&gt;
&lt;br /&gt;
その後、それぞれのHOST毎に異なるバイナリを落としてきます。&lt;br /&gt;
&lt;br /&gt;
 $ source $EOS_HOME/env/Eos_env&lt;br /&gt;
&lt;br /&gt;
を実行します。次に、&lt;br /&gt;
&lt;br /&gt;
 $ echo ${EOS_HOSTDIR}&lt;br /&gt;
&lt;br /&gt;
が設定されていることを確認して、下記を実行します。SourceForge上にhostdepend${EOS_HOSTDIR}があることが前提です。それ以外のHOSTDIRが必要な方はご連絡ください。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME/hostdepend; git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/hostdepend${EOS_HOSTDIR} .git ${EOS_HOSTDIR} &lt;br /&gt;
    or &lt;br /&gt;
 $ cd $EOS_HOME/hostdepend; git clone --depth 1 http://scm.sourceforge.jp/gitroot/eos/hostdepend${EOS_HOSTDIR} .git ${EOS_HOSTDIR} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
【注意１】sshやhttpsを使ってダウンロードする場合には、開発者として登録が必要です。ssh-keygenを使って作製したpublic_keyをsourceforge上に登録する必要があります。上述を参照してください。&lt;br /&gt;
&lt;br /&gt;
【注意２】gitを使ってダウンロードした場合には、そのままでは、Eos上で新たに開発したものを登録(git-push)することができません。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;【注意３】&amp;lt;/span&amp;gt; 開発者として、SourceForgeに登録した場合には、その後、git remoteコマンドを使って、originを変更してください。&lt;br /&gt;
 &lt;br /&gt;
 git remote -v &lt;br /&gt;
 git remote rm origin&lt;br /&gt;
 git remote add origin  $(EOS_GITUSER)@git.sourceforge.jp:/gitroot/eos/base.git&lt;br /&gt;
 &lt;br /&gt;
 git remote add origin  $(EOS_GITUSER)@git.sourceforge.jp:/gitroot/eos/hostdepend$(EOS_HOSTDIR).git&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;【注意４】&amp;lt;/span&amp;gt; --depth 1は、最新版のみを取得するためのオプションです。つけない場合は、すべての履歴をコピーすることになります。一方で、開発者として、git-pushを行う為には、全ての履歴をコピーしてくる必要があります。ディスクの空きを確認した後、--unshallowを使ってダウンロードしてください。うまくいかない場合には、gitのリポジトリが大きすぎて、キャッシュが作れないことが原因です。その場合には、順に--depthを深くしてください。例えば、次のようなコマンドが利用できます。&lt;br /&gt;
&lt;br /&gt;
 $ for i in `seq 1 100` ; do git clone --depth $i git://git.sourceforge.jp/gitroot/eos/hostdepend${EOS_HOSTDIR} .git ${EOS_HOSTDIR} ; done&lt;br /&gt;
 $ git clone --unshallow git://git.sourceforge.jp/gitroot/eos/hostdepend${EOS_HOSTDIR} .git ${EOS_HOSTDIR}&lt;br /&gt;
&lt;br /&gt;
【注意５】使用するコマンドによっては他のライブラリをリビルドする必要があります。ダウンロード方法は[[#付加的なレポジトリを利用したい場合]]に記載しています。&lt;br /&gt;
&lt;br /&gt;
==== 付加的なレポジトリを利用したい場合 ====&lt;br /&gt;
チュートリアルで利用するデータやMakefileが置かれています。&lt;br /&gt;
いずれも、$EOS_HOMEのディレクトリで実施して下さい。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/tutorial.git&lt;br /&gt;
&lt;br /&gt;
テスト用のデータファイルなどが置かれています。&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/data.git&lt;br /&gt;
&lt;br /&gt;
Eosのマニュアルなどが置かれています。&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/optional.git&lt;br /&gt;
&lt;br /&gt;
Eosで利用される他の開発コードが置かれています。コマンドや環境によっては動作するのに必要な場合もあります。&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/others.git&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 全てのデータを一括でダウンロードしたい場合(makeコマンドを使用) ====&lt;br /&gt;
まず、[https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/Makefile?export=raw 最新のMakefile]と[https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw 最新のEos_env]をダウンロードして、Eos_envのファイルを開き、EOS_HOMEにダウンロードディレクトリを設定します。（ディレクトリは空にして下さい。）さらに、EOS_GITUSERにsourceforgeのアカウントを設定します。お持ちでない場合は空にして下さい。（この場合はpushができませんので、ご注意ください。）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定後に下記のコマンドを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ source Eos_env		# Eos_envがあるディレクトリで実行&lt;br /&gt;
$ make git-clone-all		# Makefileがあるディレクトリで実行&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ダウンロード完了後のMakefile、env/Eos_envは$EOS_HOME内のものを使用しますので、EOS_HOMEやEOS_GITUSERの内容を同じように変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 簡易版アップデート（簡単に最新版に更新したい方） ===&lt;br /&gt;
&lt;br /&gt;
簡易アップデートのためのコマンドupdate-eos.shを利用してアップデートを行うことができます。&lt;br /&gt;
もちろん新しいディレクトリにインストールすることでも対応できます。&lt;br /&gt;
&lt;br /&gt;
==== update-eos.sh のダウンロード====&lt;br /&gt;
&lt;br /&gt;
Eos/env/のディレクトリの中に、update-eos.shのファイルが見当たらないバージョンをお持ちの方は、下記の方法で&lt;br /&gt;
ダウンロードしてください。&lt;br /&gt;
&lt;br /&gt;
 curl -L  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/update-eos.sh?export=raw &amp;gt; /tmp/update-eos.sh&lt;br /&gt;
 -&lt;br /&gt;
 若しくは、&lt;br /&gt;
 &lt;br /&gt;
 wget -q -O -  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/update-eos.sh?export=raw &amp;gt; /tmp/update-eos.sh&lt;br /&gt;
&lt;br /&gt;
として、アップデートコマンドをダウンロードします。&lt;br /&gt;
&lt;br /&gt;
==== アップデートコマンドの実行 ====&lt;br /&gt;
&lt;br /&gt;
DSDN上にアカウントを持っていない方は、 &lt;br /&gt;
&lt;br /&gt;
 $ EOS_GITUSER0= source /tmp/update-eos.sh&lt;br /&gt;
   or&lt;br /&gt;
 $ EOS_GITUSER0= source $EOS_HOME/env/update-eos.sh&lt;br /&gt;
&lt;br /&gt;
によりアップデートコマンドが動作します。アカウントが存在する方は、下記のuserを自身のアカウントに置き換えていただき&lt;br /&gt;
&lt;br /&gt;
 $ EOS_GITUSER0=user source /tmp/update-eos.sh&lt;br /&gt;
 もしくは、&lt;br /&gt;
 $ EOS_GITUSER0=user source $EOS_HOME/env/update-eos.sh&lt;br /&gt;
 もしくは、&lt;br /&gt;
 $ cd $EOS_HOME; EOG_GITUSER=user make git-fetch; EOG_GITUSER=user make git-merge&lt;br /&gt;
&lt;br /&gt;
としてアップデートを行ってください。複数のDirectoryを利用している方はそのディレクトリを引数で設定すると容易にアップデート出来ます。&lt;br /&gt;
&lt;br /&gt;
 $ EOS_GITUSER0= source $EOS_HOME/env/update-eos.sh           directory&lt;br /&gt;
   or &lt;br /&gt;
 $ EOS_GITUSER0=user source $EOS_HOME/env/update-eos.sh    directory&lt;br /&gt;
&lt;br /&gt;
=== 最新版に更新する場合(既に、ローカルにgitを用いてダウンロードしているものがある場合) ===&lt;br /&gt;
Eosの最新にアップデートすることができます。&lt;br /&gt;
&lt;br /&gt;
==== makeを用いた更新 ====&lt;br /&gt;
$EOS_HOME/Makefileが最新のものになっていれば、上記のことを下記のMakefileにて実行できます。&amp;lt;br&amp;gt;&lt;br /&gt;
※ $EOS_HOMEは、例えば、$HOME/Eosディレクトリを指しています。&amp;lt;br&amp;gt;&lt;br /&gt;
　環境ファイルをそのまま使用する場合は、baseディレクトリを$HOMEに置き、Eosとリネームして下さい。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ make git-fetch&lt;br /&gt;
 $ make git-merge&lt;br /&gt;
&lt;br /&gt;
==== 最新版の取得 ====&lt;br /&gt;
 $ git fetch            ;# 変更があったファイルをダウンロード&lt;br /&gt;
    or&lt;br /&gt;
 $ git fetch ssh://${EOS_GITUSER}@git.sourceforge.jp:/gitroot/eos/base.git&lt;br /&gt;
    or&lt;br /&gt;
 $ git fetch git://git.sourceforge.jp/gitroot/eos/base.git&lt;br /&gt;
&lt;br /&gt;
===== 最新版の取得（別法） =====&lt;br /&gt;
git pullは、fetch/merge等が自動的に実行されます。自分自身がソースコードを変更していない場合には一度に実施することができます。分かっている場合にのみ、使いましょう。疑問が少しでもある場合には、fetch/mergeを順に行うことをお薦めします。&lt;br /&gt;
&lt;br /&gt;
 $ git pull git://git.sourceforge.jp/gitroot/eos/base.git&lt;br /&gt;
&lt;br /&gt;
==== 変更になっている部分の確認 ====&lt;br /&gt;
 $ git log   FETCH_HEAD ;# 変更になっている部分を表示&lt;br /&gt;
&lt;br /&gt;
==== 変更を追加 ====&lt;br /&gt;
変更になっている部分を確認した後、自分自身が変更したものとマージしても問題がなければ、変更を追加します。自分自身も変更している場合には注意が必要です。&lt;br /&gt;
&lt;br /&gt;
 $ git merge FETCH_HEAD ;# 変更になっているものをマージする&lt;br /&gt;
&lt;br /&gt;
=== Eosの機能追加、修正を登録する場合(make) ===&lt;br /&gt;
&lt;br /&gt;
Eosそのものの機能(Eosが提供しているMakefile)を使ってインストールすることができます。この場合、基本的にmaster レポジトリに登録することになります。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME               ; # Eosのディレクトリに移動します。&lt;br /&gt;
 $ make git-add                 ; # 変更や加えられたファイルをレポジトリに一時的に格納します&lt;br /&gt;
 $ make git-commit           ; # 変更点等のコメント毎、レポジトリに格納します&lt;br /&gt;
&lt;br /&gt;
タグを変更したいとき&amp;lt;br&amp;gt;&lt;br /&gt;
※ 現在、ソースコードをアップロード毎にバージョン名によるタグで管理しています。[[Eosの開発]]のルールに従って、アップロード前にタグを付けるよう、ご協力をお願いします。&lt;br /&gt;
&lt;br /&gt;
 $ git tag&lt;br /&gt;
 $ git tag newtag&lt;br /&gt;
&lt;br /&gt;
アップロードします&lt;br /&gt;
&lt;br /&gt;
 $ make git-push              ; # SourceForge上にアップします&lt;br /&gt;
&lt;br /&gt;
=== Eosの機能追加、修正を登録する場合(git) ===&lt;br /&gt;
&lt;br /&gt;
自分自身が機能追加、修正をかけ、登録する場合の例を下記に挙げておきます。&lt;br /&gt;
 git add         ; # 自分自身の複製で変更したものを加える&lt;br /&gt;
 git commit      ; # 変更したモノをgitに格納する&lt;br /&gt;
 #&lt;br /&gt;
 git push        ; # git serverに格納&lt;br /&gt;
  or&lt;br /&gt;
 git push origin master&lt;br /&gt;
  or&lt;br /&gt;
 git push origin master&lt;br /&gt;
&lt;br /&gt;
master以外のレポジトリを利用したい場合は、masterではなく、別のレポジトリを準備することになります。&lt;br /&gt;
&lt;br /&gt;
※ gitコマンド使い方の詳細は、[[http://sourceforge.jp/magazine/09/03/16/0831212 sourceforge]]もしくは、gitの解説書をご覧下さい。&lt;br /&gt;
&lt;br /&gt;
== 直接ダウンロードしたい方、開発環境は必要なく、実行だけを行いたい方 ==&lt;br /&gt;
下記のサイトから、バイナリtarballをダウンロードが可能です。&lt;br /&gt;
&lt;br /&gt;
 [[http://www.yasunaga-lab.bio.kyutech.ac.jp/ja/reserach/eos/eos-download-sites/ EosHomePage]]&lt;br /&gt;
     or&lt;br /&gt;
 [[http://sourceforge.jp/projects/eos/releases/ Sourceforge]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
上記にアップされていないバイナリ形式に興味がある方は安永(yasunaga@bio.kyutech.ac.jp)までご連絡下さい。&lt;br /&gt;
&lt;br /&gt;
作成されたディレクトリの構成（[[Eosの構造]]）は別ページにて説明しています。&lt;br /&gt;
&lt;br /&gt;
※　2013/02より、大幅にディレクトリの構成が変更になっています。ご注意下さい。目的は、ホスト依存のバイナリコードと非依存なソースコードを切り離すことが目的です。ヘテロな環境での実行を維持しながら、NFSなどでexportされた一つのディレクトリで実行するために変更しました。&lt;br /&gt;
&lt;br /&gt;
== 動作環境 ==&lt;br /&gt;
&lt;br /&gt;
　現在、手元に環境があり、動作することが確認出来ているのは、下記のものです。&lt;br /&gt;
&lt;br /&gt;
 LINUX 32bits/64bits&lt;br /&gt;
 OS-X  32bits/64bits&lt;br /&gt;
 Windows with Cygwin&lt;br /&gt;
&lt;br /&gt;
== うまく動作しない場合 ==&lt;br /&gt;
&lt;br /&gt;
=== コンパイルされていない場合 ===&lt;br /&gt;
Q1)　使いたいツールを実行しようとすると Not Installed: XXXXX-version YYYYYY　といわれる&lt;br /&gt;
&lt;br /&gt;
A1)　設定された環境でコンパイル・リンクがなされていません。src/Tools以下のディレクトリにあるCLASS/YYYYYY　のディレクトリに移動し、make check; make depend; make install　とうってみましょう。&lt;br /&gt;
&lt;br /&gt;
=== Xcodeのインストールが不十分な場合 ===&lt;br /&gt;
&lt;br /&gt;
Q2 ) OS-Xでmakeを利用しようとすると下記のようなエラーコードがでる&lt;br /&gt;
&lt;br /&gt;
 sh: line 1:  8482 Trace/BPT trap: 5       /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk '' -find make 2&amp;gt; /dev/null&lt;br /&gt;
 make: error: unable to find utility &amp;quot;make&amp;quot;, not a developer tool or in PATH&lt;br /&gt;
&lt;br /&gt;
A2)　いずれかのダイナミックライブラリがうまくインストールされていない場合にこのようなエラーが出ます。&lt;br /&gt;
&lt;br /&gt;
直接、下記のコマンドを実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk '' -find make&lt;br /&gt;
&lt;br /&gt;
足りないライブラリに関してエラーを出力しています。多くの場合、ダイナミックライブラリのパスの設定の問題です。&lt;br /&gt;
&lt;br /&gt;
 sudo cp /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Resources/libTIFF.dylib $EOS_HOME//util/X86MAC64/lib/&lt;br /&gt;
&lt;br /&gt;
として、必要とされるライブラリを$EOS_HOME//util/X86MAC64/lib/コピーしてみて下さい。&lt;br /&gt;
&lt;br /&gt;
=== gitのメモリが足りないとき ===&lt;br /&gt;
Q3)  git cloneをかけようとすると、&lt;br /&gt;
 remote: aborting due to possible repository corruption on the remote side.&lt;br /&gt;
 fatal: early EOF&lt;br /&gt;
 fatal: index-pack failed&lt;br /&gt;
として停止してしまう。&lt;br /&gt;
&lt;br /&gt;
A3) これは、Eosのパッケージが大きすぎて、gitがindexを取得できないために生じます。&lt;br /&gt;
&lt;br /&gt;
=== LD_LIBRARY_PATH に問題がある場合 ===&lt;br /&gt;
Q. El Captan (10.11)でcudaに関して、下記の様な dyldのエラーが生じる&lt;br /&gt;
&lt;br /&gt;
 $ mrcInfo -h &lt;br /&gt;
 dyld: Library not loaded: @rpath/libcudart.6.5.dylib&lt;br /&gt;
   Referenced from: /Users/tacyas/Eos/bin/X86MAC64/mrcInfo&lt;br /&gt;
   Reason: image not found&lt;br /&gt;
 /Users/tacyas/Eos/bin/mrcInfo: line 110:   424 Trace/BPT trap: 5       ${EOS_HOME}/bin/${OSTYPE}/${BASENAME} &amp;quot;$@&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A. csrutilコマンドを使う必要があります。&lt;br /&gt;
&lt;br /&gt;
*リカバリーモードで立ち上げます。&lt;br /&gt;
*command + R を押しながら、電源をいれます。&lt;br /&gt;
*ユーティリティからターミナルを立ち上げます。&lt;br /&gt;
*下記のコマンドを実行します。&lt;br /&gt;
 &lt;br /&gt;
 $ csrutil diable&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
これで利用できるはずです。今後問題を解決したいと思います。&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89</id>
		<title>ダウンロード</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89"/>
				<updated>2016-05-31T01:28:32Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* install-eos.sh のダウンロード */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Eos'''のダウンロード方法について&lt;br /&gt;
&lt;br /&gt;
== 前段階 ==&lt;br /&gt;
&lt;br /&gt;
=== OS-X(Mac)で利用したい方 ===&lt;br /&gt;
OS-Xで動作させたい方は、[[EosOnMac]]で示されたプログラムをインストールしてから、下記の手順でダウンロードしてください。&lt;br /&gt;
&lt;br /&gt;
=== Linuxで利用したい方 ===&lt;br /&gt;
Linux上で動作させたい方は、[[EosOnLinux]]で示されたプログラムをインストールしてから、下記の手順でダウンロードしてください。&lt;br /&gt;
&lt;br /&gt;
== gitが利用できる方 ==&lt;br /&gt;
&lt;br /&gt;
gitがご利用できる方は、SourceForge.jpからのダウンロード([[http://sourceforge.jp/projects/eos/ projects/eos]])が可能です。gitコマンド使い方の詳細は、[[http://sourceforge.jp/magazine/09/03/16/0831212 sourceforge]]をご覧下さい。以下は、簡単にインストールに関連するコマンドをまとめておきます。&lt;br /&gt;
&lt;br /&gt;
=== 簡易インストール (git版：初めて Eosを利用したい方、とにかくEosを画像処理に使ってみたい方) ===&lt;br /&gt;
　初めてEosを利用したい方は、次のコマンドで実行することが出来ます。&lt;br /&gt;
&lt;br /&gt;
==== install-eos.sh のダウンロード====&lt;br /&gt;
インストーラをダウンロードします。 &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;strike&amp;gt;curl -L  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/install-eos.sh?export=raw &amp;gt; /tmp/install-eos.sh&amp;lt;/strike&amp;gt;&lt;br /&gt;
 SourceForgeからではなく、OSDNからのダウンロードに変更して&lt;br /&gt;
 curl -L  https://osdn.jp/projects/eos/scm/git/base/blobs/master/env/install-eos.sh?export=raw &amp;gt; /tmp/install-eos.sh&lt;br /&gt;
 若しくは、&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;strike&amp;gt;wget -q -O -  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/install-eos.sh?export=raw &amp;gt; /tmp/install-eos.sh&amp;lt;/strike&amp;gt;&lt;br /&gt;
 wget -q -O -  https://osdn.jp/projects/eos/scm/git/base/blobs/master/env/install-eos.sh?export=raw &amp;gt; /tmp/install-eos.sh&lt;br /&gt;
&lt;br /&gt;
として、インストールコマンドをダウンロードします。&lt;br /&gt;
&lt;br /&gt;
==== Eos_env のダウンロード====&lt;br /&gt;
 curl -L  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw &amp;gt; /tmp/Eos_env&lt;br /&gt;
 &lt;br /&gt;
 若しくは、&lt;br /&gt;
 &lt;br /&gt;
 wget -q -O -  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw &amp;gt; /tmp/Eos_env&lt;br /&gt;
&lt;br /&gt;
として、環境設定ファイルをダウンロードします。&lt;br /&gt;
&lt;br /&gt;
==== Eos本体のダウンロード(インストール） ====&lt;br /&gt;
&lt;br /&gt;
===== インストールコマンドの実行方法 =====&lt;br /&gt;
　上記の二つのファイルがダウンロード出来た後に次のコマンドを実行して下さい。&lt;br /&gt;
&lt;br /&gt;
 $ source /tmp/Eos_env&lt;br /&gt;
 &lt;br /&gt;
 $ source /tmp/install-eos.sh&lt;br /&gt;
          or&lt;br /&gt;
 $ source /tmp/install-eos.sh a_directory_to_be_installed&lt;br /&gt;
          or&lt;br /&gt;
 $ source /tmp/install-eos.sh a_directory_to_be_installed osdn_username&lt;br /&gt;
&lt;br /&gt;
インストールするべきディレクトリ（a_directory_to_be_installed）や、osdn_usernameが指定されている場合には、次からのいくつかのステップがスキップされます。&lt;br /&gt;
&lt;br /&gt;
＊以前に比べて、install-eos.shがバージョンアップしていますので、注意して下さい。&lt;br /&gt;
&lt;br /&gt;
===== インストール先ディレクトリの設定 =====&lt;br /&gt;
&lt;br /&gt;
　次に、インストール先のディレクトリを尋ねられますので、入力して下さい。上記で、インストール先のディレクトリが指定されている場合にはスキップされます。&lt;br /&gt;
そのままEnterキーを押すと、デフォールト（通常は、$HOME/Eos）となっている$HOME/Eosにインストールされます。&lt;br /&gt;
&lt;br /&gt;
 Set the directroy to be installed [/Users/xxxx/Eos]:  /Users/xxxx/EosTest&lt;br /&gt;
&lt;br /&gt;
として、空のディレクトリを指定して下さい。そのままエンターを押すと、現在表示されているディレクトリにインストールされることになります。&lt;br /&gt;
&lt;br /&gt;
＊　空のディレクトリでなく、既にインストールしているディレクトリが設定された場合には、下記のエラーを出して終了します。&lt;br /&gt;
 Already installed&lt;br /&gt;
 Use update-eos.sh for updating or set a new directory for installation&lt;br /&gt;
&lt;br /&gt;
＊　デフォールトディレクトリを予め変更したい場合には、環境変数EOS_HOME0を設定して下さい。&lt;br /&gt;
 $ export EOS_HOME0=/tmp/Eos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== gituserの設定 =====&lt;br /&gt;
　OSDNにユーザーとしてアカウントを持っているかどうかが尋ねられます。&lt;br /&gt;
&lt;br /&gt;
　自分自身でツールを開発するのでなければ、nまたはNを入力して下さい。&lt;br /&gt;
&lt;br /&gt;
 Do you have your git account for OSDN [Y|y or N|n] ? n&lt;br /&gt;
&lt;br /&gt;
　自分自身のツールを開発する場合には、&lt;br /&gt;
&lt;br /&gt;
 Do you have your git account for OSDN [Y|y or N|n] ? y&lt;br /&gt;
 Set the git account for OSDN [xxxxxxx]:xxxxx &lt;br /&gt;
&lt;br /&gt;
として、設定して下さい。&lt;br /&gt;
&lt;br /&gt;
===== 環境変数の設定方法 =====&lt;br /&gt;
&lt;br /&gt;
　環境変数などを設定するEos_envの呼び出しを.bash_profileを組み込むかどうかを選択します。&lt;br /&gt;
&lt;br /&gt;
 Do you want to rewrite /Users/tacyas/.bash_prfile ? [Y|y or N|n] n&lt;br /&gt;
&lt;br /&gt;
こちらを選択した場合には、自分で設定してもらうか、毎回、sourc $EOS_HOME/env/Eos_env を実行することになります。&lt;br /&gt;
&lt;br /&gt;
 Do you want to rewrite /Users/tacyas/.bash_prfile ? [Y|y or N|n] y&lt;br /&gt;
&lt;br /&gt;
こちらの場合には、.bash_profileに書き加えられます。&lt;br /&gt;
下記の範囲に書かれており、書き換えられる可能性があるので注意して下さい。&lt;br /&gt;
 ## Eos_env Start&lt;br /&gt;
 .....&lt;br /&gt;
 ## Eos_env End&lt;br /&gt;
&lt;br /&gt;
===== インストールの開始 =====&lt;br /&gt;
&lt;br /&gt;
　後は、自動的にダウンロードが始まります。&lt;br /&gt;
&lt;br /&gt;
　その後、順調に設定が終了すれば、最後に、&lt;br /&gt;
&lt;br /&gt;
 You finished Eos installation.&lt;br /&gt;
&lt;br /&gt;
が出力されます。&lt;br /&gt;
　&amp;lt;strike&amp;gt;ホームディレクトリの中の.bashrcファイルの中に、シェルの起動時にEos_envを実行するスクリプトが挿入されています。&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
うまくいかない場合には、ダウンロードしてきた/tmp/Eos_env、もしくは、上記で指定したディレクトリ/env/Eos_envを起動時に実行することになります。&lt;br /&gt;
 $ source Eos_env&lt;br /&gt;
にて実行できます。&lt;br /&gt;
&lt;br /&gt;
実行環境によっては、$HOME/.profileの中に書き込む必要がある場合があります。&lt;br /&gt;
&lt;br /&gt;
下記を参考にして下さい。$HOME/Eosとしてインストールされているものとなっています。&lt;br /&gt;
別の場所にインストール場合には、EOS_HOME0のコメントをはずして、設定する必要があります。&lt;br /&gt;
また、OSDN上にユーザーアカウントをもって、共同開発を考えている方は、EOS_GITUSER0を設定する必要があります。&lt;br /&gt;
&lt;br /&gt;
 ## Eos_env Start&lt;br /&gt;
 ##&lt;br /&gt;
 &lt;br /&gt;
 if [ ! -z $EOS_HOME0 ] ; then &lt;br /&gt;
     if [ -f $EOS_HOME0/env/Eos_env -a ! -f $HOME/.Eos_env ] ; then&lt;br /&gt;
         ln -s $EOS_HOME0/env/Eos_env $HOME/.Eos_env&lt;br /&gt;
     fi  &lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 #export EOS_HOME0=Eos&lt;br /&gt;
 #export EOS_GITUSER0=EosUser&lt;br /&gt;
 &lt;br /&gt;
 test -r $HOME/.Eos_env  &amp;amp;&amp;amp; . $HOME/.Eos_env&lt;br /&gt;
 &lt;br /&gt;
 ##&lt;br /&gt;
 ## Eos_env End&lt;br /&gt;
&lt;br /&gt;
==== 実行の確認 ====&lt;br /&gt;
&lt;br /&gt;
 $ mrcInfo -h&lt;br /&gt;
&lt;br /&gt;
が動けばひとまずインストールの完了です。&lt;br /&gt;
&lt;br /&gt;
●注意事項１：いくつかのコマンドは、cuda、X11などの環境がないために動作しない環境があったりします。その場合には、必要なライブラリ等をインストールしたりする必要があります。その詳細は別に述べます。&lt;br /&gt;
&lt;br /&gt;
●注意事項２：この状態で、自分自身のところで開発を行うことはできます。ただし、sourceforge上にアップロードすることはできません。アップロードしたい場合には、originのURLの変更とsourceforge上のアカウントの登録が必要です。また、最新版しかダウンロードしていません。過去の履歴を全てダウンロードしてこないと、gitの仕様上、アップロードしていくことができません。gitのunshallow機能をつかって、全てをダウンロードする必要があります。詳細は別に述べます。&lt;br /&gt;
&lt;br /&gt;
●注意事項３：OS-X(10.11, El Capitan)では、dyldの関係でcudaライブラリ等がロード出来ません。SIPをdisableにする必要が現在あります。このページの下にあるトラブルシューティングを参考にして下さい。&lt;br /&gt;
&lt;br /&gt;
=== gitコマンドを直接使ってインストールしたい方：初めてのディレクトリにインストールする場合 ===&lt;br /&gt;
Eosの複製をgitを使って作製します。&lt;br /&gt;
&lt;br /&gt;
==== Eosの共同開発を考えている場合（SourceForge上にアカウントが必要） ====&lt;br /&gt;
共同開発を考えている方、つまり、編集後、SourceForge上にソースをアップ(push)する事を前提とする場合についてこちらでは説明します。&lt;br /&gt;
&lt;br /&gt;
===== SourceForgeへの登録 =====&lt;br /&gt;
SourceForge上のUsernameとPassword及びpublic_keyをsourceforge上に登録する必要があります。&lt;br /&gt;
&lt;br /&gt;
===== 環境変数の設定 =====&lt;br /&gt;
下記を実行する場合、[https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw Eos_env] をダウンロードしてください。&lt;br /&gt;
これは、下記のダウンロード作業を行った場合には、$EOS_HOME/env/Eos_envとして登録されているものと同じです。&lt;br /&gt;
次に、下記のコマンドを実行してください。インストール先は、$HOME/Eosがデフォールトで設定されています。環境変数：EOS_HOME0 を設定すれば、自分がインストールしたいディレクトリにインストールすることも可能です。&lt;br /&gt;
&lt;br /&gt;
 $ source Eos_env&lt;br /&gt;
&lt;br /&gt;
これにより、各種の環境変数が設定されます。この作業無しで実行する場合には、環境変数がもつ、$EOS_HOMEの替わりにインストールしたいディレクトリを設定する必要があります。&lt;br /&gt;
&lt;br /&gt;
ユーザー名とSourceForge上のUsernameが異なる場合には、環境ファイルもしくは、手動にて、EOS_GITUSERの設定をします。&lt;br /&gt;
&lt;br /&gt;
 export EOS_GITUSER=(SourceForge上のUsername)&lt;br /&gt;
    or&lt;br /&gt;
 export EOS_GITUSER=$USER&lt;br /&gt;
&lt;br /&gt;
===== gitを用いたダウンロードの実行 =====&lt;br /&gt;
&lt;br /&gt;
$EOS_HOMEが既に設定されている場合には次のようにcloneを作成する事が出来ます。&lt;br /&gt;
&lt;br /&gt;
 $ git clone --depth 1 ${EOS_GITUSER}@git.sourceforge.jp:/gitroot/eos/base.git $EOS_HOME&lt;br /&gt;
    or &lt;br /&gt;
 $ git clone --depth 1 https://scm.sourceforge.jp/gitroot/eos/base.git $EOS_HOME&lt;br /&gt;
&lt;br /&gt;
インストールを指定したい場合、指定したいディレクトリを指定する必要があります。ここでは、$HOME/Eosの場合の例を示しています。&lt;br /&gt;
&lt;br /&gt;
 $ git clone --depth 1 ${EOS_GITUSER}@git.sourceforge.jp:/gitroot/eos/base.git $HOME/Eos&lt;br /&gt;
    or &lt;br /&gt;
 $ git clone --depth 1 https://scm.sourceforge.jp/gitroot/eos/base.git $HOME/Eos&lt;br /&gt;
&lt;br /&gt;
その後、それぞれのホストに応じて必要なバイナリやライブラリをダウンロードします。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ make setting&lt;br /&gt;
 $ cd $EOS_HOME/hostdepend&lt;br /&gt;
 $ git clone --depth 1  ${EOS_GITUSER}@git.sourceforge.jp:/gitroot/eos/hostdepend${EOS_HOSTDIR}.git ${EOS_HOSTDIR}&lt;br /&gt;
&lt;br /&gt;
※ EOS_HOSTDIRは、バイナリの存在場所を変更するための環境変数です。Eos_envの中で、自動的に設定されます。&lt;br /&gt;
&lt;br /&gt;
[[CUDA]]のインストールが必要な場合があります。[[EosOnCUDA]]を参考にして下さい。&lt;br /&gt;
&lt;br /&gt;
==== Eosを使いたいだけの場合、もしくは、自分の所だけで開発を行いたい場合（SourceForge上にアカウントが必要ない） ====&lt;br /&gt;
編集しないか、もしくは、編集してもSourceForge上にソースをアップ(push)する事を前提としない場合には次のような作業を行うことになります。簡易インストーラが実行している内容がこれに対応します。&lt;br /&gt;
&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/base.git $EOS_HOME&lt;br /&gt;
    or &lt;br /&gt;
 $ git clone --depth 1 http://scm.sourceforge.jp/gitroot/eos/base.git $EOS_HOME&lt;br /&gt;
&lt;br /&gt;
$EOS_HOMEが設定されていない場合には、直接、ディレクトリを指定して下さい。ただし、そのディレクトリを今後も利用する場合には、$EOS_HOMEとして設定する必要があります。&lt;br /&gt;
&lt;br /&gt;
その後、それぞれのHOST毎に異なるバイナリを落としてきます。&lt;br /&gt;
&lt;br /&gt;
 $ source $EOS_HOME/env/Eos_env&lt;br /&gt;
&lt;br /&gt;
を実行します。次に、&lt;br /&gt;
&lt;br /&gt;
 $ echo ${EOS_HOSTDIR}&lt;br /&gt;
&lt;br /&gt;
が設定されていることを確認して、下記を実行します。SourceForge上にhostdepend${EOS_HOSTDIR}があることが前提です。それ以外のHOSTDIRが必要な方はご連絡ください。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME/hostdepend; git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/hostdepend${EOS_HOSTDIR} .git ${EOS_HOSTDIR} &lt;br /&gt;
    or &lt;br /&gt;
 $ cd $EOS_HOME/hostdepend; git clone --depth 1 http://scm.sourceforge.jp/gitroot/eos/hostdepend${EOS_HOSTDIR} .git ${EOS_HOSTDIR} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
【注意１】sshやhttpsを使ってダウンロードする場合には、開発者として登録が必要です。ssh-keygenを使って作製したpublic_keyをsourceforge上に登録する必要があります。上述を参照してください。&lt;br /&gt;
&lt;br /&gt;
【注意２】gitを使ってダウンロードした場合には、そのままでは、Eos上で新たに開発したものを登録(git-push)することができません。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;【注意３】&amp;lt;/span&amp;gt; 開発者として、SourceForgeに登録した場合には、その後、git remoteコマンドを使って、originを変更してください。&lt;br /&gt;
 &lt;br /&gt;
 git remote -v &lt;br /&gt;
 git remote rm origin&lt;br /&gt;
 git remote add origin  $(EOS_GITUSER)@git.sourceforge.jp:/gitroot/eos/base.git&lt;br /&gt;
 &lt;br /&gt;
 git remote add origin  $(EOS_GITUSER)@git.sourceforge.jp:/gitroot/eos/hostdepend$(EOS_HOSTDIR).git&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;【注意４】&amp;lt;/span&amp;gt; --depth 1は、最新版のみを取得するためのオプションです。つけない場合は、すべての履歴をコピーすることになります。一方で、開発者として、git-pushを行う為には、全ての履歴をコピーしてくる必要があります。ディスクの空きを確認した後、--unshallowを使ってダウンロードしてください。うまくいかない場合には、gitのリポジトリが大きすぎて、キャッシュが作れないことが原因です。その場合には、順に--depthを深くしてください。例えば、次のようなコマンドが利用できます。&lt;br /&gt;
&lt;br /&gt;
 $ for i in `seq 1 100` ; do git clone --depth $i git://git.sourceforge.jp/gitroot/eos/hostdepend${EOS_HOSTDIR} .git ${EOS_HOSTDIR} ; done&lt;br /&gt;
 $ git clone --unshallow git://git.sourceforge.jp/gitroot/eos/hostdepend${EOS_HOSTDIR} .git ${EOS_HOSTDIR}&lt;br /&gt;
&lt;br /&gt;
【注意５】使用するコマンドによっては他のライブラリをリビルドする必要があります。ダウンロード方法は[[#付加的なレポジトリを利用したい場合]]に記載しています。&lt;br /&gt;
&lt;br /&gt;
==== 付加的なレポジトリを利用したい場合 ====&lt;br /&gt;
チュートリアルで利用するデータやMakefileが置かれています。&lt;br /&gt;
いずれも、$EOS_HOMEのディレクトリで実施して下さい。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/tutorial.git&lt;br /&gt;
&lt;br /&gt;
テスト用のデータファイルなどが置かれています。&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/data.git&lt;br /&gt;
&lt;br /&gt;
Eosのマニュアルなどが置かれています。&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/optional.git&lt;br /&gt;
&lt;br /&gt;
Eosで利用される他の開発コードが置かれています。コマンドや環境によっては動作するのに必要な場合もあります。&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ git clone --depth 1 git://git.sourceforge.jp/gitroot/eos/others.git&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 全てのデータを一括でダウンロードしたい場合(makeコマンドを使用) ====&lt;br /&gt;
まず、[https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/Makefile?export=raw 最新のMakefile]と[https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/Eos_env?export=raw 最新のEos_env]をダウンロードして、Eos_envのファイルを開き、EOS_HOMEにダウンロードディレクトリを設定します。（ディレクトリは空にして下さい。）さらに、EOS_GITUSERにsourceforgeのアカウントを設定します。お持ちでない場合は空にして下さい。（この場合はpushができませんので、ご注意ください。）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定後に下記のコマンドを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ source Eos_env		# Eos_envがあるディレクトリで実行&lt;br /&gt;
$ make git-clone-all		# Makefileがあるディレクトリで実行&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ダウンロード完了後のMakefile、env/Eos_envは$EOS_HOME内のものを使用しますので、EOS_HOMEやEOS_GITUSERの内容を同じように変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 簡易版アップデート（簡単に最新版に更新したい方） ===&lt;br /&gt;
&lt;br /&gt;
簡易アップデートのためのコマンドupdate-eos.shを利用してアップデートを行うことができます。&lt;br /&gt;
もちろん新しいディレクトリにインストールすることでも対応できます。&lt;br /&gt;
&lt;br /&gt;
==== update-eos.sh のダウンロード====&lt;br /&gt;
&lt;br /&gt;
Eos/env/のディレクトリの中に、update-eos.shのファイルが見当たらないバージョンをお持ちの方は、下記の方法で&lt;br /&gt;
ダウンロードしてください。&lt;br /&gt;
&lt;br /&gt;
 curl -L  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/update-eos.sh?export=raw &amp;gt; /tmp/update-eos.sh&lt;br /&gt;
 -&lt;br /&gt;
 若しくは、&lt;br /&gt;
 &lt;br /&gt;
 wget -q -O -  https://sourceforge.jp/projects/eos/scm/git/base/blobs/master/env/update-eos.sh?export=raw &amp;gt; /tmp/update-eos.sh&lt;br /&gt;
&lt;br /&gt;
として、アップデートコマンドをダウンロードします。&lt;br /&gt;
&lt;br /&gt;
==== アップデートコマンドの実行 ====&lt;br /&gt;
&lt;br /&gt;
DSDN上にアカウントを持っていない方は、 &lt;br /&gt;
&lt;br /&gt;
 $ EOS_GITUSER0= source /tmp/update-eos.sh&lt;br /&gt;
   or&lt;br /&gt;
 $ EOS_GITUSER0= source $EOS_HOME/env/update-eos.sh&lt;br /&gt;
&lt;br /&gt;
によりアップデートコマンドが動作します。アカウントが存在する方は、下記のuserを自身のアカウントに置き換えていただき&lt;br /&gt;
&lt;br /&gt;
 $ EOS_GITUSER0=user source /tmp/update-eos.sh&lt;br /&gt;
 もしくは、&lt;br /&gt;
 $ EOS_GITUSER0=user source $EOS_HOME/env/update-eos.sh&lt;br /&gt;
 もしくは、&lt;br /&gt;
 $ cd $EOS_HOME; EOG_GITUSER=user make git-fetch; EOG_GITUSER=user make git-merge&lt;br /&gt;
&lt;br /&gt;
としてアップデートを行ってください。複数のDirectoryを利用している方はそのディレクトリを引数で設定すると容易にアップデート出来ます。&lt;br /&gt;
&lt;br /&gt;
 $ EOS_GITUSER0= source $EOS_HOME/env/update-eos.sh           directory&lt;br /&gt;
   or &lt;br /&gt;
 $ EOS_GITUSER0=user source $EOS_HOME/env/update-eos.sh    directory&lt;br /&gt;
&lt;br /&gt;
=== 最新版に更新する場合(既に、ローカルにgitを用いてダウンロードしているものがある場合) ===&lt;br /&gt;
Eosの最新にアップデートすることができます。&lt;br /&gt;
&lt;br /&gt;
==== makeを用いた更新 ====&lt;br /&gt;
$EOS_HOME/Makefileが最新のものになっていれば、上記のことを下記のMakefileにて実行できます。&amp;lt;br&amp;gt;&lt;br /&gt;
※ $EOS_HOMEは、例えば、$HOME/Eosディレクトリを指しています。&amp;lt;br&amp;gt;&lt;br /&gt;
　環境ファイルをそのまま使用する場合は、baseディレクトリを$HOMEに置き、Eosとリネームして下さい。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME&lt;br /&gt;
 $ make git-fetch&lt;br /&gt;
 $ make git-merge&lt;br /&gt;
&lt;br /&gt;
==== 最新版の取得 ====&lt;br /&gt;
 $ git fetch            ;# 変更があったファイルをダウンロード&lt;br /&gt;
    or&lt;br /&gt;
 $ git fetch ssh://${EOS_GITUSER}@git.sourceforge.jp:/gitroot/eos/base.git&lt;br /&gt;
    or&lt;br /&gt;
 $ git fetch git://git.sourceforge.jp/gitroot/eos/base.git&lt;br /&gt;
&lt;br /&gt;
===== 最新版の取得（別法） =====&lt;br /&gt;
git pullは、fetch/merge等が自動的に実行されます。自分自身がソースコードを変更していない場合には一度に実施することができます。分かっている場合にのみ、使いましょう。疑問が少しでもある場合には、fetch/mergeを順に行うことをお薦めします。&lt;br /&gt;
&lt;br /&gt;
 $ git pull git://git.sourceforge.jp/gitroot/eos/base.git&lt;br /&gt;
&lt;br /&gt;
==== 変更になっている部分の確認 ====&lt;br /&gt;
 $ git log   FETCH_HEAD ;# 変更になっている部分を表示&lt;br /&gt;
&lt;br /&gt;
==== 変更を追加 ====&lt;br /&gt;
変更になっている部分を確認した後、自分自身が変更したものとマージしても問題がなければ、変更を追加します。自分自身も変更している場合には注意が必要です。&lt;br /&gt;
&lt;br /&gt;
 $ git merge FETCH_HEAD ;# 変更になっているものをマージする&lt;br /&gt;
&lt;br /&gt;
=== Eosの機能追加、修正を登録する場合(make) ===&lt;br /&gt;
&lt;br /&gt;
Eosそのものの機能(Eosが提供しているMakefile)を使ってインストールすることができます。この場合、基本的にmaster レポジトリに登録することになります。&lt;br /&gt;
&lt;br /&gt;
 $ cd $EOS_HOME               ; # Eosのディレクトリに移動します。&lt;br /&gt;
 $ make git-add                 ; # 変更や加えられたファイルをレポジトリに一時的に格納します&lt;br /&gt;
 $ make git-commit           ; # 変更点等のコメント毎、レポジトリに格納します&lt;br /&gt;
&lt;br /&gt;
タグを変更したいとき&amp;lt;br&amp;gt;&lt;br /&gt;
※ 現在、ソースコードをアップロード毎にバージョン名によるタグで管理しています。[[Eosの開発]]のルールに従って、アップロード前にタグを付けるよう、ご協力をお願いします。&lt;br /&gt;
&lt;br /&gt;
 $ git tag&lt;br /&gt;
 $ git tag newtag&lt;br /&gt;
&lt;br /&gt;
アップロードします&lt;br /&gt;
&lt;br /&gt;
 $ make git-push              ; # SourceForge上にアップします&lt;br /&gt;
&lt;br /&gt;
=== Eosの機能追加、修正を登録する場合(git) ===&lt;br /&gt;
&lt;br /&gt;
自分自身が機能追加、修正をかけ、登録する場合の例を下記に挙げておきます。&lt;br /&gt;
 git add         ; # 自分自身の複製で変更したものを加える&lt;br /&gt;
 git commit      ; # 変更したモノをgitに格納する&lt;br /&gt;
 #&lt;br /&gt;
 git push        ; # git serverに格納&lt;br /&gt;
  or&lt;br /&gt;
 git push origin master&lt;br /&gt;
  or&lt;br /&gt;
 git push origin master&lt;br /&gt;
&lt;br /&gt;
master以外のレポジトリを利用したい場合は、masterではなく、別のレポジトリを準備することになります。&lt;br /&gt;
&lt;br /&gt;
※ gitコマンド使い方の詳細は、[[http://sourceforge.jp/magazine/09/03/16/0831212 sourceforge]]もしくは、gitの解説書をご覧下さい。&lt;br /&gt;
&lt;br /&gt;
== 直接ダウンロードしたい方、開発環境は必要なく、実行だけを行いたい方 ==&lt;br /&gt;
下記のサイトから、バイナリtarballをダウンロードが可能です。&lt;br /&gt;
&lt;br /&gt;
 [[http://www.yasunaga-lab.bio.kyutech.ac.jp/ja/reserach/eos/eos-download-sites/ EosHomePage]]&lt;br /&gt;
     or&lt;br /&gt;
 [[http://sourceforge.jp/projects/eos/releases/ Sourceforge]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
上記にアップされていないバイナリ形式に興味がある方は安永(yasunaga@bio.kyutech.ac.jp)までご連絡下さい。&lt;br /&gt;
&lt;br /&gt;
作成されたディレクトリの構成（[[Eosの構造]]）は別ページにて説明しています。&lt;br /&gt;
&lt;br /&gt;
※　2013/02より、大幅にディレクトリの構成が変更になっています。ご注意下さい。目的は、ホスト依存のバイナリコードと非依存なソースコードを切り離すことが目的です。ヘテロな環境での実行を維持しながら、NFSなどでexportされた一つのディレクトリで実行するために変更しました。&lt;br /&gt;
&lt;br /&gt;
== 動作環境 ==&lt;br /&gt;
&lt;br /&gt;
　現在、手元に環境があり、動作することが確認出来ているのは、下記のものです。&lt;br /&gt;
&lt;br /&gt;
 LINUX 32bits/64bits&lt;br /&gt;
 OS-X  32bits/64bits&lt;br /&gt;
 Windows with Cygwin&lt;br /&gt;
&lt;br /&gt;
== うまく動作しない場合 ==&lt;br /&gt;
&lt;br /&gt;
=== コンパイルされていない場合 ===&lt;br /&gt;
Q1)　使いたいツールを実行しようとすると Not Installed: XXXXX-version YYYYYY　といわれる&lt;br /&gt;
&lt;br /&gt;
A1)　設定された環境でコンパイル・リンクがなされていません。src/Tools以下のディレクトリにあるCLASS/YYYYYY　のディレクトリに移動し、make check; make depend; make install　とうってみましょう。&lt;br /&gt;
&lt;br /&gt;
=== Xcodeのインストールが不十分な場合 ===&lt;br /&gt;
&lt;br /&gt;
Q2 ) OS-Xでmakeを利用しようとすると下記のようなエラーコードがでる&lt;br /&gt;
&lt;br /&gt;
 sh: line 1:  8482 Trace/BPT trap: 5       /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk '' -find make 2&amp;gt; /dev/null&lt;br /&gt;
 make: error: unable to find utility &amp;quot;make&amp;quot;, not a developer tool or in PATH&lt;br /&gt;
&lt;br /&gt;
A2)　いずれかのダイナミックライブラリがうまくインストールされていない場合にこのようなエラーが出ます。&lt;br /&gt;
&lt;br /&gt;
直接、下記のコマンドを実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk '' -find make&lt;br /&gt;
&lt;br /&gt;
足りないライブラリに関してエラーを出力しています。多くの場合、ダイナミックライブラリのパスの設定の問題です。&lt;br /&gt;
&lt;br /&gt;
 sudo cp /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Resources/libTIFF.dylib $EOS_HOME//util/X86MAC64/lib/&lt;br /&gt;
&lt;br /&gt;
として、必要とされるライブラリを$EOS_HOME//util/X86MAC64/lib/コピーしてみて下さい。&lt;br /&gt;
&lt;br /&gt;
=== gitのメモリが足りないとき ===&lt;br /&gt;
Q3)  git cloneをかけようとすると、&lt;br /&gt;
 remote: aborting due to possible repository corruption on the remote side.&lt;br /&gt;
 fatal: early EOF&lt;br /&gt;
 fatal: index-pack failed&lt;br /&gt;
として停止してしまう。&lt;br /&gt;
&lt;br /&gt;
A3) これは、Eosのパッケージが大きすぎて、gitがindexを取得できないために生じます。&lt;br /&gt;
&lt;br /&gt;
=== LD_LIBRARY_PATH に問題がある場合 ===&lt;br /&gt;
Q. El Captan (10.11)でcudaに関して、下記の様な dyldのエラーが生じる&lt;br /&gt;
&lt;br /&gt;
 $ mrcInfo -h &lt;br /&gt;
 dyld: Library not loaded: @rpath/libcudart.6.5.dylib&lt;br /&gt;
   Referenced from: /Users/tacyas/Eos/bin/X86MAC64/mrcInfo&lt;br /&gt;
   Reason: image not found&lt;br /&gt;
 /Users/tacyas/Eos/bin/mrcInfo: line 110:   424 Trace/BPT trap: 5       ${EOS_HOME}/bin/${OSTYPE}/${BASENAME} &amp;quot;$@&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A. csrutilコマンドを使う必要があります。&lt;br /&gt;
&lt;br /&gt;
*リカバリーモードで立ち上げます。&lt;br /&gt;
*command + R を押しながら、電源をいれます。&lt;br /&gt;
*ユーティリティからターミナルを立ち上げます。&lt;br /&gt;
*下記のコマンドを実行します。&lt;br /&gt;
 &lt;br /&gt;
 $ csrutil diable&lt;br /&gt;
 $ reboot&lt;br /&gt;
&lt;br /&gt;
これで利用できるはずです。今後問題を解決したいと思います。&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:16:29Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
　[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
　[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
　[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
　inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
　[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:12:31Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本１４（例外） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&lt;br /&gt;
&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&lt;br /&gt;
&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
　[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
　[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
　[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
　inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
　[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:12:06Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本１４（例外） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&lt;br /&gt;
&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&lt;br /&gt;
&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
　[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
　[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
　[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
　inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
　[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:10:12Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本１３（orの使用例） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&lt;br /&gt;
&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&lt;br /&gt;
&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
　[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
　[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
　[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
　inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:09:32Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本１３（orの使用例） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&lt;br /&gt;
&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&lt;br /&gt;
&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
　[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
　[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
　[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
　inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:07:35Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本１２（チケット） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&lt;br /&gt;
&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&lt;br /&gt;
&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
　[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
　[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
　[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:05:36Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本１１（ループ文２） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&lt;br /&gt;
&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&lt;br /&gt;
&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
　[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
　[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:04:50Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本１１（ループ文２） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&lt;br /&gt;
&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&lt;br /&gt;
&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
　[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
　[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:02:31Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本１０（ループ文） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&lt;br /&gt;
&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&lt;br /&gt;
&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
　[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB</id>
		<title>PIONEチュートリアル</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/PIONE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/>
				<updated>2016-04-20T07:00:21Z</updated>
		
		<summary type="html">&lt;p&gt;Takahiro: /* 基本９（インタラクションAPIの使用） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''PIONE'''チュートリアル&amp;lt;br&amp;gt;&lt;br /&gt;
　ここでは、[[PIONE]]のチュートリアルを行います。始める前に[[PIONEのインストール]]をしておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
=== 基本１（特定のファイルを出力する） ===&lt;br /&gt;
&lt;br /&gt;
　まず、PIONEを動かすにはルール定義書をつくる必要があります。 &amp;lt;br&amp;gt;&lt;br /&gt;
どんな言語でも最初に作成するHelloプログラムを作ってみましょう。&lt;br /&gt;
&lt;br /&gt;
　次の内容のファイル'HelloWorld.pione'を作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
 &lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
この後、[[pione-client]]を実行します。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client HelloWorld.pione -b helloOutput&lt;br /&gt;
&lt;br /&gt;
例えば、次のような出力が流れます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
その結果、helloOutputというディレクトリができます。その中に指定したファイルmessage.txtが出力されています。&lt;br /&gt;
&lt;br /&gt;
 $ cat helloOutput/output/message.txt&lt;br /&gt;
&lt;br /&gt;
 Hello PIONE world !&lt;br /&gt;
&lt;br /&gt;
もう一度、実行すると今度は、実行の必要がないために次のようなものが出力されます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
さっきと比べると、Main Ruleが動いていないことが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
　さて、改めて設定したファイルを眺めてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、最初に呼び出されるルール（Main)が定義されています。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
&lt;br /&gt;
Mainは、Ｃ言語などと同様に特別な意味をもつルールです。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、出力ファイルが定義されています。&lt;br /&gt;
&lt;br /&gt;
 	output 'message.txt'&lt;br /&gt;
&lt;br /&gt;
ここに書かれたファイルが最終的に-bで指定されたディレクトリに出力として戻ってきます。&amp;lt;br&amp;gt;&lt;br /&gt;
Action以降が実際に起動するプログラムになります。&lt;br /&gt;
&lt;br /&gt;
 Action&lt;br /&gt;
 	echo &amp;quot;Hello PIONE world !&amp;quot; &amp;gt; message.txt&lt;br /&gt;
&lt;br /&gt;
実際にはシェルスクリプトが動きますので、どんなものも実行が可能です。&lt;br /&gt;
&lt;br /&gt;
 #!/bin/csh&lt;br /&gt;
&lt;br /&gt;
で始めれば、cshを使って記述することもできますし、スクリプト系の言語であれば自由に記述し、実行形式を実行出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
最後に、RuleをEndで終了します。&lt;br /&gt;
&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
これが、一番シンプルなルールの書き方です。入力ファイルがないので、出力ファイルがなければ作成し、あれば作成しないという動作をします。&amp;lt;br&amp;gt;&lt;br /&gt;
必要以上の動作をしないところが通常のシェルスクリプトを実行する場合と異なる点です。&lt;br /&gt;
&lt;br /&gt;
=== 基本２（特定のファイルを入力し、出力する（更新判定）） ===&lt;br /&gt;
&lt;br /&gt;
　次に、入力ファイルから出力ファイルを作成する場合の定義書について作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
 #Multiplying.pione&lt;br /&gt;
 &lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output 'test.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は、test.inという入力ファイルの中にある行頭の数字を２倍して、test.outというファイルを作り出すルールです (awkの使い方については、別途勉強してみて下さい)。&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイルの更新判定により、ルールを実行するかどうかが変わってきます。&lt;br /&gt;
&lt;br /&gt;
　まず、&lt;br /&gt;
&lt;br /&gt;
 $ mkdir MultiplyingInput&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
として、入力ファイルがあるディレクトリ（指定しなければ、現在のディレクトリ）を指定して実行してみます。&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
&lt;br /&gt;
入力ファイルがありませんので、何もする事がないとして終了してしまいます。先ほどとの違いに気がついたでしょうか。&lt;br /&gt;
&lt;br /&gt;
　次に、ファイルを作成して、実行してみます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;3&amp;quot;   &amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ echo &amp;quot;5&amp;quot; &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 $ cat MultiplyingInput/test.in&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
となり、確かに２倍の値のファイルができあがっていることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度、実行すると、&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
となり、ここでも何も実行しません。&amp;lt;br&amp;gt;&lt;br /&gt;
つまり、入力ファイルに比べて出力ファイルのほうが新しいので、更新判定の結果、実行しなくてよいと判断したことになります。賢いですね。&lt;br /&gt;
&lt;br /&gt;
　ここで、ファイルを更新してみましょう。３行目に7を付け加えます。&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;7&amp;quot;   &amp;gt;&amp;gt; MultiplyingInput/test.in&lt;br /&gt;
 &lt;br /&gt;
そして、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
 &lt;br /&gt;
 $ cat MultiplyingOutput/output/test.out &lt;br /&gt;
 6&lt;br /&gt;
 10&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
今度は実行されました。これが更新判定によりルールが実行されるかどうかが判定されているということです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行しても、今度は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test.in],{})&lt;br /&gt;
&lt;br /&gt;
さて、出力ファイルを削除してみるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ rm  MultiplyingOutput/output/test.out &lt;br /&gt;
&lt;br /&gt;
今度は、実行されますね。&lt;br /&gt;
&lt;br /&gt;
　では、内容は変えずに、touch コマンドを使って、入力ファイルの修正時刻を変えるとどうなるでしょうか。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingInput/test.in&lt;br /&gt;
&lt;br /&gt;
今回も、予想通り、動作しました。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、動作しないようだったら、バグです。すぐに、[https://github.com/pione GITHUB/PIONE]に報告しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
この基本２が理解できれば、まず、PIONEの動きの基本が理解できたことになります。&lt;br /&gt;
&lt;br /&gt;
　ところで、Actionで定義した動作の中に、見慣れない記号（ {$I[1]}, {$O[1]} ）が現れています。&lt;br /&gt;
&lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
{$I[1]}は入力ファイル、{$O[1]}は出力ファイルを表しています。それぞれの[]の中の数字１は、input/outputで定義したそれぞれの１番目ということを意味しています。 &amp;lt;br&amp;gt;&lt;br /&gt;
次の基本３での複数ファイルの入出力では１以外が使われることになります。 &amp;lt;br&amp;gt;&lt;br /&gt;
まだ、何が便利か少し分かりづらいと思いますが、例えば、Multiplying2.pioneとして、次のように記述するとどのように動作するでしょうか。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test.in'&lt;br /&gt;
 	output '{$I[1]}.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
少し考えてみて下さい。そして、動作させてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Multiplying2.pione -b MultiplyingOutput -i MultiplyingInput/&lt;br /&gt;
&lt;br /&gt;
MultiplyingOutput/outputのディレクトリにはどんなファイルができあがったでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
そうですね。test.in.outができあがっています。何故かを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
=== 基本３（複数ファイルの入力と複数ファイルの出力）===&lt;br /&gt;
&lt;br /&gt;
　さて、更新判定が理解できたところで、複数ファイルの入出力について考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
test1.in, test2.inから、それぞれ２倍した数が格納された、test1.out, test2.outが出力できる[[PIONE定義書]]を作成してみましょう。 &amp;lt;br&amp;gt;&lt;br /&gt;
ここで、名前をMultiplyingFiles.pioneとして作成してみましょう。&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　問題１：上記のMultiplyingFiles.pioneを作成して実行してみて下さい。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例１：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 	awk '{ print $1*2 }' {$I[2]} &amp;gt; {$O[2]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
どうでしょうか。思ったように動きましたか。複数のファイルがあれば、複数書き並べればよいのです。&lt;br /&gt;
&lt;br /&gt;
　でもなんだか、同じ事をするのに、同じような行を何行も書くのは嫌だなと思いませんか。もし、２倍を５倍に変えたくなったら全ての行を書き換えなくてはなりません。&amp;lt;br&amp;gt;&lt;br /&gt;
１０行ぐらいならそれでもよいけれど、１００個、１０００個とファイルが増えてきたらどうでしょうか。だんだん嫌になってきませんか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　では、どうすれば良いでしょうか。例えば、シェルスクリプトが得意なひとは次の様なプログラムを設定することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例２：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input 'test1.in'&lt;br /&gt;
 	input 'test2.in'&lt;br /&gt;
 	output 'test1.out'&lt;br /&gt;
 	output 'test2.out'&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
これでも、ファイルが増えるたびにinput/outputを書き換える必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、全てのファイルを入力し、全てのファイルを出力するように入出力を表現することも出来ます。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　解答例３：&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
 &lt;br /&gt;
 Action &lt;br /&gt;
        for i in `ls *.in`; do&lt;br /&gt;
             awk '{ print $1*2 }' $i &amp;gt; `basename $i .in`.out &lt;br /&gt;
        done&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
どうでしょうか。うまく動作したでしょうか。ここで、&lt;br /&gt;
&lt;br /&gt;
 	input '*.in'.all&lt;br /&gt;
 	output '*.out'.all&lt;br /&gt;
&lt;br /&gt;
の部分は、*は任意の文字列を表現します。つまり、*.inは、ファイルの最後が.inで終了しているファイル全て、*.outは、ファイルの最後が.outで終了しているファイル全てを表します。&amp;lt;br&amp;gt;&lt;br /&gt;
.allがついていると、全てのファイルを取り扱うことを意味しています。&amp;lt;br&amp;gt;&lt;br /&gt;
.allが付いていないときには、.eachがついていることがdefaultとして決まっています。一つひとつのファイルを別々に実行するという意味になります。&amp;lt;br&amp;gt;&lt;br /&gt;
これでずいぶんと記述しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
　でも、これだと、*.inのどれかのファイルが更新されていると全て変更になってしまいます。試してみて下さい。なんだか無駄ですね。&amp;lt;br&amp;gt;&lt;br /&gt;
また、同時にできるはずのことをfor文を使って順次実行しているので、時間も無駄ですね。このくらいのタスクであれば、たいして時間がかかるわけではないのですが、もっと時間のかかるタスクだったらどうでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
必要なファイルの更新だけを、できれば複数のホストや一台でもマルチコアＣＰＵを使って、同時に動かすともっと早く終了できるようになるはずです。&lt;br /&gt;
&lt;br /&gt;
　さて、それではどのようにすればよいのでしょうか。それが次の基本４になります。だんだんPIONEらしくなってきます。&lt;br /&gt;
&lt;br /&gt;
=== 基本４（複数ファイルの入力と複数ファイルの出力の並列処理）===&lt;br /&gt;
&lt;br /&gt;
　次は、さっきと違ってallが付いていません。なにが起きるかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input '*.in'&lt;br /&gt;
 	output '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
    awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic4 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
ここで、{$I[1][1]}.outは1番目のinputで拡張子を除いたファイル名を指します。（参照: [[PIONE定義書#入力定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
下は実行した例です。&lt;br /&gt;
&lt;br /&gt;
  $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test7.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
４つのタスクが並列に動いている様子が分かるでしょうか。 &amp;lt;br&amp;gt;&lt;br /&gt;
確かに４つずつのタスク( ==&amp;gt; &amp;amp;Anonymous:Main([testN.in],{}))が並列に動作しているようです。&amp;lt;br&amp;gt;&lt;br /&gt;
もう一度実行してみると下のようになります。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
今度は実行されません。そこで、ひとつファイルを更新してみます。&lt;br /&gt;
&lt;br /&gt;
 $ touch MultiplyingFilesInput/test3.in &lt;br /&gt;
 $ pione-client MultiplyingFilesEach.pione -b MultiplyingFilesEachOutput -i MultiplyingFilesInput/  -t 4&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]} &lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、test3.inだけが更新されているのが分かります。これがeachとしての振る舞いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本４の補足（eachでの速度検証）]]====&lt;br /&gt;
eachを使った並列化処理による計算速度向上の一例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本５（直列：フロールールの設定 ）===&lt;br /&gt;
&lt;br /&gt;
　さて、もう少し複雑なルールについて設定してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、ふたつのルールを組み合わせて、並列計算することを考えてみます。&lt;br /&gt;
&lt;br /&gt;
 Rule Main&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '*.out'&lt;br /&gt;
 Flow&lt;br /&gt;
 	rule First&lt;br /&gt;
 	rule Second&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule First&lt;br /&gt;
 	input   '*.in'&lt;br /&gt;
 	output  '{$I[1][1]}.route'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Rule Second&lt;br /&gt;
 	input   '*.route'&lt;br /&gt;
 	output  '{$I[1][1]}.out'&lt;br /&gt;
 Action&lt;br /&gt;
 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic5 こちら]からダウンロードできます。&lt;br /&gt;
&lt;br /&gt;
　実行結果を以下に示します。最初に５つのタスク(First)が並列で動いているのがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、終了した順に、次のルールが動いています。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test1.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test3.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test4.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test1.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test1.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test3.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test3.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test4.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test4.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' {$I[1]} &amp;gt; {$O[1]}	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test5.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test5.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
一度、終了しましたので、次は実行されません。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
さて、ここで、ファイルをひとつ(test6.in)増やしてみましょう。&lt;br /&gt;
&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test6.in &amp;gt; test6.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test6.route &amp;gt; test6.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test6.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([test1.in,test2.in,test3.in,...],{})&lt;br /&gt;
&lt;br /&gt;
新しくできたファイルだけが作られていることがわかります。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、ファイルの更新がかかったときはどうなるでしょうか。test2.inをtouchコマンドで更新してみました。&lt;br /&gt;
&lt;br /&gt;
 $ touch SerialInput/test2.in&lt;br /&gt;
 $ pione-client Serial2.pione -i SerialInput/ -b Serial2Output2&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1*2 }' test2.in &amp;gt; test2.route	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:First([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	awk '{ print $1+1 }' test2.route &amp;gt; test2.out	&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Second([test2.route],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test2.in],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([test6.in],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,test1.in,test2.in,...],{})&lt;br /&gt;
&lt;br /&gt;
となり、新しいファイルであるtest2.in, test6.inに関しては、変更の可能性があるので起動し始めます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、実際にinputファイルが更新されたtest2.inのみ処理が行われ、test2.outのみ作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[基本５の補足（並列処理での速度向上例）]]====&lt;br /&gt;
基本5のプログラムに関して速度向上の例を示しています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本６（パラメータの定義） ===&lt;br /&gt;
　入力データは、ファイルから読み取る以外にパラメータとして使用する方法があります。&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータにはbasicとadvancedの２つがあります。処理上の違いは特にありませんが、前者を基本パラメータ、後者を上級者向けパラメータとして定義することで[[ユーザ]]のレベルに応じて変更可能なパラメータを区別することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
下記のように定義します。（参照：[[PIONE定義書#パラメータ定義]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
basic param $b_val := 456&lt;br /&gt;
advanced param $a_val := 987&lt;br /&gt;
&lt;br /&gt;
Basic Param&lt;br /&gt;
	$b_val1 := 135&lt;br /&gt;
	$b_val2 := 246&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Advanced Param&lt;br /&gt;
	$a_val1 := 975&lt;br /&gt;
	$a_val2 := 864&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $main_val := $val * 10&lt;br /&gt;
Flow&lt;br /&gt;
	rule Sub {sub_val1: $main_val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Sub&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	param $sub_val1&lt;br /&gt;
	param $sub_val2 := $val * 100&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	val:		{$val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val:		{$b_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val1:		{$b_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	b_val2:		{$b_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val:		{$a_val}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val1:		{$a_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	a_val2:		{$a_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val1:	{$sub_val1}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
	echo &amp;quot;	sub_val2:	{$sub_val2}&amp;quot; &amp;gt;&amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
１つずつ定義するときはそれぞれbasic param XXX、advanced param YYYのように記述します。（単にparam ZZZとしたときはbasic扱いとなります。）&amp;lt;br&amp;gt;&lt;br /&gt;
まとめて定義したいときはBasic Param ~ End, Advanced Param ~ Endで囲みます。&amp;lt;br&amp;gt;&lt;br /&gt;
定義する変数名の先頭には'''$'''を付けて記述し、''':='''にてデフォルト値を定義することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
またAction内で使用するときは入力ファイルや出力ファイルと同様に'''{''' '''}'''で括ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
設定したパラメータはオプション--params=&amp;quot;{XXX:N}&amp;quot;で値を設定して実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、定義書内でデフォルト値を記述しておけば、--params内で設定しなかったパラメータもデフォルト値で処理されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はbasicのみに値を設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
&amp;quot;{val:1,b_val:3,b_val1:5,b_val2:7}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		3&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		5&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		7&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ cat ParamEcho/output/message.txt &lt;br /&gt;
Basic Parameters:&lt;br /&gt;
	val:		1&lt;br /&gt;
	b_val:		3&lt;br /&gt;
	b_val1:		5&lt;br /&gt;
	b_val2:		7&lt;br /&gt;
Advanced Parameters:&lt;br /&gt;
	a_val:		987&lt;br /&gt;
	a_val1:		975&lt;br /&gt;
	a_val2:		864&lt;br /&gt;
Parameters in Sub:&lt;br /&gt;
	sub_val1:	10&lt;br /&gt;
	sub_val2:	100&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
設定を反映した処理が実行できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== パラメータのシーケンス ====&lt;br /&gt;
　ではパラメータの値を複数（シーケンス）使用した場合はどうなるのでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
valに複数の値(1|2)を入れてみます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2)}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;100)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;20),sub_val2:(&amp;lt;i&amp;gt;200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
デフォルトではval=(1|2)がeachとして動作します。この場合はmain_val=(10|20)となって、それぞれsub_val1=(10|20), sub_val2=(100|200)となります。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、sub_val1, sub_val2はともにeachですので、上記のように(10, 100), (10, 200), (20, 100), (20, 200)と2*2の組み合わせでルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、val=(1|2).allではどうなるでしょうか。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic6$ pione-client ParamEcho.pione -b ParamEcho --params=&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
&amp;quot;{val:(1|2).all}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;Basic Parameters:&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	val:		1 2&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val:		456&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val1:		135&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	b_val2:		246&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Advanced Parameters:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val:		987&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val1:		975&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	a_val2:		864&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;Parameters in Sub:&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val1:	10 20&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH 	echo &amp;quot;	sub_val2:	100 200&amp;quot; &amp;gt;&amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Sub([],{sub_val1:(&amp;lt;i&amp;gt;10|20),sub_val2:(&amp;lt;i&amp;gt;100|200)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{main_val:(&amp;lt;i&amp;gt;10|20)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic6$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allの場合はsub_val1=(10|20), sub_val2=(100|200)として組み合わせるので、上記のように１つのルールが動くだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
このようにパラメータについてもeach, allを使うことでルールの振り分けが可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本７（条件文） ===&lt;br /&gt;
==== if文 ====&lt;br /&gt;
　今回はif文などを用いて実行したいルールを制御してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic7 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最初のパラメータvalに対して、偶数の場合と奇数の場合でそれぞれ別のルールを実行するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
Rule Mainにif文がありますが、[[PIONE]]の記述ではif ~ endと記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、valをデフォルト値で実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
123 is odd.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
val=123で定義されていますので、この場合は奇数のルールが動いているのが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次にvalを偶数にして実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic7$ pione-client EvenOdd.pione -b EvenOdd --params=&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
&amp;quot;{val:456}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt; message.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic7$ cat EvenOdd/output/message.txt &lt;br /&gt;
456 is even.&lt;br /&gt;
/Basic7$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
偶数のルールが動きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上のようにして条件に合わせてルールを制御することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== case文 ====&lt;br /&gt;
　case文の場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $val % 2&lt;br /&gt;
	when 0&lt;br /&gt;
		rule Even&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constraint ====&lt;br /&gt;
　constraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $val := 123&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Even&lt;br /&gt;
	rule Odd&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 0&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output 'message.txt'&lt;br /&gt;
	constraint $val % 2 == 1&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt; {$O[1]};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[デバッグのための条件文]]====&lt;br /&gt;
　条件文を使って、デバッグの切り替えの手間が少なくなる方法を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本８（インタラクティブ操作） ===&lt;br /&gt;
　ここまでは、コマンドを実行すると結果出力までの動作を全てプログラムに委ねる、一方通行の処理を記述してきました。&amp;lt;br&amp;gt;&lt;br /&gt;
次は、処理の途中でユーザが操作できるようにし、それ以降の処理を制御(インタラクティブ操作)できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はウェブページから選択した入力ファイルに対して、設定した演算子(+, *)、数値で計算したファイルを出力する処理を作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
実行ファイル作成のためにパッケージを、実行のために[[PIONE Webclient]]を利用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まず、インタラクティブ操作のための処理を[[PIONE定義書]]に記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName :: &amp;quot;InteractiveCalc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.out'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;Interruption!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	echo &amp;quot;finish!&amp;quot; &amp;gt; result.log.out&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この処理では、.outファイルを出力ファイルとしてダウンロードできるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[pione-interactive]] browserコマンドにてInteractiveページを開けるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、--publicオプションで、ページのために使用する[[html]]ファイルや[[cgi]]ファイルなどがあるディレクトリを指定します。&amp;lt;br&amp;gt;&lt;br /&gt;
そのために、事前にディレクトリ(public)を用意し、そのディレクトリの下に、etcディレクトリ内とbinディレクトリ内のすべてのファイルをそれぞれコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
また、Interactiveページを終了した後は、作成したファイルを処理できるようにpublicディレクトリ内のデータを全てワークスペース(.)へコピーしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次に、ウェブページにて最初に呼び出されるindex.htmlを作成します。htmlファイルはetcディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCalc Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileCalc.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			入力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;inputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			演算子&lt;br /&gt;
			&amp;lt;select name=&amp;quot;operator&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;add&amp;quot;&amp;gt;+&amp;lt;/option&amp;gt;&lt;br /&gt;
				&amp;lt;option value=&amp;quot;mul&amp;quot;&amp;gt;*&amp;lt;/option&amp;gt;&lt;br /&gt;
			&amp;lt;/select&amp;gt;&lt;br /&gt;
			数値&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;value&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			出力ファイル名&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;outputfile&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;計算開始&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最後の方にある&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;は、「終了」をクリックするとワーキンングディレクトリに終了通知を行い、インタラクティブ操作を終了させる処理です。詳しくは[[インタラクションAPI]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして、.cgiファイルを作成します。[[シェルスクリプト]]や[[Eosのコマンド]]などの特殊な処理はこのファイルに記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
cgiファイルはbinディレクトリ内に置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
HTMLstr=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
input_file=cgi.params['inputfile'][0]&lt;br /&gt;
output_path=cgi['outputfile']&lt;br /&gt;
operator=cgi['operator']&lt;br /&gt;
value=cgi['value'].to_i&lt;br /&gt;
&lt;br /&gt;
## Calc input to output&lt;br /&gt;
output_file = open(output_path, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_file.original_filename.to_s + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_path + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
input_file.each do |input_line|&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + input_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	work_value = input_line.to_i&lt;br /&gt;
&lt;br /&gt;
	case operator&lt;br /&gt;
	when &amp;quot;add&amp;quot;&lt;br /&gt;
		work_value += value&lt;br /&gt;
	when &amp;quot;mul&amp;quot;&lt;br /&gt;
		work_value *= value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output_line = work_value.to_s&lt;br /&gt;
	output_file.write(output_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + output_line + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
	HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
output_file.close&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Ruby]]を使って記述しています。# Output as html以下のコードで[[html]]形式に変換するようにしています。そのためにCGIクラスが必要なので、require 'cgi'とcgi = CGI.newで用意しています。このようにすると、# Main Process内のようにHTMLstrに記述する文字列を加えるだけで、自由な処理を行ってその結果を[[html]]のページを表示することができます。また、## Query to ParametersにてPOST形式のクエリを変数に変換していますが、typeがfileの場合、ファイル本体はCGIクラスメンバーParamsから受け取ります。このとき受け取るデータはファイルポインタ配列ですので、取得したい要素No.を指定する必要があります。今回、入力ファイルは１つしか格納していないので、cgi.params['inputfile'][0]となります。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コードが完成したら、[[パッケージ作成]]を行います。([[PIONEチュートリアル-package]]を参照)&amp;lt;br&amp;gt;&lt;br /&gt;
なお、これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic8 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Basic8/&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Basic8/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/InteractiveCalc.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成した[[パッケージ]]は[[PIONE Webclient]]にて動かすことができます。[[PIONE Webclientチュートリアル#インタラクティブ操作を含むコマンドを実行]]にて動作方法と実行結果を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
index.htmlとFileCalc.cgiで作成したページ&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient13.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:PIONE-Webclient14.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本９（[[インタラクションAPI]]の使用） ===&lt;br /&gt;
　[[インタラクションAPI]]を使用してワーキングディレクトリに通知を送ることで、ファイル操作や終了などを命令することができます。.htmlや.cgiに記述することにより、[[ユーザ]]からの操作を受けてこれらの命令を実行することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;FileOperation&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は.txtファイルのみを出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;FileOperation&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（ファイル）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;作成（テキスト）&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pione-content&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./AAA.txt&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;./list.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;pione-action&amp;quot; value=&amp;quot;get&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;ファイル一覧の取得&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
それぞれのボタンよりファイル操作を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（ファイル）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したファイルをサーバ上のファイル(AAA.txt)に書き込んでアップロードします。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成（テキスト）：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;指定したテキストボックスの内容でサーバ上のファイル(AAA.txt)に書き込みます。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;削除：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル(AAA.txt)内容を削除します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;ファイル一覧の取得：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サーバ上のファイル一覧を表示します。(list.cgiが動作します)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;終了：&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;操作を終了します。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
etc/list.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;lt;&amp;lt;'Block-HTML'&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;CGIページ&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function(file) {&lt;br /&gt;
					div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Block-HTML&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;./&amp;quot;に対して&amp;quot;pione-action=list&amp;quot;を送信したときの戻り値をgetJSONにより取得して、データ毎の&amp;quot;name&amp;quot;を出力するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic9 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
では、実行させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクションページを開くと下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずは選択...ボタンからテキストファイルを選択し、作成（ファイル）ボタンでサーバ内にファイルを作成（アップロード）してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtが同じ内容で作成(アップロード)されます。終了した後にダウンロードすると/output/AAA.txtの内容を確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、ファイル一覧の取得ボタンよりサーバ上のファイル一覧を閲覧することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そして削除ボタンを押すと、AAA.txtを削除します。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
AAA.txtがなくなっているのが確認できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次はテキストボックスに文字列を書き込んで、作成（テキスト）ボタンを押してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Basic9-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
これによりAAA.txtがテキストの内容で作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
操作を終えるときには終了をクリックして下さい。終了通知が送られてインタラクティブ処理が完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
また、htmlなどを実装する上で終了時には必ず終了通知finishを送信するように注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１０（ループ文） ===&lt;br /&gt;
[[PIONE定義書]]にてループ文を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
Action内はシェルスクリプトですので、for文やwhile文を使用することで容易にループを実現できます。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、Actionに記述した処理は一つのルールに書かれるため、一かたまりの処理として一つのマシンで実行されてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
それでは、処理を分割できる[[PIONE]]の長所を活かせていません。&amp;lt;br&amp;gt;&lt;br /&gt;
ループ内の一つひとつの処理を分割し、複数のマシンで短時間に処理を行うことを考えましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そこで、Flowでループ文に相当する内容を作成し、ループ内の個別の処理を各々のマシンに振り分ける工夫を施します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、[[#基本７（制御文）]]での偶数奇数判定の処理を、最小値から最大値まで加算値を加算しながら行っていくプログラムを作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
このプログラムは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic10 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
最大値、最小値、加算値をパラメータで設定できるようにし、ルールLoopSystemにてループ文を実現しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: $minval}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val + $dval) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: $val + $dval}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
まず、MainルールからLoopSystemをval=最小値で呼び出し、その中でvalが最大値になるまでは加算値を加えながら再帰的にLoopSystemを呼び出しています。&amp;lt;br&amp;gt;&lt;br /&gt;
出力ファイル名を偶数のときはEven{$val}.txt、奇数のときはOdd{$val}.txtとしています。&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ pione-client EvenOddLoop.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;197)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;123 is odd.&amp;quot; &amp;gt;&amp;gt; Odd123.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Odd([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	echo &amp;quot;456 is even.&amp;quot; &amp;gt;&amp;gt; Even456.txt;&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Even([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:EvenOdd([],{val:(&amp;lt;i&amp;gt;456)})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;160)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:LoopSystem([],{val:(&amp;lt;i&amp;gt;123)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はパラメータをデフォルト値で実行しましたので、123から456まで37刻みで実行されます。lsコマンドで出力ファイルを確認します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic10$ ls process/output/&lt;br /&gt;
Even160.txt	Even308.txt	Even456.txt	Odd197.txt	Odd345.txt&lt;br /&gt;
Even234.txt	Even382.txt	Odd123.txt	Odd271.txt	Odd419.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれの値について偶数奇数の処理が実行されていることが確認できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１１（ループ文２） ===&lt;br /&gt;
[[#基本１０（ループ文）]]でループの作成方法を示しました。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、[[#基本１０（ループ文）]]の書き方では逐次処理となってしまうので、ループ数に比例して処理時間が掛かってしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
この問題を解決する方法を考えましょう。&lt;br /&gt;
以下に示すのは、val=0がmax=64になるまで1を足し続け、{$val}.txtを作成する、ループを使った処理の例です。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示していくファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic11 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule LoopSystem {val: 0}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if $val + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: $val + 1}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
このままでは、[[#基本１０（ループ文）]]同様、ループ部分は、逐次処理になっています。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで、ループの箇所を下記のような分割した形に書き換え、並列処理を試みます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	if ($val * 2) + 1 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	end&lt;br /&gt;
	if ($val * 2) + 2 &amp;lt;= $max&lt;br /&gt;
		rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすることでループに掛かる時間が改善されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
あるいはconstraintを使用して下記のように記述する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $max&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $val}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、valの値を加算している箇所ですが、&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 1}&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + 2}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
シーケンスを利用して下記のように書くこともできます。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule LoopSystem {val: ($val * 2) + (1|2)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
問題：これを踏まえて[[#基本１０（ループ文）]]のループを改善してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例１&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val &amp;lt;= $maxval&lt;br /&gt;
		rule EvenOdd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + $dval &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + $dval}&lt;br /&gt;
	end&lt;br /&gt;
	if (($val * 2) - $minval) + ($dval * 2) &amp;lt;= $maxval&lt;br /&gt;
		rule LoopSystem {val: (($val * 2) - $minval) + ($dval * 2)}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Flow内の条件を分割しています。条件式が多少複雑になっていますので、演算の順番に注意しましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
また、現在のバージョンでの四則演算は二項演算のみの対応となっていますので、三項以上の場合は必ず括弧で括るようにして下さい（参照：[[PIONEの式#四則演算における注意事項]]）。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解答例２：constraintとシーケンスを利用した場合&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule LoopSystem&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
	param $val&lt;br /&gt;
	constraint $val &amp;lt;= $maxval&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $val}&lt;br /&gt;
	rule LoopSystem {val: (($val * 2) - $minval) + ($dval * (1|2))}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより[[#基本１０（ループ文）]]よりも呼び出されるルールの階層は浅くなります。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、いずれも入れ子で呼び出されるのでルールが多くなるほど処理が重くなるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
そこで１つのルールから一気にループ数だけのルールを呼び出す方法を考えます。この記述方法については[[#基本１５（ループ文３）]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１２（チケット） ===&lt;br /&gt;
[[PIONE]]の目的の一つは、できる限り並列処理を行うことですので、必ずしも記述の順番通りにルールが実行される訳ではありません。&amp;lt;br&amp;gt;&lt;br /&gt;
ルールに順番を持たせたいときにはチケットという機能を利用します。但し、使い過ぎると待ち時間が多くなり並列計算できる[[PIONE]]の長所が活かせなくなってしまいますので注意が必要です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の内容をご覧下さい。(CreateList-instant.pione)&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic12 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0&lt;br /&gt;
	rule CreateList&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Touch0&lt;br /&gt;
	output '0.data'&lt;br /&gt;
Action&lt;br /&gt;
	sleep 1&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule CreateList&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Action&lt;br /&gt;
	ls *.data &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはCreateListで.dataファイルの一覧をlist.txtに記述する処理ですが、途中のTouch0でも0.dataファイルを作成しています。&amp;lt;br&amp;gt;&lt;br /&gt;
この0.dataが一覧に含まれるかを検証してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
入力ファイル用のディレクトリ(input)内&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ ls input/&lt;br /&gt;
1.data	2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずはMainルールを上記のようにそのまま記述している場合で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-instant.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では出力ファイルlist.txtを確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
0.dataが含まれませんでした。&amp;lt;br&amp;gt;&lt;br /&gt;
これはTouch0とCreateListが同時に動き、Touch0が完了する前にCreateListが実行されているため、作成された0.dataがCreateListの入力ファイルとして登録されなかったからです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、チケットの機能を使ってMainルールを下記のようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.data'.all&lt;br /&gt;
	output 'list.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T&amp;gt;&lt;br /&gt;
	rule &amp;lt;T&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のようにチケット名は&amp;lt;&amp;gt;で囲んで、ルールとチケット間を==&amp;gt;で繋いで使用します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
チケット名を省略したい場合は下記のように記述します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 &amp;gt;&amp;gt;&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記のように連続させることも可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule First &amp;gt;&amp;gt;&amp;gt; Second &amp;gt;&amp;gt;&amp;gt; Third&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また複数チケットの発行もできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; (&amp;lt;T1&amp;gt;|&amp;lt;T2&amp;gt;)&lt;br /&gt;
	rule &amp;lt;T1&amp;gt; ==&amp;gt; CreateList&lt;br /&gt;
	rule &amp;lt;T2&amp;gt; ==&amp;gt; CreateList2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
逆に複数チケットからのルール実行も可能です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Touch0 ==&amp;gt; &amp;lt;T0&amp;gt;&lt;br /&gt;
	rule Touch1 ==&amp;gt; &amp;lt;T1&amp;gt;&lt;br /&gt;
	rule (&amp;lt;T0&amp;gt;|&amp;lt;T1&amp;gt;) ==&amp;gt; CreateList&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合はチケットT0かつT1が発行されてからCreateListが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic12$ pione-client CreateList-ticket.pione -i input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	sleep 1&lt;br /&gt;
   SH 	touch 0.data&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Touch0([],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	ls *.data &amp;gt; list.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:CreateList([1.data,2.data,0.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([1.data,2.data],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,1.data,2.data],{})&lt;br /&gt;
/Basic12$ cat process/output/list.txt &lt;br /&gt;
0.data&lt;br /&gt;
1.data&lt;br /&gt;
2.data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今度は0.dataが含まれるようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１３（orの使用例） ===&lt;br /&gt;
inputやoutputで宣言するときにorや|で繋ぐと、指定した複数種類のファイルからいずれかを入力や出力に使用することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
以下で使用するファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic13 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 入力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt' or '2.txt' or '3.txt'&lt;br /&gt;
	output 'out.txt'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[1]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記では入力ファイルに1.txt, 2.txt, 3.txtのいずれかがあればout.txtにコピーする処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば2.txtだけあった場合でも実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client test.pione -i ./input/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	cp 2.txt out.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([2.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,2.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の使用例は入力ファイルが１つだけあった場合のみに対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
複数のファイルがあった場合、複数ファイルで上書きコピーされてしまいます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 出力ファイルでの使用例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $Mode := 1&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output 'out1.txt' or 'out2.txt' or 'err.txt'&lt;br /&gt;
Action&lt;br /&gt;
	if [ {$Mode} -eq 1 ] ; then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(1)}&lt;br /&gt;
	elif [ {$Mode} -eq 2 ] ;then&lt;br /&gt;
		echo &amp;quot;Mode: {$Mode}&amp;quot; &amp;gt; {$O[1].nth(2)}&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Error: Mode {$Mode} is not Supported!&amp;quot; &amp;gt; {$O[1].nth(3)}&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはパラメータModeが1のときはout1.txtを作成し、2のときはout2.txtを作成し、それ以外についてはエラーを残す処理となっています。&amp;lt;br&amp;gt;&lt;br /&gt;
out1.txt, out2.txt, err.txtのいずれかが出力されることで処理が完了しますので、状況に応じて作成するファイルを変えたいときに有効です。&amp;lt;br&amp;gt;&lt;br /&gt;
.nth()は引数で指定した要素を取り出すシーケンスのメソッドです。（参照：[[PIONEの式#シーケンス]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルト（Mode=1）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 1 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 1 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 1&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 1 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
/Basic13$ cat process/output/out1.txt &lt;br /&gt;
Mode: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
out1.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode=0で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic13$ pione-client OutputOr.pione --params={Mode:0}&lt;br /&gt;
&amp;quot;{Mode:0}&amp;quot;&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	if [ 0 -eq 1 ] ; then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out1.txt&lt;br /&gt;
   SH 	elif [ 0 -eq 2 ] ;then&lt;br /&gt;
   SH 		echo &amp;quot;Mode: 0&amp;quot; &amp;gt; out2.txt&lt;br /&gt;
   SH 	else&lt;br /&gt;
   SH 		echo &amp;quot;Error: Mode 0 is not Supported!&amp;quot; &amp;gt; err.txt&lt;br /&gt;
   SH 	fi&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([],{})&lt;br /&gt;
/Basic13$ cat process/output/err.txt &lt;br /&gt;
Error: Mode 0 is not Supported!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
err.txtが作成されて完了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１４（例外） ===&lt;br /&gt;
[[PIONE]]でも入出力ファイルにワイルドカード*を使用して全ての該当ファイルを対象とできますが、exceptを使用することにより対象外とするファイルを指定できます。メソッドexcept, exceptionsについては[[PIONEの式#データ表現型]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1])&lt;br /&gt;
Flow&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data1&amp;quot;, line:1}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data2&amp;quot;, line:2}&lt;br /&gt;
	rule GetLine {filename:&amp;quot;Data3&amp;quot;, line:3}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule GetLine&lt;br /&gt;
	input 'AllData.txt'&lt;br /&gt;
	output '{$filename}.txt'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $line&lt;br /&gt;
Action&lt;br /&gt;
	head -{$line} {$I[1]} | tail -1 &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記はAllData.txtから1, 2, 3行目を指定した.txtファイルに出力する処理です。出力ファイルは全ての.txtとしていますが、exceptによってAllData.txtを対象外としています。対象外としていない場合はAllData.txtが出力ファイルの条件を満たしていますので、発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic14 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllData.txtを下記の内容として実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABC&lt;br /&gt;
DEF&lt;br /&gt;
GHI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      --&amp;gt; Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -1 AllData.txt | tail -1 &amp;gt; Data1.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
            &amp;gt;&amp;gt;&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data1&amp;quot;),line:(&amp;lt;i&amp;gt;1)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -2 AllData.txt | tail -1 &amp;gt; Data2.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data2&amp;quot;),line:(&amp;lt;i&amp;gt;2)})&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
   SH 	head -3 AllData.txt | tail -1 &amp;gt; Data3.txt&lt;br /&gt;
   SH ------------------------------------------------------------&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:GetLine([AllData.txt],{filename:(&amp;lt;s&amp;gt;&amp;quot;Data3&amp;quot;),line:(&amp;lt;i&amp;gt;3)})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
      &amp;lt;-- Distribution: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Main([AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
/Basic14$ cat process/output/Data1.txt &lt;br /&gt;
ABC&lt;br /&gt;
/Basic14$ cat process/output/Data2.txt &lt;br /&gt;
DEF&lt;br /&gt;
/Basic14$ cat process/output/Data3.txt &lt;br /&gt;
GHI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1, 2, 3行目の内容がそれぞれのファイルに出力されました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.except($I[1])を除いた場合は発火しません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Basic14$ pione-client DivideText.pione -i DivideTextInput/&lt;br /&gt;
  ==&amp;gt; &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    --&amp;gt; Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
    &amp;lt;-- Rule Application: &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
  &amp;lt;== &amp;amp;Anonymous:Root([.DS_Store,AllData.txt],{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、exceptionsを使用すると設定している例外をリストで得ることができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '1.txt'&lt;br /&gt;
	input '2.txt'&lt;br /&gt;
	input '3.txt'&lt;br /&gt;
	output '*.txt'.all.except($I[1] or $I[2] or $I[3])&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$O[1].exceptions()}&lt;br /&gt;
	do&lt;br /&gt;
		cat $data &amp;gt;&amp;gt; AllData.txt&lt;br /&gt;
		wc $data &amp;gt;&amp;gt; AllInfo.txt&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例ではoutputに例外が$I[1] or $I[2] or $I[3]と設定されているので、{$O[1].exceptions()}では1.txt 2.txt 3.txtのリストとして得られるので、for文がこれらのファイルによって回ることになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１５（ループ文３） ===&lt;br /&gt;
[[#基本１０（ループ文）]]、[[#基本１１（ループ文２）]]にてループ文を記述する方法を示しました。しかし、いずれも多くのルールを入れ子で呼ぶことになり、ループ数が多くなると入出力ファイルの引き継ぎも多くなり時間が掛かってしまいます。今回は一つのルールから全てのルールを呼び出すようにしてループを行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下記の整数型メソッドuptoを使用すると、１つのルールからパラメータを一気に設定して各々の値でルールを実行することができます。uptoは引数の値まで１ずつ加算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $min := 0&lt;br /&gt;
param $max := 64&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Test {val: $min.upto($max)}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Test&lt;br /&gt;
	output '{$val}.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
またdowntoを使用する方法もあります。uptoは引数の値まで１ずつ減算しながら整数を返すメソッドです。（参照：[[PIONEの式#整数型(integer)]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	rule Test {val: $max.downto($min)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uptoを利用すると、[[#基本１０（ループ文）]]は下記のようになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto(($maxval - $minval)/$dval)))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule EvenOdd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	if $val % 2 == 0&lt;br /&gt;
		rule Even {val: $val}&lt;br /&gt;
	else&lt;br /&gt;
		rule Odd {val: $val}&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Even&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is even.&amp;quot; &amp;gt;&amp;gt; Even{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Odd&lt;br /&gt;
	output '*.txt'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$val} is odd.&amp;quot; &amp;gt;&amp;gt; Odd{$val}.txt;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic15 こちら]からダウンロードできます。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
valに設定する式が複雑な場合は下記のように一旦、[[変数束縛]]で計算したものを利用する方法もあります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $maxval := 456&lt;br /&gt;
param $minval := 123&lt;br /&gt;
param $dval := 37&lt;br /&gt;
$loop := ($maxval - $minval)/$dval&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.txt'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule EvenOdd {val: $minval + ($dval * (0.upto($loop))}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-以下略-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の場合は変数loopにパラメータから計算したループ数を設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 基本１６（ランダム） ===&lt;br /&gt;
メソッドrandomを使用するとランダムに選んだファイルを出力することができます。（現v0.5.0では未実装）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.txt'&lt;br /&gt;
	output '*.out'.all.random&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$I[1]} | awk '{print $1}')&lt;br /&gt;
	for (( i=1; i&amp;lt;${max}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		head -${i} {$I[1]} | tail -1 &amp;gt; {$I[1][1]}-{$i}.out&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記の例では入力.txtファイルからランダムに選んだ行数を.outファイルとして出力します。このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Basic16 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 応用 ==&lt;br /&gt;
さて、ここまでの基本を組み合わせて、[[Eosのコマンド]]を使用する問題を考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用１（フローの制御）===&lt;br /&gt;
==== 問題１ ====&lt;br /&gt;
&amp;lt;div&amp;gt;*.mrc（[[mrcImage]]）と*.prametersで指定される入力ファイルがあります。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;それぞれの*.mrcファイルから最大値を中心として切り出した*.roiを出力するCenterGet.pioneを考えてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
但し、*.parametersは以下のフォーマットで切り出しサイズ(Sx, Sy, Sz)を格納しているファイルとします。&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;*.parametersのフォーマット&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sx Sy Sz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題１：上記のCenterGet.pioneを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule First&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1]}.info'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageInfo -I -i {$I[1]} \&lt;br /&gt;
	| head -2 | tail -1 \&lt;br /&gt;
	| awk '{printf(&amp;quot;%s %s %s&amp;quot;, $3, $4, $5)}' \&lt;br /&gt;
	| tr -c '[0-9]' ' ' \&lt;br /&gt;
	&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Second&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1]}.info'&lt;br /&gt;
	input '{$I[1][1]}.parameters'&lt;br /&gt;
	output '{$I[1][1]}.roi'&lt;br /&gt;
Action&lt;br /&gt;
	Center_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[2]})&lt;br /&gt;
	Center_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[2]})&lt;br /&gt;
	Center_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[2]})&lt;br /&gt;
	N_x=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $1)}' {$I[3]})&lt;br /&gt;
	N_y=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $2)}' {$I[3]})&lt;br /&gt;
	N_z=$(awk '{printf(&amp;quot;%s\n&amp;quot;, $3)}' {$I[3]})&lt;br /&gt;
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \&lt;br /&gt;
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \&lt;br /&gt;
		-Nx $N_x -Ny $N_y -Nz $N_z&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主に[[mrcImageCenterGet]]を用いて切り出しを行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Main: .mrcファイルについてFirst, Secondの処理を行います。&lt;br /&gt;
First: .mrcファイルの最大値の座標を得て、.mrc.infoファイルに格納します。&lt;br /&gt;
Second: .mrcから.mrc.infoの座標を中心に.parametersのサイズで切り出しを行います。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
入力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Media:1VOM.mrc|mrcファイル1]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (23, 55, 41)&lt;br /&gt;
Mean:          72.129&lt;br /&gt;
SD:          294.805&lt;br /&gt;
SE:         0.368507&lt;br /&gt;
Sum:     4.61626e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (23, 55, 41)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Media:Input-1VOM-N.mrc|mrcファイル2]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM-N.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Min:        -2390.42 (77, 14, 69)&lt;br /&gt;
Max:         4374.62 (17, 62, 46)&lt;br /&gt;
Mean:         72.1487&lt;br /&gt;
SD:           577.82&lt;br /&gt;
SE:         0.722275&lt;br /&gt;
Sum:     4.61752e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値の座標: (17, 62, 46)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parametersファイル1, 2の両方を下記に設定して実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
40 40 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
コマンド&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pione-client CenterGet.pione -i CenterGetInput/ -b CenterGet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
実行結果&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roi, 1VOM-N.roiのファイルが出力されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[mrcImageInfo]]を使って、最大値の座標が中心になっているか確認してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM.roi&lt;br /&gt;
Min:               0 (0, 0, 0)&lt;br /&gt;
Max:         3398.12 (19, 19, 24)&lt;br /&gt;
Mean:         241.805&lt;br /&gt;
SD:          500.988&lt;br /&gt;
SE:          1.77126&lt;br /&gt;
Sum:     1.93444e+07&lt;br /&gt;
/Advanced1$ mrcImageInfo -I -i CenterGet/output/1VOM-N.roi&lt;br /&gt;
Min:         -1893.8 (0, 4, 33)&lt;br /&gt;
Max:         4374.62 (19, 19, 24)&lt;br /&gt;
Mean:          157.55&lt;br /&gt;
SD:          648.124&lt;br /&gt;
SE:          2.29147&lt;br /&gt;
Sum:      1.2604e+07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
最大値を中心に切り出していることが分かります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(ファイルの確認用コマンド) ====&lt;br /&gt;
出力したファイルと入力ファイルの違いを見るために後処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-中略-&lt;br /&gt;
&lt;br /&gt;
Rule Final&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
	output '{$I[1]}-1.tiff'&lt;br /&gt;
	output '{$I[2]}-1.tiff'&lt;br /&gt;
	output '{$I[1]}-2.tiff'&lt;br /&gt;
	output '{$I[2]}-2.tiff'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}&lt;br /&gt;
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}&lt;br /&gt;
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1&lt;br /&gt;
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これにより入力ファイル(mrc), 出力ファイル(roi)についてxy平面とyz平面へ投影した画像をtiffファイルで出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
roiファイル1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roiファイル2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
後処理をしたくないときはMainのoutputとFlow内をコメントアウトするだけです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
#	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
#	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足(デフォルトサイズの設定) ====&lt;br /&gt;
.parametersなどのファイルがない場合にパラメータ入力で設定したい場合の前処理を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成例&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Basic Param&lt;br /&gt;
	$Nx := 40&lt;br /&gt;
	$Ny := 40&lt;br /&gt;
	$Nz := 50&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.mrc'.all&lt;br /&gt;
	input '*.parameters'&lt;br /&gt;
	output '*.roi'&lt;br /&gt;
	output '*.tiff'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Initial&lt;br /&gt;
	rule First&lt;br /&gt;
	rule Second&lt;br /&gt;
	rule Final&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Initial&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '{$I[1][1]}.parameters'&lt;br /&gt;
Action&lt;br /&gt;
	echo &amp;quot;{$Nx} {$Ny} {$Nz}&amp;quot; &amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
-後略-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このようにすると、.parametersがない場合にはオプション--paramsまたはデフォルト値(40, 40, 50)によってサイズを設定することができます。但し、入力ファイルに.parametersが１つもない場合は動きません。その場合はtouchなどを使用して.parameterを１つは用意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM.parametersのみ下記のように設定してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
64 64 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nx=80のみをパラメータとしてコマンド入力してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Advanced1$ pione-client CenterGet.pione -i ${EOS_HOME}/tutorial/SampleData/ -b CenterGet --params=&amp;quot;{Nx:80}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
出力ファイル&amp;lt;br&amp;gt;&lt;br /&gt;
1VOM.roiはファイルに従ったサイズになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1VOM-N.roiはNxがコマンドの引数、Ny, Nzはデフォルト値のパラメータによるサイズになります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Outdata1-PIONE-Advanced1-4.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
			yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用２（ウェブページでパラメータを設定しながらコマンドを実行）===&lt;br /&gt;
　次は[[#基本８（インタラクティブ操作）]]のようにウェブページの操作を行い、[[Eosのコマンド]]を実行する処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題２ ====&lt;br /&gt;
2Dファイル([[mrcImage]])を入力ファイルとし、ローパスフィルタ([[mrcImageLowPassFilter]])をウェブページの操作によって実行する次のコマンドを考えます。&lt;br /&gt;
*入力ファイルはファイル選択画面から自由に選べるようにし、オプションの値も画面操作で設定できるようにします。&lt;br /&gt;
*コマンド実行後は入力ファイルと出力ファイルの画像ファイルをそれぞれ表示して比較できるようにします。&lt;br /&gt;
*この画面を見ながら再設定するか、終了するかを選び、終了後に最後の変換ファイルを出力ファイルとして得られるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題２：上記の機能を持つパッケージLowPassFilter.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
[[PIONE定義書]]、[[html]]ファイル、[[cgi]]ファイルをそれぞれ作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
メイン(Main.pione)の処理を定義します。今回は設定のほとんどをウェブページに委ねるのでここでは出力ファイル名のみ定義しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.lpf'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インタラクティブ(Interaction.pione)の処理を定義します。このファイルは再利用できるように拡張子が付いた全てのファイルを呼び出し元に出力できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ用のアノテーション(Annotation.pione)を定義します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;LowPassFilter&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
Index.htmlはコマンド選択画面にしています。ここから実行したいコマンドを選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;mrcImageLowPassFilter&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mrcImageLowPassFilter.htmlでコマンドや入力ファイルなどのオプションを設定できるようにします。開始ボタンでmrcImageLowPassFilterが実行されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;mrcImageLowPassFilter.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(-i)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;OutputFile&amp;quot; value=&amp;quot;outdata.lpf&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						出力ファイル名(-o)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;HalfValuePoint&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						HalfValuePoint[A-1] (強度を半分に落とす空間周波数を示す)(-hvp)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Width&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						空間周波数のcos関数の幅を設定(-w)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1: ステップフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2: cosフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;3: expフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;4: ガウシアンフィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;5&amp;quot;&amp;gt;5: ローレンツ型フィルタ&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						モード(-m)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
mrcImageLowPassFilter.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;mrcImageLowPassFilter&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### Close or Back&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;Close&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;a href=&amp;quot;mrcImageLowPassFilter.html&amp;quot;&amp;gt;Back&amp;lt;/a&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strOutputFile = cgi['OutputFile']&lt;br /&gt;
strHalfValuePoint = cgi['HalfValuePoint']&lt;br /&gt;
strWecth = cgi['Width']&lt;br /&gt;
strMode = cgi['Mode']&lt;br /&gt;
&lt;br /&gt;
### mrcImageLowPassFilter&lt;br /&gt;
command = &amp;quot;mrcImageLowPassFilter&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -hvp &amp;quot;' + strHalfValuePoint + '&amp;quot;'&lt;br /&gt;
command += ' -w &amp;quot;' + strWecth + '&amp;quot;'&lt;br /&gt;
command += ' -m &amp;quot;' + strMode + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrc2gif&lt;br /&gt;
#### For input&lt;br /&gt;
strGifInputFile = strInputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strGifOutputFile = strOutputFile + &amp;quot;.gif&amp;quot;&lt;br /&gt;
command = &amp;quot;mrc2gif&amp;quot;&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strGifOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
### mrcImageInfo&lt;br /&gt;
#### For input&lt;br /&gt;
strInfoInputFile = strInputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strInputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoInputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
#### For output&lt;br /&gt;
strInfoOutputFile = strOutputFile + &amp;quot;.info&amp;quot;&lt;br /&gt;
command = &amp;quot;mrcImageInfo&amp;quot;&lt;br /&gt;
command += ' -I'&lt;br /&gt;
command += ' -i &amp;quot;' + strOutputFile + '&amp;quot;'&lt;br /&gt;
command += ' -o &amp;quot;' + strInfoOutputFile + '&amp;quot;'&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
&lt;br /&gt;
### Table&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Title&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strInputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot; + strOutputFile + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### GifImage&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifInputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += '&amp;lt;img src=&amp;quot;' + strGifOutputFile + '&amp;quot;&amp;gt;'&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### mrcImageInfo&lt;br /&gt;
##### For Input&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoInputFile = open(strInfoInputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoInputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoInputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
##### For Output&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
fpInfoOutputFile = open(strInfoOutputFile, &amp;quot;r&amp;quot;)&lt;br /&gt;
fpInfoOutputFile.each do |line|&lt;br /&gt;
	HTMLstr += line + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
fpInfoOutputFile.close&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
htmlヘッダなどの書き込み、クエリを変数やファイルに変換、[[Eosのコマンド]]実行、実行結果をhtml化の順に記述しています。このコードでは[[mrcImageLowPassFilter]]の結果を[[gif]]画像と[[mrcImageInfo]](-I)の情報を表示して比較できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced2 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced2&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced2/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/LowPassFilter(Kinoshita)+v0.1.0.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでmrcImageLowPassFilterを選択すると設定画面が表示されます。ここでは入力ファイルや設定を変更しながらコマンドの実行を試すことができます。終了やCloseを選択すると、最後に処理を行った結果で出力ファイルが残ります。また、出力ファイル名を変更すると複数のファイルを残すことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Input-1VOM-N-2D.mrc|入力ファイル]](2D)&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;[[画像:Input-1VOM-N-2D.png]]&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;-18651.7 (10, 1, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				52942.7 (24, 39, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				7214.87&amp;lt;br&amp;gt; &lt;br /&gt;
				10067.6&amp;lt;br&amp;gt; &lt;br /&gt;
				125.845&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-1.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-2.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;実行例3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata1-PIONE-Advanced2-3.png|border]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
終了後にResult Filesからファイルをダウンロードすると、outputディレクトリにて最後に変換した.lpfファイルを得ることができます。あるいはこの[[PIONE定義書]]に処理を追加して、作成した.lpfファイルを入力ファイルとして使用することもできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  補足（不要ファイルの削除） ====&lt;br /&gt;
今回の処理は操作によって自由にファイルが作成できます。しかし、中には不要なファイルも出てくる場合もあります。そこで、補足処理としてサーバ上のファイルリストを表示し、不要ファイルを削除できるようにしてみましょう。新しく下記のファイルを追加します。なお、pione-action=...については[[インタラクションAPI]]に詳細を記載しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/FileDelete.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;FileDelete.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			削除ファイル名&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;DeleteFile&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		ファイルリスト&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-1.11.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;textDiv&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
			var div = document.getElementById(&amp;quot;textDiv&amp;quot;);&lt;br /&gt;
			div.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			$.getJSON(&amp;quot;./&amp;quot;, {&amp;quot;pione-action&amp;quot;: &amp;quot;list&amp;quot;}, function(data){&lt;br /&gt;
				$.each(data, function() {&lt;br /&gt;
					strOut = &amp;quot;.lpf&amp;quot;&lt;br /&gt;
					if( this.name.indexOf(strOut) + strOut.length == this.name.length ){&lt;br /&gt;
						div.textContent += this.name +&amp;quot;\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ファイルリストではpione-action=listによって得たファイルリストの中から最後が.lpfで終わるファイルのみを出力するようにしています。このリストを見ながら削除するファイルをテキストボックスに書き込んで、削除ボタンを押すと削除処理(FileDelete.cgi)が行われます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/bin/FileDelete.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
HTMLstr = &amp;quot;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;title&amp;gt;FileDelete&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
strDeleteFile = cgi['DeleteFile']&lt;br /&gt;
&lt;br /&gt;
## View as HTML Statement&lt;br /&gt;
HTMLstr += '&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;URL=./' + strDeleteFile + '?pione-action=delete&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
HTMLstr += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	HTMLstr&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ヘッダにてDeleteFileを削除する操作(pione-action=delete)を行っています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
さらに出来上がったページへアクセスするためにindex.htmlのbody内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;FileDelete.html&amp;quot;&amp;gt;FileDelete&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これにより不要ファイルの削除を行うことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例ではOutdata.lpfを削除しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-5.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
削除完了画面が表示されるので、ブラウザのバックボタンで戻ります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced2-6.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
画面表示を更新するとOutdata.lpfが消えていることが確認できます。また、インタラクティブ操作を終了し、ファイルをダウンロードするとOudata.lpfが無いことも確認できます。これにより不要ファイルを削除できたことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用３（参照像の作成） ===&lt;br /&gt;
　今回はループ文を使用した例を示します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題３ ====&lt;br /&gt;
　入力ファイルを参照用の３次元画像（.ref3d）として、指定した範囲の角度で参照像（.ref2d）を作成する処理を考えます。[[PIONE Webclient]]を利用し、作成した各参照像の画像を確認しながら、ユーザ操作によって適切な角度を決定できるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題３：上記の機能を持つパッケージRef3DtoRef2D.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例 ====&lt;br /&gt;
===== [[PIONE定義書]] =====&lt;br /&gt;
　ユーザ操作によって３次元画像と投影する角度を設定し、そこから参照像を作成して、結果を画像として確認し、決定かやり直しかを選択できる流れとしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotation.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.@ PackageName	:: &amp;quot;Ref3DtoRef2D&amp;quot;&lt;br /&gt;
.@ Editor		:: &amp;quot;Kinoshita&amp;quot;&lt;br /&gt;
.@ Tag			:: &amp;quot;v0.2.0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start&lt;br /&gt;
	rule SubMain&lt;br /&gt;
	rule Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SubMainルールにて角度と３次元画像の設定とその２次元画像の作成を実行します。このルールはStartN!Flagで発火し、最初はStartルールで、やり直すときはResultルールでそれぞれStartN!Flagを作成します。このときのNはやり直しのために設定した整数で、前に作成されたファイルとこれから作成するファイルが混ざらないようにするために設定しています。ルールFinishで決定したときのファイルのみを取り出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interaction.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Interaction&lt;br /&gt;
	input 'Start{$val}!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/* public&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	for file in $(ls *Mode *Rot1 *Rot2 *Rot3 *.ref3d) ;&lt;br /&gt;
	do&lt;br /&gt;
		mv &amp;quot;$file&amp;quot; &amp;quot;$file-{$val}&amp;quot;;&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
やり直しに対応できるように処理の最後で作成されたファイルに番号を付けています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Ref3DtoRef2D&lt;br /&gt;
	input '*!*!*.!Rot1-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot2-{$val}'&lt;br /&gt;
	input '*!*!*.!Rot3-{$val}'&lt;br /&gt;
	input '*.!Mode-{$val}'&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	$min1 := '{$I[1][1]}'.str().f()&lt;br /&gt;
	$max1 := '{$I[1][2]}'.str().f()&lt;br /&gt;
	$delta1 := '{$I[1][3]}'.str().f()&lt;br /&gt;
	$loop1 := (($max1 - $min1) / $delta1).i()&lt;br /&gt;
	$min2 := '{$I[2][1]}'.str().f()&lt;br /&gt;
	$max2 := '{$I[2][2]}'.str().f()&lt;br /&gt;
	$delta2 := '{$I[2][3]}'.str().f()&lt;br /&gt;
	$loop2 := (($max2 - $min2) / $delta2).i()&lt;br /&gt;
	$min3 := '{$I[3][1]}'.str().f()&lt;br /&gt;
	$max3 := '{$I[3][2]}'.str().f()&lt;br /&gt;
	$delta3 := '{$I[3][3]}'.str().f()&lt;br /&gt;
	$loop3 := (($max3 - $min3) / $delta3).i()&lt;br /&gt;
	$mode := '{$I[4][1]}'.str()&lt;br /&gt;
	param $val&lt;br /&gt;
Flow&lt;br /&gt;
	rule One3Dto2D {rot1: $min1 + ((0.upto($loop1)).f() * $delta1), rot2: $min2 + ((0.upto($loop2)).f() * $delta2), rot3: $min3 + ((0.upto($loop3)).f() * $delta3), mode : $mode, val : $val}&lt;br /&gt;
	rule Info3Dto2D {val : $val}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Info3Dto2D&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	for file in $(ls *.ref2d-{$val})&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;./$file&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule One3Dto2D&lt;br /&gt;
	input '*.ref3d-{$val}'&lt;br /&gt;
	output '*.ref2d-{$val}'.all&lt;br /&gt;
	param $rot1&lt;br /&gt;
	param $rot2&lt;br /&gt;
	param $rot3&lt;br /&gt;
	param $mode&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	output=&amp;quot;{$I[1][1]}-{$mode}-{$rot1}-{$rot2}-{$rot3}.ref2d-{$val}&amp;quot;&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o $output \&lt;br /&gt;
				-Rot1 {$rot1} {$rot1} 1 \&lt;br /&gt;
				-Rot2 {$rot2} {$rot2} 1 \&lt;br /&gt;
				-Rot3 {$rot3} {$rot3} 1 \&lt;br /&gt;
				-EulerMode {$mode};&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールRef3DtoRef2Dは大きくFlowLoop3Dto2D1とOne3Dto2Dの２つのルールに分かれます。ここでもやり直しに対応するためにファイルの末尾に番号を付けます。ルールInfo3Dto2Dでは画像作成のために２次元画像の一覧を作成します。ルールOne3Dto2D1ではuptoによるループを利用して３次元画像から[[mrc3Dto2D]]によって２次元画像を次々に作成します。このとき３軸毎に回転角度をそれぞれuptoで設定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Result&lt;br /&gt;
	input 'Ref3DtoRef2D.info-*'&lt;br /&gt;
	input '*.ref2d-{$I[1][1]}'.all&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$I[1][1]}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$I[1][1]}'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Ref2DtoGIF {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
	rule ResultCheck {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Ref2DtoGIF&lt;br /&gt;
	input 'Ref3DtoRef2D.info-{$val}'&lt;br /&gt;
	input '*.ref2d-{$val}'.all&lt;br /&gt;
	output 'Ref3DtoRef2D.mon-{$val}'&lt;br /&gt;
	output 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageMontageCreate -i {$I[1]} -o {$O[1]}&lt;br /&gt;
	mrc2gif -i {$O[1]} -o {$O[2]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule ResultCheck&lt;br /&gt;
	input 'Ref3DtoRef2D.gif-{$val}'&lt;br /&gt;
	output '*!Flag'&lt;br /&gt;
	param $val&lt;br /&gt;
Action&lt;br /&gt;
	# build public directory for pione-interactive&lt;br /&gt;
	mkdir public&lt;br /&gt;
	cp etc/index2.html public/index.html&lt;br /&gt;
	cp bin/* public&lt;br /&gt;
	cp {$I[1]} public/Ref3DtoRef2D.gif&lt;br /&gt;
&lt;br /&gt;
	# start interactive operation&lt;br /&gt;
	pione-interactive browser --public public&lt;br /&gt;
&lt;br /&gt;
	cp public/* .&lt;br /&gt;
	if [ -e &amp;quot;Finish!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Finish!Flag&amp;quot; &amp;quot;Finish{$val}!Flag&amp;quot;;&lt;br /&gt;
	elif [ -e &amp;quot;Start!Flag&amp;quot; ]; then&lt;br /&gt;
		mv &amp;quot;Start!Flag&amp;quot; &amp;quot;Start{$val + 1}!Flag&amp;quot;;&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ルールResultはRef2DtoGIFとResultCheckに分かれます。ルールRef2DtoGIFでは各２次元像をひとまとめにしたgif画像を作成します。ルールResultCheckではgif画像をindex2.htmlのページに表示して、ユーザ操作にて決定のときはFinishN!Flagをやり直しのときはStartN!Flagを作成するようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[html]]ファイル =====&lt;br /&gt;
index.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;Ref3DtoRef2D.html&amp;quot;&amp;gt;Ref3DtoRef2D&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ref3DtoRef2D.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Ref3DtoRef2D.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;開始&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;InputFile&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						入力ファイル名(.ref3d)&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode1&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;X&amp;quot;&amp;gt;X&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Z&amp;quot;&amp;gt;Z&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode2&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;O&amp;quot;&amp;gt;O&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;E&amp;quot;&amp;gt;E&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode3&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;Y&amp;quot;&amp;gt;Y&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;N&amp;quot;&amp;gt;N&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
						&amp;lt;select name=&amp;quot;Mode4&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;S&amp;quot;&amp;gt;S&amp;lt;/option&amp;gt;&lt;br /&gt;
							&amp;lt;option value=&amp;quot;R&amp;quot;&amp;gt;R&amp;lt;/option&amp;gt;&lt;br /&gt;
						&amp;lt;/select&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						回転モード&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
			&amp;lt;table&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最小値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						最大値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						加算値&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度１&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin1&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax1&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta1&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度２&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin2&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax2&amp;quot; value=&amp;quot;359&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta2&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
				&amp;lt;tr&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						角度３&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMin3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotMax3&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
					&amp;lt;td&amp;gt;&lt;br /&gt;
						&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;RotDelta3&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt;&lt;br /&gt;
					&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;/tr&amp;gt;&lt;br /&gt;
			&amp;lt;/table&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;戻る&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;a href=&amp;quot;?pione-action=finish&amp;quot;&amp;gt;終了&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
このページでは入力ファイルと回転モードと及び各角度毎の最小値、最大値、加算値を設定して実行できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
index2.html&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;InteractiveCommand Index Page&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;img src=&amp;quot;Ref3DtoRef2D.gif&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;決定&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Finish&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;form action=&amp;quot;Result.cgi&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;やり直し&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
			&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;Result&amp;quot; value=&amp;quot;Start&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/form&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
これはルールResultのときに画像を確認しながら、決定かやり直しかを選択するためのページです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== [[cgi]]ファイル =====&lt;br /&gt;
Ref3DtoRef2D.cgi&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Ref3DtoRef2D&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
&lt;br /&gt;
### Copy InputFile&lt;br /&gt;
fpQueryInputFile = cgi.params['InputFile'][0]&lt;br /&gt;
strInputFile = fpQueryInputFile.original_filename&lt;br /&gt;
fpInputFile = open(strInputFile, &amp;quot;wb&amp;quot;)&lt;br /&gt;
fpInputFile.write(fpQueryInputFile.read)&lt;br /&gt;
fpInputFile.close&lt;br /&gt;
&lt;br /&gt;
### Other Query&lt;br /&gt;
strMode = cgi['Mode1'] + cgi['Mode2'] + cgi['Mode3'] + cgi['Mode4']&lt;br /&gt;
strRotMin1 = cgi['RotMin1']&lt;br /&gt;
strRotMax1 = cgi['RotMax1']&lt;br /&gt;
strRotDelta1 = cgi['RotDelta1']&lt;br /&gt;
strRotMin2 = cgi['RotMin2']&lt;br /&gt;
strRotMax2 = cgi['RotMax2']&lt;br /&gt;
strRotDelta2 = cgi['RotDelta2']&lt;br /&gt;
strRotMin3 = cgi['RotMin3']&lt;br /&gt;
strRotMax3 = cgi['RotMax3']&lt;br /&gt;
strRotDelta3 = cgi['RotDelta3']&lt;br /&gt;
&lt;br /&gt;
### Set Parameter to FileNames&lt;br /&gt;
strParamFile = strMode + &amp;quot;.!Mode&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin1 + &amp;quot;!&amp;quot; + strRotMax1 + &amp;quot;!&amp;quot; + strRotDelta1 + &amp;quot;.!Rot1&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin2 + &amp;quot;!&amp;quot; + strRotMax2 + &amp;quot;!&amp;quot; + strRotDelta2 + &amp;quot;.!Rot2&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strParamFile = strRotMin3 + &amp;quot;!&amp;quot; + strRotMax3 + &amp;quot;!&amp;quot; + strRotDelta3 + &amp;quot;.!Rot3&amp;quot;&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + strParamFile&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;cp &amp;quot; + strInputFile + &amp;quot; Refer.ref3d&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ref3DtoRef2D.htmlで設定したデータをファイルに保存します。処理後は自動的にインタラクティブ操作を終了し、以降は[[PIONE]]にてルールRef3DtoRef2Dを実行します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
&lt;br /&gt;
require 'cgi'&lt;br /&gt;
&lt;br /&gt;
cgi = CGI.new&lt;br /&gt;
&lt;br /&gt;
### Header&lt;br /&gt;
strHTML = &amp;quot;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;title&amp;gt;Result&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
### Auto Close&lt;br /&gt;
strHTML += '&amp;lt;meta http-equiv=&amp;quot;REFRESH&amp;quot; content=&amp;quot;0;URL=?pione-action=finish&amp;quot;&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Main Process&lt;br /&gt;
## Query to Parameters&lt;br /&gt;
Result = cgi['Result']&lt;br /&gt;
&lt;br /&gt;
command = &amp;quot;touch &amp;quot; + Result + &amp;quot;!Flag&amp;quot;&lt;br /&gt;
system(command)&lt;br /&gt;
&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
strHTML += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Output as html&lt;br /&gt;
cgi.out(type: &amp;quot;text/html&amp;quot;) do&lt;br /&gt;
	strHTML&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
index2.htmlの操作によって、決定またはやり直しを選択したときの処理です。決定のときはFinish!Flag、やり直しのときはStart!FLagを作成します。処理後は自動的にインタラクティブ操作を終了します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[パッケージ作成]] ====&lt;br /&gt;
コードが完成したら[[パッケージ作成]]を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/PIONE$ pione package build Advanced3&lt;br /&gt;
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Advanced3/pione-package.json&lt;br /&gt;
info: Package local:/Eos/tutorial/SampleCode/PIONE/Ref3DtoRef2D(Kinoshita)+v0.1.1.ppg has been built successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 実行結果 ====&lt;br /&gt;
では、動作させてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
[[PIONE Webclient]]のジョブページで実行し、Interactionを選択してindexページを開きます。ここでRef3DtoRef2Dを選択すると設定画面が表示されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回は[[Media:1VOM.mrc|下記の入力ファイル]]を３次元像として２次元画像を作成してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-1.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
入力ファイル及び回転のモード（参照: [[オイラー角]]）、角度の範囲を設定して開始ボタンを押します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
すると、上記のようにインタラクティブ操作は完了して、再び[[PIONE]]にて２次元像の作成処理が動きます。（このページは閉じて構いません）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-3.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
再びInteractionボタンが赤色になりますので、開くと作成された２次元像の一覧が画像にて表示されます。この内容を見ながら「決定」か「やり直し」を選択します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-2.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
同様にインタラクティブ操作が完了しますので、ページを閉じます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-4.png|border]]&amp;lt;br&amp;gt;&lt;br /&gt;
「やり直し」を選択すると、再度設定画面を開くことができます。また、「決定」を選択するとこのときの結果がouputへ出力されます。このようにして結果を確認しながら適切な設定を選び直すことが出来ます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の設定で決定したときのgif画像（縮小表示）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced3-5.gif|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 補足（チケットを使ってルールを制御する） ====&lt;br /&gt;
設定、処理、確認のルールが同時に動いてはそれぞれの役割が満たせませんので、チケットを使用して制御を加えてみましょう。もちろん入力ファイルや出力ファイルの関係がうまく作れていれば同時に動くことはありません。今回は念のための処置として作成します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	output '*.ref3d'&lt;br /&gt;
	output '*.ref2d'&lt;br /&gt;
	output '*.mon'&lt;br /&gt;
	output '*.gif'&lt;br /&gt;
Flow&lt;br /&gt;
	rule Start &amp;gt;&amp;gt;&amp;gt; SubMain &amp;gt;&amp;gt;&amp;gt; Result&lt;br /&gt;
	rule Finish&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Start&lt;br /&gt;
	output 'Start0!Flag'&lt;br /&gt;
Action&lt;br /&gt;
	touch {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule SubMain&lt;br /&gt;
	input 'Start*!Flag'&lt;br /&gt;
	output '*.*'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Interaction {val : '{$I[1][1]}'.str().i()} &amp;gt;&amp;gt;&amp;gt; Ref3DtoRef2D {val : '{$I[1][1]}'.str().i()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Finish&lt;br /&gt;
	input 'Finish*!Flag'&lt;br /&gt;
	input '*.*-{$I[1][1]}'&lt;br /&gt;
	output '{$I[2][1]}.{$I[2][2]}'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[2]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
MainルールとSubMainルールにて順番を指定しています。&amp;lt;br&amp;gt;&lt;br /&gt;
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Advanced3plus1 こちら]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用４（単粒子解析） ===&lt;br /&gt;
　次は[[Makefile]]をベースとして[[単粒子解析]]のための処理を作ってみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 問題４ ====&lt;br /&gt;
元のMakefileが下記であったとします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.SUFFIXES: .roi .smooth .shrink .pad .fit .corinfo .3dinfo .3dwholeinfo .3d4sinfo .lst .3dlst .padlst .3d .ds6 .3dwholelst .3dwhole .wholeds6 .3d4s .4sds6 .3d4sinfolst&lt;br /&gt;
&lt;br /&gt;
#SHELL=/bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
&lt;br /&gt;
.lst.padlst:&lt;br /&gt;
	rm -f $*.padlst&lt;br /&gt;
	for i in `cat $*.lst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .roi`; \&lt;br /&gt;
		echo $$FILENAME; \&lt;br /&gt;
		make $$FILENAME.pad ; \&lt;br /&gt;
		echo $$FILENAME.pad &amp;gt;&amp;gt; $*.padlst; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3dlst:&lt;br /&gt;
	rm -f $*.3dlst&lt;br /&gt;
	rm -f $*.3dwholelst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.fit ; \&lt;br /&gt;
		make $$FILENAME.3dinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dinfo &amp;gt;&amp;gt; $*.3dlst ; \&lt;br /&gt;
		make $$FILENAME.3dwholeinfo ; \&lt;br /&gt;
		cat $$FILENAME.3dwholeinfo &amp;gt;&amp;gt; $*.3dwholelst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
.padlst.3d4sinfolst:&lt;br /&gt;
	rm -f $*.3d4sinfolst&lt;br /&gt;
	for i in `cat $*.padlst`; do \&lt;br /&gt;
		FILENAME=`basename $$i .pad`; \&lt;br /&gt;
		make $$FILENAME.3d4sinfo ; \&lt;br /&gt;
		cat $$FILENAME.3d4sinfo &amp;gt;&amp;gt; $*.3d4sinfolst ; \&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.roi.smooth:&lt;br /&gt;
	mrcImageSmoothing -i $*.roi -o $*.smooth -m 1 -r 4 &lt;br /&gt;
&lt;br /&gt;
.smooth.shrink:&lt;br /&gt;
	mrcImageShrink -i $*.smooth -o  $*.shrink -S 8&lt;br /&gt;
&lt;br /&gt;
.shrink.pad:&lt;br /&gt;
	mrcImagePad -i $*.shrink -o $*.pad -W 32 -H 32 &lt;br /&gt;
&lt;br /&gt;
.pad.fit:&lt;br /&gt;
	mrcImageAutoRotationCorrelation -i $*.pad -r $(REFERENCE) -fit  $*.fit -O $*.corinfo -n 72 -m 18 -nRot1 72 -nRot2 72 -nRot3 1 &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
.fit.3dinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,&amp;quot;0.0&amp;quot;}' $*.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; $*.3dinfolst&lt;br /&gt;
	head -n 1 $*.3dinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$1'} &amp;gt; $*.3dinfo	&lt;br /&gt;
&lt;br /&gt;
.fit.3dwholeinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3dwholeinfolst&lt;br /&gt;
	head -n 1 $*.3dwholeinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3dwholeinfo	&lt;br /&gt;
	X=`awk '{print -8*$$6; }' $*.3dwholeinfo`; \&lt;br /&gt;
	Y=`awk '{print -8*$$7; }' $*.3dwholeinfo`; \&lt;br /&gt;
	echo $$X,$$Y; mrcImageShift -i $*.roi -o $*.shift -x $$X -y $$Y -z 0	&lt;br /&gt;
&lt;br /&gt;
.3dlst.3d:&lt;br /&gt;
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode 2 -Double -DoubleCounter $*.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
.3d.ds6:&lt;br /&gt;
	mrc2map -i $*.3d -o $*.ds6 -m 3 &lt;br /&gt;
&lt;br /&gt;
.3dwholelst.3dwhole:&lt;br /&gt;
	mrc2Dto3D -I $*.3dwholelst -o $*.3dwhole -InterpolationMode 2 -Double -DoubleCounter $*.3dwholecounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3dwhole.wholeds6:&lt;br /&gt;
	mrc2map -i $*.3dwhole -o $*.wholeds6 -m 3 &lt;br /&gt;
	ln -sf $*.wholeds6 $*.whole.ds6&lt;br /&gt;
&lt;br /&gt;
.fit.3d4sinfo:&lt;br /&gt;
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; $*.3d4sinfolst&lt;br /&gt;
	head -n 1 $*.3d4sinfolst | awk ' {print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$1'} &amp;gt; $*.3d4sinfo&lt;br /&gt;
	X=`awk '{print -4*$$6; }' $*.3d4sinfo`; \&lt;br /&gt;
	Y=`awk '{print -4*$$7; }' $*.3d4sinfo`; \&lt;br /&gt;
	echo $$X,$$Y; &lt;br /&gt;
	mrcImageShrink -i $*.roi -o  $*.4shrink -S 4&lt;br /&gt;
	mrcImagePad -i $*.4shrink -o $*.pad -W 64 -H 64&lt;br /&gt;
	mrcImageShift -i $*.roi -o $*.4shift -x $$X -y $$Y -z 0&lt;br /&gt;
&lt;br /&gt;
.3d4sinfolst.3d4s:&lt;br /&gt;
	 mrc2Dto3D -I $*.3d4sinfolst -o $*.3d4s -InterpolationMode 2 -Double -DoubleCounter $*.3d4scounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
.3d4s.4sds6:&lt;br /&gt;
	mrc2map -i $*.3d4s -o $*.4sds6 -m 3&lt;br /&gt;
	ln -sf $*.4sds6 $*.4s.ds6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のMakefileは複数の電子顕微鏡画像(.roi)に対して、参照像を使って角度決定をした後に３次元再構成を実行する処理となっています。.roiファイルの一覧は.lstに書かれていて、参照像の2Dスタック(REFERENCEで設定)があることが前提となっています。このmakefileは相関マップ(.corinfo)を作成するときに1/8とした画像を使用することで速度の向上をはかっています。&amp;quot;make （.lstのファイル名）.3d&amp;quot;で1/8サイズ、&amp;quot;make （.lstのファイル名）.3dwhole&amp;quot;で1/1サイズ、&amp;quot;make （.lstのファイル名）.3d4s&amp;quot;で1/4サイズの３次元像が作成されます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
　応用問題４：上記の機能を持つパッケージSingleParticle_3DReconstruction.ppgを作成してみましょう。&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 解答例１ ====&lt;br /&gt;
解答例を一部示します。全体は[[Media:PIONE-Advanced4-1.zip|こちら]]をご覧下さい。元の機能に加えて、サンプルの.roiファイルと参照像2Dスタック.stackを作成できるようにしています。この場合の入力ファイルは.mrcのみです。さらに、作成された３次元像を画像としてすぐに確認できるように３方向からの投影像を[[gif]]ファイルで出力しています。また、機能毎にフラグを設けて作成したいデータのみを作成できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 実装 =====&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if $Flag_ROI or $Flag_Ref&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI.not()&lt;br /&gt;
		input '*.lst'&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref.not()&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output '*.gif'.all&lt;br /&gt;
	&lt;br /&gt;
Flow&lt;br /&gt;
&lt;br /&gt;
	if $Flag_ROI&lt;br /&gt;
		rule Create_SampleROI&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Ref&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	rule Create_fit&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst &lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Projection_3d&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内で使用しているルールは下記のようにMakefileの処理と対応しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_SampleROI&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;サンプル用の.roiファイルを複数作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_stack&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;参照像の2Dスタック.stackファイルを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dwholeinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dwholeinfo_3dwholelst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dwholeinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dwhole&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dwholelst_3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3dwhole_wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dwholelst.3dwhole&amp;lt;br&amp;gt;&lt;br /&gt;
			.3dwhole.wholeds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/1サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3d4sinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3d4sinfo_3d4slst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3d4sinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlstの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d4s&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3d4slst_3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d4s_4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3d4sinfolst.3d4s&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d4s.4sds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dの1/4サイズバージョン&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Projection_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;なし&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;作成された３次元像.3dなどを3方向から投影したgif画像を作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、下記のように画像サイズや回転方法をパラメータにて設定できるようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Makefile との動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.roiファイルと.stackファイルは予めParameter.pioneを下記のようにして作成しています。（[[ROI]]画像: サイズ256×256, 2つの角度0 ~ 300: 60刻み）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $X_SIZE := 256	#80&lt;br /&gt;
param $Y_SIZE := 256	#80&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 60	#30&lt;br /&gt;
&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
&lt;br /&gt;
advanced param $Flag_ROI := true&lt;br /&gt;
advanced param $Flag_Ref := true&lt;br /&gt;
advanced param $Flag_3D := false&lt;br /&gt;
advanced param $Flag_3DWhole := false&lt;br /&gt;
advanced param $Flag_3D4S := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:1VOM.mrc|.roiや.stack作成で使用する.mrcファイル]]&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt; &lt;br /&gt;
		&amp;lt;tr&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				xy平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;Center&amp;quot;&amp;gt;[[画像:Input1-1VOM.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
				yz平面&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;最小&amp;lt;br&amp;gt; &lt;br /&gt;
				最大&amp;lt;br&amp;gt; &lt;br /&gt;
				平均値&amp;lt;br&amp;gt; &lt;br /&gt;
				標準偏差&amp;lt;br&amp;gt; &lt;br /&gt;
				標準誤差&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;0 (0, 0, 0)&amp;lt;br&amp;gt; &lt;br /&gt;
				3398.12 (23, 55, 41)&amp;lt;br&amp;gt; &lt;br /&gt;
				72.129&amp;lt;br&amp;gt; &lt;br /&gt;
				294.805&amp;lt;br&amp;gt; &lt;br /&gt;
				0.368507&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; &lt;br /&gt;
			&amp;lt;/td&amp;gt; &lt;br /&gt;
		&amp;lt;/tr&amp;gt; &lt;br /&gt;
	&amp;lt;/table&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成された[[ROI]]ファイルの一覧をData.lstに書き込んで[[Makefile]]で動作できるようにします。また、Makefile内にてREFERENCEを作成した.stackファイル名に変更します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#REFERENCE=1J4Z-move-shrink.stack&lt;br /&gt;
REFERENCE=1WDC.stack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以上の.roiファイル、.stackファイル、Makefileを入力用のディレクトリに置きます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefileの処理時間の下記の[[PIONE定義書]]を作って、計測しています。&amp;lt;br&amp;gt;&lt;br /&gt;
計測①コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	output '{$I[1][1]}.ds6'&lt;br /&gt;
Action&lt;br /&gt;
	make {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のルールの場合、（全体の処理）＝（Makefile処理）＋（入力ファイル処理）＋（出力ファイル処理）となっているので、下記の計測②時間との差分を算出すれば、およそのMakefileの処理時間が算出できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②コード&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.lst'&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input '*.stack'.all&lt;br /&gt;
	input '*.ds6'&lt;br /&gt;
	output '{$I[5][1]}.ds6out'&lt;br /&gt;
Action&lt;br /&gt;
	cp {$I[5]} {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①結果（９分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-12.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測②結果（１秒程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-13.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
計測①が９分強、計測②が１秒程度なので、Makefileの処理時間は９分強掛かったことが分かりました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-1.zip|今回実装した処理]]をタスク数２（-t 2）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（７分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-16.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
今回の実装においては２分程度の削減で、処理時間がMakefileの7/9となりました。しかし、この実装においてルールを細かく分けすぎているためにルール間の入出力ファイルのやり取りによる処理が各所で発生しています。次の項目にてこれらの無駄を省くためのコーディングを考えて、さらに時間を削減してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 速度アップのための実装 ====&lt;br /&gt;
===== リスト作成の省略 =====&lt;br /&gt;
まずは.lstなどを作成している部分について考えます。[[PIONE]]は１：複数の処理が可能ですのでリストの作成は省略できます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Main&lt;br /&gt;
	if ($Mode_ROI + $Mode_Ref) != 0&lt;br /&gt;
		input '*.mrc'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref == 0&lt;br /&gt;
		input '*.stack'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI == 0&lt;br /&gt;
		input '*.roi'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}.3dlst'&lt;br /&gt;
		output '{$I[1][1]}.3d'&lt;br /&gt;
		output '{$I[1][1]}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		output '{$I[1][1]}.3dwholelst'&lt;br /&gt;
		output '{$I[1][1]}.3dwhole'&lt;br /&gt;
		output '{$I[1][1]}.wholeds6'&lt;br /&gt;
		output '{$I[1][1]}.whole.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		output '{$I[1][1]}.3d4slst'&lt;br /&gt;
		output '{$I[1][1]}.3d4s'&lt;br /&gt;
		output '{$I[1][1]}.4sds6'&lt;br /&gt;
		output '{$I[1][1]}.4s.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_ROI != 0&lt;br /&gt;
		output '*.tiff'.all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		output '*.gif'.all&lt;br /&gt;
	end&lt;br /&gt;
Flow&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Mode_Ref != 0&lt;br /&gt;
		rule Create_stack&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rule Preprocess&lt;br /&gt;
	&lt;br /&gt;
	case $Mode_Cor&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_fit_all&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		rule Create_3dlst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3DWhole&lt;br /&gt;
		rule Create_3dwholelst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3dwhole&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_3D4S&lt;br /&gt;
		rule Create_3d4slst {filename: $I[1][1].str()}&lt;br /&gt;
		rule Create_3d4s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if $Flag_Projection&lt;br /&gt;
		rule Projection_3d&lt;br /&gt;
	end&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.roiファイル、.padファイルの一覧を記述した.lstファイル.padlstファイルを廃止して、入力用ディレクトリにある全ての.roiファイルについて処理を行うように変更しました。（但し、.3dlstなどは角度情報として使用するのでそのまま）また、入力ファイル１つに対して複数のファイルを作成する箇所についてeachで行うかallで行うかをパラメータによって決められるようにしています。今回の場合はeachを使用して複数のタスクで実行すると速度の改善が期待できます。（参照：[[#基本４の補足（eachでの速度検証）]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
allで実行した場合（約65秒）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-7.png|1120px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachで実行した場合（約81秒）（allよりも時間が掛かっている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-8.png|1390px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 2で実行した場合（約47秒）（速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-9.png|820px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 3で実行した場合（約36秒）（さらに速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-10.png|635px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eachを-t 4で実行した場合（約31秒）（若干速度が改善されている）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-11.png|550px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記は１つのマシンにおいてallと複数のタスクによるeachの速度の違いです。eachを複数のタスクで動作させると、allの場合よりも速く処理できることが分かります。そして、タスク数が多いほどが速度が改善されています。しかし、タスク数を増やす毎に改善の度合いは緩やかになっています。マシン毎で一度に処理できるタスク数を把握し、全てのタスクをいくつに分けるかを考えると良いでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Param.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# basic param&lt;br /&gt;
## For Size&lt;br /&gt;
param $X_SIZE := 80&lt;br /&gt;
param $Y_SIZE := 80&lt;br /&gt;
param $SHRINK := 8&lt;br /&gt;
param $SHRINK4S := 4&lt;br /&gt;
&lt;br /&gt;
## For AutoRotationCorrelation&lt;br /&gt;
param $N_ROT := 72&lt;br /&gt;
param $N_ROT1 := 72&lt;br /&gt;
param $N_ROT2 := 72&lt;br /&gt;
param $N_ROT3 := 1&lt;br /&gt;
&lt;br /&gt;
## For RefData&lt;br /&gt;
param $REF_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $REF_ROT1_START := 0&lt;br /&gt;
param $REF_ROT1_END := 359&lt;br /&gt;
param $REF_ROT1_DELTA := 15&lt;br /&gt;
param $REF_ROT2_START := 0&lt;br /&gt;
param $REF_ROT2_END := 359&lt;br /&gt;
param $REF_ROT2_DELTA := 15&lt;br /&gt;
param $REF_ROT3_START := 0&lt;br /&gt;
param $REF_ROT3_END := 0&lt;br /&gt;
param $REF_ROT3_DELTA := 15&lt;br /&gt;
&lt;br /&gt;
## For SampleROI&lt;br /&gt;
param $ROI_ROT_MODE := &amp;quot;XOYS&amp;quot;&lt;br /&gt;
param $ROI_ROT1_START := 0&lt;br /&gt;
param $ROI_ROT1_END := 359&lt;br /&gt;
param $ROI_ROT1_DELTA := 30&lt;br /&gt;
$roi_rot1_loop := ($ROI_ROT1_END - $ROI_ROT1_START) / $ROI_ROT1_DELTA&lt;br /&gt;
param $ROI_ROT2_START := 0&lt;br /&gt;
param $ROI_ROT2_END := 359&lt;br /&gt;
param $ROI_ROT2_DELTA := 30&lt;br /&gt;
$roi_rot2_loop := ($ROI_ROT2_END - $ROI_ROT2_START) / $ROI_ROT2_DELTA&lt;br /&gt;
param $ROI_ROT3_START := 0&lt;br /&gt;
param $ROI_ROT3_END := 0&lt;br /&gt;
param $ROI_ROT3_DELTA := 30&lt;br /&gt;
$roi_rot3_loop := ($ROI_ROT3_END - $ROI_ROT3_START) / $ROI_ROT3_DELTA&lt;br /&gt;
param $ROI_SN := 1&lt;br /&gt;
&lt;br /&gt;
# advanced param&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all&lt;br /&gt;
advanced param $Mode_ROI := 1&lt;br /&gt;
advanced param $Mode_Ref := 1&lt;br /&gt;
advanced param $Mode_Cor := 1&lt;br /&gt;
## Flag true: do, false: do not&lt;br /&gt;
advanced param $Flag_3D := true&lt;br /&gt;
advanced param $Flag_3DWhole := true&lt;br /&gt;
advanced param $Flag_3D4S := true&lt;br /&gt;
advanced param $Flag_Projection := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はMode_ROIとMode_Corのみ1: each, 2: allの切り替えが可能としています。$roi_rot1_loopなどの[[変数束縛]]を追加していますが、これはeachのループ数のためでユーザが入力する必要はありません。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらのファイルは[[Media:PIONE-Advanced4-2.zip|こちら]]からダウンロードできます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 同じようなルールをまとめる =====&lt;br /&gt;
====== Preprocess ======&lt;br /&gt;
Mainで呼んでいるPreprocessのルールは下記のようにしていました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Preprocess&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;pad_padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			roi_smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			smooth_shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			shrink_pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.lst.padlst&amp;lt;br&amp;gt;&lt;br /&gt;
			.roi.smooth&amp;lt;br&amp;gt;&lt;br /&gt;
			.smooth.shrink&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrink.pad&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padファイル一覧を作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.roiの平滑化して.smoothを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.smoothを縮小して.shrinkを作成&amp;lt;br&amp;gt;&lt;br /&gt;
			.shrinkを参照画像と同じサイズにパディングして.padを作成&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの処理は全て入力ファイルと出力ファイルが１：１対応であり、.roi -&amp;gt; .smooth -&amp;gt; .shrinkの順番に作成して最終的に.padファイルのみを得ることを目的としています。このような場合はルールを分けずに１つのルールの中で処理を行った方がルール間のファイルのやり取りが最小限で済みます。（参照：[[#基本５の補足]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;コード&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;処理結果（[[ProM]]）&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(1) 分けた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Flow&lt;br /&gt;
	rule roi_smooth;&lt;br /&gt;
	rule smooth_shrink;&lt;br /&gt;
	rule shrink_pad;&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.roi.smooth:&lt;br /&gt;
Rule roi_smooth&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.smooth'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$O[1]} -m 1 -r 4 &lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.smooth.shrink:&lt;br /&gt;
Rule smooth_shrink&lt;br /&gt;
	input '*.smooth'&lt;br /&gt;
	output '{$I[1][1]}.shrink'&lt;br /&gt;
Action&lt;br /&gt;
	mrcImageShrink -i {$I[1]} -o  {$O[1]} -S {$SHRINK}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
#.shrink.pad:&lt;br /&gt;
Rule shrink_pad&lt;br /&gt;
	input '*.shrink'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1]} -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;(2) まとめた場合&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input '*.roi'&lt;br /&gt;
	output '{$I[1][1]}.pad'&lt;br /&gt;
Action&lt;br /&gt;
	# roi_smooth&lt;br /&gt;
	mrcImageSmoothing -i {$I[1]} -o {$I[1][1]}.smooth -m 1 -r 4&lt;br /&gt;
	&lt;br /&gt;
	# smooth_shrink&lt;br /&gt;
	mrcImageShrink -i {$I[1][1]}.smooth -o  {$I[1][1]}.shrink -S {$SHRINK}&lt;br /&gt;
	&lt;br /&gt;
	# shrink_pad&lt;br /&gt;
	width=`expr {$X_SIZE} / {$SHRINK}`&lt;br /&gt;
	height=`expr {$Y_SIZE} / {$SHRINK}`&lt;br /&gt;
	mrcImagePad -i {$I[1][1]}.shrink -o {$O[1]} -W ${width} -H ${height}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced4-6.png|540px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記の(2)のようにルールをまとめることで(1)に比べて、１ファイル毎に１秒ほど時間が短縮できました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Create_fit, Create_3dlst, Create_3d ======&lt;br /&gt;
　Create_fitは各.padファイルから.fitファイルや.corinfoファイルをそれぞれ１：１で作成しています。また、Create_3dlstでもfit_3dinfoまでは１：１対応の処理です。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Main.pione内のルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;サブルール&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;Makefile&amp;lt;/th&amp;gt;&lt;br /&gt;
		&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.pad.fit&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.padから.stackを使って相関マップ.corinfoを作成（最も近い画像.fitも作成）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;fit_3dinfo&amp;lt;br&amp;gt;&lt;br /&gt;
			Sum_3dinfo_3dlst&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.fit.3dinfo&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;各相関マップ.corinfoから相関値が最大の角度を集めてリスト.3dlstを作成&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Create_3d&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;Reconstruct_3dlst_3d&amp;lt;br&amp;gt;&lt;br /&gt;
			Convert_3d_ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;.3dlst.3d&amp;lt;br&amp;gt;&lt;br /&gt;
			.3d.ds6&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;リスト.3dlstと.fitを使って３次元像.3d及び.ds6を作成（1/8サイズ）&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
従って、この部分もまとめた方が良いでしょう。同様にfit_3dwholeinfoとfit_3d4sinfoもまとめます。この処理は前項目のPreprocessともまとめられそうですが、[[単粒子解析]]のための３次元再構成では角度決定処理を繰り返し行うので、この部分は分けて実装します。（参照：[[単粒子解析#繰り返し（精密化）]]）また、Create_3dlstのSum_3dinfo_3dlstとCreate_3dなども一つにまとめられます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_fit_each&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*.stack'&lt;br /&gt;
if ($Flag_3DWhole or $Flag_3D4S)&lt;br /&gt;
	input '{$I[1][1]}.roi'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3DWhole&lt;br /&gt;
	output '{$I[1][1]}.shift'&lt;br /&gt;
	output '{$I[1][1]}.3dwholeinfo'&lt;br /&gt;
end&lt;br /&gt;
if $Flag_3D4S&lt;br /&gt;
	output '{$I[1][1]}.4shift'&lt;br /&gt;
	output '{$I[1][1]}.3d4sinfo'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit -O {$I[1][1]}.corinfo \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/fit/ &amp;gt; {$I[1][1]}.3dinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3dwholeinfo&lt;br /&gt;
	if {$Flag_3DWhole} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/shift/ &amp;gt; {$I[1][1]}.3dwholeinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dwholeinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3dwholeinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK}*$6; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK}*$7; }' {$I[1][1]}.3dwholeinfo`;&lt;br /&gt;
		echo $X,$Y; mrcImageShift -i {$I[1][1]}.roi -o {$I[1][1]}.shift -x $X -y $Y -z 0	&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
	# fit_3d4sinfo&lt;br /&gt;
	if {$Flag_3D4S} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,$9,$11,$12}' {$I[1][1]}.corinfo | sort -r | sed -e s/pad/4shift/ &amp;gt; {$I[1][1]}.3d4sinfolst&lt;br /&gt;
		head -n 1 {$I[1][1]}.3d4sinfolst | awk ' {print $2,$3,$4,$5,$6,$7,$8,$1'} &amp;gt; {$I[1][1]}.3d4sinfo&lt;br /&gt;
		X=`awk '{print -{$SHRINK4S}*$6; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		Y=`awk '{print -{$SHRINK4S}*$7; }' {$I[1][1]}.3d4sinfo`;&lt;br /&gt;
		echo $X,$Y; &lt;br /&gt;
		mrcImageShrink -i {$I[1][1]}.roi -o  {$I[1][1]}.4shrink -S {$SHRINK4S}&lt;br /&gt;
		width=`expr {$X_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		height=`expr {$Y_SIZE} / {$SHRINK4S}`&lt;br /&gt;
		mrcImagePad -i {$I[1][1]}.4shrink -o {$I[1][1]}.4spad -W ${width} -H ${height}&lt;br /&gt;
		mrcImageShift -i {$I[1][1]}.4spad -o {$I[1][1]}.4shift -x $X -y $Y -z 0&lt;br /&gt;
	fi&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まとめたCreate_3d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo'.all&lt;br /&gt;
	input '*.fit'.all&lt;br /&gt;
	output '{$filename}.3d'&lt;br /&gt;
	output '{$filename}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d4s, Create_3dwholeについても同様にまとめています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作比較 =====&lt;br /&gt;
作成した[[PIONE定義書]]と前回分や元の[[Makefile]]との処理時間を比較して、ここまでの実装の効果があったかを検証します。今回は.3dファイルの作成に関して比較します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、[[:Media:PIONE-Advanced4-3.zip|今回の実装]]による処理時間を複数のタスク（-t 2と-t 4）で実行してみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t 2の結果（５分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-14.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-t4の結果（３分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced4-15.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
１つのマシンにおいて２つのタスクに分けることで４分削減して約5/9（改善前からは２分削減して約5/7）になりました。さらに４つのタスクに分けることで６分削減して約1/3になりました。入力ファイル（256×256：36枚）の場合において、今回の実装で有効な並列処理ができたと言えるでしょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 機能追加のための実装 ====&lt;br /&gt;
今回は作成した[[PIONE定義書]]や[[パッケージ]]についてさらに機能を追加する方法を考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 粒子の切り出しを追加する =====&lt;br /&gt;
.roiファイルが無い場合にユーザが切り出した画像を使用できるように追加してみましょう。（参照：[[単粒子解析#電子顕微鏡画像から粒子画像の抽出]]）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この機能は.roiファイルを作成するものなので、Create_ROIと同列と考えて、$Mode_ROIに3を追加してこのときにユーザが切り出すようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_ROI&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_each {rot1: (0.upto($roi_rot1_loop))*$ROI_ROT1_DELTA, rot2: (0.upto($roi_rot2_loop))*$ROI_ROT2_DELTA, rot3: (0.upto($roi_rot3_loop))*$ROI_ROT3_DELTA}&lt;br /&gt;
	when 2&lt;br /&gt;
		rule Create_Sample3d&lt;br /&gt;
		rule Create_SampleROI_all&lt;br /&gt;
	when 3&lt;br /&gt;
		rule Cutout_ROI&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（コメントを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Mode 0: do not, 1: each, 2: all, 3: use Display2&lt;br /&gt;
advanced param $Mode_ROI := 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_SampleROI.pione（Cutout_ROIを追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Cutout_ROI&lt;br /&gt;
	input '*.mrc'&lt;br /&gt;
	output '*.roi'.all&lt;br /&gt;
	output '*.tiff'.all&lt;br /&gt;
Action&lt;br /&gt;
	Display2 -i {$I[1]}&lt;br /&gt;
	for data in $(ls *.roi)&lt;br /&gt;
	do&lt;br /&gt;
		mrc2tiff -i ${data} -o ${data}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
切り出しには[[Display2]]を使用しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新しいルールを作成して、呼び出すだけで簡単に機能を追加することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 繰り返し機能を追加する =====&lt;br /&gt;
[[単粒子解析]]のための３次元再構成は出来上がった３次元像を参照像として繰り返して、３次元像の精密化を行うこともあります。今回はこの部分の対応を作成してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter.pione（繰り返し回数を追加）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## For repeat count&lt;br /&gt;
param $Repeat_Count := 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat_3d&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Repeat_3d&lt;br /&gt;
	input '*-{$count}.3d'&lt;br /&gt;
	output '{$I[1][1]}-{$count + 1}.stack'&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	mrc3Dto2D	-i {$I[1]} -o {$O[1]} -m 1 -InterpolationMode 2 -EulerMode {$REF_ROT_MODE} \&lt;br /&gt;
				-Rot1 {$REF_ROT1_START} {$REF_ROT1_END} {$REF_ROT1_DELTA} \&lt;br /&gt;
				-Rot2 {$REF_ROT2_START} {$REF_ROT2_END} {$REF_ROT2_DELTA} \&lt;br /&gt;
				-Rot3 {$REF_ROT3_START} {$REF_ROT3_END} {$REF_ROT3_DELTA}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
上記のように作成された.3dファイルから.stackファイルを作成します。このとき繰り返し回数が分かるようにファイル名にを付加しています。また、下記のルールについても繰り返し回数の対応を行います。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（出力ファイルの宣言）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if $Flag_3D&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.3d'&lt;br /&gt;
		output '{$I[1][1]}-{$Repeat_Count}.ds6'&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
繰り返しの最後のファイルのみを出力するようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione（Flow）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	case $Mode_3D&lt;br /&gt;
	when 1&lt;br /&gt;
		rule Create_fit_each&lt;br /&gt;
		&lt;br /&gt;
		if $Flag_3D&lt;br /&gt;
			rule Create_3d {filename: $I[1][1].str(), count: 1.upto($Repeat_Count)}&lt;br /&gt;
			rule Repeat_3d {count: 1.upto($Repeat_Count - 1)}&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create_3d, Repeat_3dを繰り返し回数分呼び出します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_stack.pione（最初の.stackファイル名に1を付加）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	output '{$I[1][1]}-1.stack'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_fit_each.pione（.3dのための処理）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_fit_each&lt;br /&gt;
	input '*.pad'&lt;br /&gt;
	input '*-*.stack'&lt;br /&gt;
if $Flag_3D&lt;br /&gt;
	output '{$I[1][1]}.fit-{$I[2][2]}'&lt;br /&gt;
	output '{$I[1][1]}.3dinfo-{$I[2][2]}'&lt;br /&gt;
end&lt;br /&gt;
Action&lt;br /&gt;
	# Create_fit&lt;br /&gt;
	mrcImageAutoRotationCorrelation	-i {$I[1]} -r {$I[2]} -fit  {$I[1][1]}.fit-{$I[2][2]} -O {$I[1][1]}.corinfo-{$I[2][2]} \&lt;br /&gt;
									-n {$N_ROT} -m 18 -nRot1 {$N_ROT1} -nRot2 {$N_ROT2} -nRot3 {$N_ROT3} &amp;gt; /dev/null&lt;br /&gt;
	&lt;br /&gt;
	# fit_3dinfo&lt;br /&gt;
	if {$Flag_3D} ; then&lt;br /&gt;
		awk '/Cor/ { print $18,$16,$2,$3,$4,&amp;quot;0.0&amp;quot;}' {$I[1][1]}.corinfo-{$I[2][2]} | sort -r | sed -e s/pad/fit-{$I[2][2]}/ &amp;gt; {$I[1][1]}.3dinfolst-{$I[2][2]}&lt;br /&gt;
		head -n 1 {$I[1][1]}.3dinfolst-{$I[2][2]} | awk ' {print $2,$3,$4,$5,$6,$1'} &amp;gt; {$I[1][1]}.3dinfo-{$I[2][2]}&lt;br /&gt;
	fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create_3d.pione&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Create_3d&lt;br /&gt;
	input '*.3dinfo-{$count}'.all&lt;br /&gt;
	input '*.fit-{$count}'.all&lt;br /&gt;
	output '{$filename}-{$count}.3d'&lt;br /&gt;
	output '{$filename}-{$count}.ds6'&lt;br /&gt;
	param $filename&lt;br /&gt;
	param $count&lt;br /&gt;
Action&lt;br /&gt;
	# Sum_3dinfo_3dlst&lt;br /&gt;
	for info in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		cat $info &amp;gt;&amp;gt; {$filename}-{$count}.3dlst&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	# Reconstruct_3dlst_3d&lt;br /&gt;
	mrc2Dto3D -I {$filename}-{$count}.3dlst -o {$O[1]} -InterpolationMode 2 -Double -DoubleCounter {$filename}-{$count}.3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 6&lt;br /&gt;
&lt;br /&gt;
	# Convert_3d_ds6&lt;br /&gt;
	mrc2map -i {$O[1]} -o {$O[2]} -m 3 &lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように実装することで指定した数Repeat_Countに応じた繰り返し処理を行うように機能追加ができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 応用５（クラスター解析） ===&lt;br /&gt;
次は[[クラスター解析]]のMakefileを元にして速度改善を考えてみましょう。[http://sourceforge.jp/projects/eos/scm/git/base/archive/master/Integration/2DClustering/?format=zip こちらのMakefile]を元にしています。今回はMakefileのコマンドも使用します。これにより全体の実装量を削減できますが、makeコマンド実行するときに入出力ファイルがそれぞれ何に当たるのかを注意する必要があります。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 前処理 ====&lt;br /&gt;
前処理の並列化を考えます。これまでの[[PIONE定義書]]ではeachを使って1ファイル毎の並列処理として実装を行いました。今回はいくつかのグループに分けて、そのグループ毎で並列化を行うようにしてみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $task := 2&lt;br /&gt;
&lt;br /&gt;
Rule Main&lt;br /&gt;
	input '*.roi'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Flow&lt;br /&gt;
	rule Preprocess {filelist:$I[1].all, num:1.upto($task), length:$I[1].length()}&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Rule Preprocess&lt;br /&gt;
	input $filelist.nth(((($num-1)*((($length-1)/$task)+1))+1).upto((($num*((($length-1)/$task)+1))|$length).min()))&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output '*.pad'.all&lt;br /&gt;
Action&lt;br /&gt;
	for data in {$I[1]}&lt;br /&gt;
	do&lt;br /&gt;
		make $(basename ${data} &amp;quot;.roi&amp;quot;).pad&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Preprocess内の処理はMakefile内のコマンドに委ねるようにしています。入力ファイルがかなり複雑となっていますが、これは次のように考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
まずパラメータtaskで分割したいグループ数を決め、この数だけルールPreprocessの呼び出すように考えます。&amp;lt;br&amp;gt;&lt;br /&gt;
*filelistにはファイル自体でなく、ファイル名の一覧を送る&lt;br /&gt;
*numには分割数の内の何番目かを送る&lt;br /&gt;
*lengthにはファイル名の要素数を送る&lt;br /&gt;
次にPreprocess側では受け取ったパラメータからグループ毎で使用するファイル名を決め、それらを入力ファイルとすることで分割を実現します。なお、今回使用しているupto, length, minなどのメソッドについては[[PIONEの式]]を参照して下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
次のグラフは上記の前処理を256, 512, 1024, 2048, 4096(pixel)の画像ファイル100枚を入力としてタスク数1, 2, 4, 10で動作したときの処理時間です。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
allは（前処理に関する）全体の処理、processは前処理自体、otherはそれ以外のファイル通信などの処理時間を表しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ここでタスク数を増やしたときの変化に注目します。全体の処理時間についてt=1（シングルタスク）との比率は下記のようになりました。&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
2048サイズまでは処理時間が短くなっています。今回はタスク数を増やしても速度の改善は見られません。タスク数を増やすことによって前処理自体の時間は軽減されますが、それ以外のファイル通信など処理で逆に時間がかかってしまうためです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;[[画像:Outdata-PIONE-Advanced5-6.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;前処理はタスク数が多い方が速くなる（このマシンではt=4まで）&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;タスク数が多くなると並列処理の準備（ファイル通信など）は時間がかかる。&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== クラスター解析による分類 ====&lt;br /&gt;
本処理のクラスター解析による分類の速度改善を考えてみましょう。Makefileでは[[mrcImageClusterAnalysis]]によって画像毎の相関リストを作って近い画像同士を分類して、グループを作り、それぞれのグループによって平均画像を作成しています。今回はこのグループ毎の平均画像に対してリファインメントを行う部分にて並列化を行ってみます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ分け =====&lt;br /&gt;
まず、全ての.padファイルを入力としてmakeコマンドによってクラスター解析による分類を行います。すると、分類された.padファイルの一覧all.padsortlstと樹形図all.treeinfoが出力されるので、この2つのファイルを指定した分割数divideだけ分割してそれぞれ.lst .treeファイルを作成します。また、最初のmakeコマンドによって1回目の平均画像が得られますので、この画像がどのグループに属するのか番号付けして出力しています。（ルートに近く分割できない画像は0として番号付けする）下記はその実装例です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Process&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input 'Makefile'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output 'all.padsortlst'&lt;br /&gt;
	output 'all.treeinfo'&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.lst&amp;quot;).d().all()&lt;br /&gt;
	output ((1.upto($divide).str())+&amp;quot;.tree&amp;quot;).d().all()&lt;br /&gt;
	output (&amp;quot;*.pad&amp;quot;+(1.upto($divide).str())).d().all()&lt;br /&gt;
	output (&amp;quot;*.avg&amp;quot;+(0.upto($divide).str())).d().all()&lt;br /&gt;
	output '*.avglst'.all&lt;br /&gt;
Action&lt;br /&gt;
	ls -1 *.pad &amp;gt; all.padlst&lt;br /&gt;
	make Log&lt;br /&gt;
	make LogPS&lt;br /&gt;
	&lt;br /&gt;
	cp {$O[1]} 1.lst&lt;br /&gt;
	cp {$O[2]} 1.tree&lt;br /&gt;
	for (( i=2; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		max=0&lt;br /&gt;
		for data in $(ls *.lst)&lt;br /&gt;
		do&lt;br /&gt;
			num=$(wc -l ${data} | awk '{printf $1}')&lt;br /&gt;
			if [ ${num} -gt ${max} ] ; then&lt;br /&gt;
				max=${num}&lt;br /&gt;
				maxlist=&amp;quot;${data}&amp;quot;&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		maxtree=&amp;quot;$(basename ${maxlist} '.lst').tree&amp;quot;&lt;br /&gt;
		root=$(head -1 ${maxtree} | awk '{printf(&amp;quot;%d&amp;quot;, $1)}')&lt;br /&gt;
		rootname=$(basename $(awk -v val=${root} '$2==val {printf(&amp;quot;%s&amp;quot;, $1)}' ${maxlist}) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
		cp ${maxlist} ${rootname}.avglst&lt;br /&gt;
		cp ${rootname}.pad.avg ${rootname}.pad.avg0&lt;br /&gt;
		maxpos=$(awk -v val=${root} '$2==val {printf(&amp;quot;%f&amp;quot;, $3)}' ${maxlist})&lt;br /&gt;
		line=$(awk -v val=${root} '$2==val {print NR}' ${maxlist})&lt;br /&gt;
		head -$((${line} - 1)) ${maxlist} &amp;gt; ${i}.lst&lt;br /&gt;
		tail -$(($(wc -l ${maxlist} | awk '{print $1}') - ${line} + 1)) ${maxlist} &amp;gt; tmp&lt;br /&gt;
		cp tmp ${maxlist}&lt;br /&gt;
		&lt;br /&gt;
		max_t=$(wc -l ${maxtree} | awk '{printf $1}')&lt;br /&gt;
		max_l=$(wc -l ${maxlist} | awk '{printf $1}')&lt;br /&gt;
		line_t=$(awk -v val=${root} '$1==val {print NR}' ${maxtree})&lt;br /&gt;
		head -$((${max_l} + ${line_t} - 1)) ${maxtree} | tail -$((${max_l} - 1)) &amp;gt; tmp&lt;br /&gt;
		tail -$((${max_t} - ${max_l})) ${maxtree} &amp;gt; ${i}.tree&lt;br /&gt;
		cp tmp ${maxtree}&lt;br /&gt;
	done&lt;br /&gt;
	&lt;br /&gt;
	for (( i=1; i&amp;lt;={$divide}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		for data in $(awk '{print $1}' ${i}.lst)&lt;br /&gt;
		do&lt;br /&gt;
			cp ${data} ${data}${i}&lt;br /&gt;
			cp ${data}.avg ${data}.avg${i}&lt;br /&gt;
		done&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.lst .treeファイルが最大のものから２分割するようにし、分割する前の.lstファイルを.avglstとしてグループ0の平均画像のデータとして取り扱うようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== グループ毎の平均画像のリファインメント =====&lt;br /&gt;
グループ分けされた平均画像についてのリファインメントを行います。まず、.lst .treeファイルから平均画像を構成している画像リスト.avglstファイルを作成します。そして、そのリストを使用してリファインメントを行います。このとき、[[mrcImageAutoRotationCorrelation]]と[[mrcImageAverage]]を使用していますが、設定内容をMakefileと同じにするためにMakefile.configから特定のパラメータを読み取るようにしています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule Refinement&lt;br /&gt;
	input '*.pad{$num}'.all&lt;br /&gt;
	input '*.avg{$num}'.all&lt;br /&gt;
	input '{$num}.lst'&lt;br /&gt;
	input '{$num}.tree'&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;+$num.str()+&amp;quot;.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	max=$(wc -l {$num}.tree | awk '{printf $1}')&lt;br /&gt;
	data=$(head -1 {$num}.tree)&lt;br /&gt;
	i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
	name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	cp {$num}.lst ${name}.avglst&lt;br /&gt;
	cp {$num}.tree ${name}.tree&lt;br /&gt;
	&lt;br /&gt;
	for (( k=1; k&amp;lt;=max ; k++ ))&lt;br /&gt;
	do&lt;br /&gt;
		i=$(head -${k} {$num}.tree | tail -1 | awk '{print $1}')&lt;br /&gt;
		name=$(basename $(awk -v i=${i} '$2==i {print $1}' {$num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if [ $(wc -l ${name}.avglst | awk '{print $1}') -gt 2 ] ; then&lt;br /&gt;
			tpos=$(awk -v i=${i} '$2==i {print NR}' ${name}.avglst)&lt;br /&gt;
			tline=$(wc -l ${name}.avglst | awk '{print $1}')&lt;br /&gt;
		&lt;br /&gt;
			head -$((${tline} - ${tpos} + 1)) ${name}.tree | tail -$((${tline} - ${tpos})) &amp;gt; tmp&lt;br /&gt;
			i_sub1=$(head -1 tmp | tail -1 | awk '{print $1}')&lt;br /&gt;
			name_sub1=$(basename $(awk -v i=${i_sub1} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub1}.tree&lt;br /&gt;
				tail -$((${tline} - ${tpos} + 1)) ${name}.avglst &amp;gt; ${name_sub1}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		&lt;br /&gt;
			tail -$((${tpos} - 2)) ${name}.tree &amp;gt; tmp&lt;br /&gt;
			i_sub2=$(head -1 tmp | awk '{print $1}')&lt;br /&gt;
			name_sub2=$(basename $(awk -v i=${i_sub2} '$2==i {print $1}' ${name}.avglst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
			if [ $(wc -l tmp | awk '{print $1}') -ne 0 ] ; then&lt;br /&gt;
				cp tmp ${name_sub2}.tree&lt;br /&gt;
				head -$((${tpos} - 1)) ${name}.avglst &amp;gt; ${name_sub2}.avglst&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg{$num} ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element}{$num} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg{$num} -o ${name}.pad.avg{$num}.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== ルートに近い平均画像のリファインメント =====&lt;br /&gt;
ルートに近く、分割できない平均画像についてもリファインメントを行います。ルールRefinementとほとんど同じですが、平均画像を構成している画像リストはすでにルールProcessで作成されているので、本処理のみで十分です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule RefinementRoot&lt;br /&gt;
	input '*.pad'.all&lt;br /&gt;
	input '*.pad.avg0'.all&lt;br /&gt;
	input ($I[2][1].str()+&amp;quot;.avglst&amp;quot;).d().all()&lt;br /&gt;
	input 'Makefile.config'&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg.tiff&amp;quot;).d().all()&lt;br /&gt;
	output ($I[1][1].str()+&amp;quot;.pad.avg0.tiff&amp;quot;).d().all()&lt;br /&gt;
Action&lt;br /&gt;
	cat Makefile.config | sed -e s/'='/' '/ &amp;gt; Makefile.config.tmp&lt;br /&gt;
	ClusterCorrelationMode=$(awk '$1==&amp;quot;ClusterCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMin=$(awk '$1==&amp;quot;ClusterRotationRangeMin&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangeMax=$(awk '$1==&amp;quot;ClusterRotationRangeMax&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationRangePartitionNumber=$(awk '$1==&amp;quot;ClusterRotationRangePartitionNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationIterationNumber=$(awk '$1==&amp;quot;ClusterRotationIterationNumber&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	ClusterRotationCorrelationMode=$(awk '$1==&amp;quot;ClusterRotationCorrelationMode&amp;quot; {print $2}' Makefile.config.tmp)&lt;br /&gt;
	&lt;br /&gt;
	for data in $(ls *.avglst)&lt;br /&gt;
	do&lt;br /&gt;
		name=$(basename ${data} &amp;quot;.avglst&amp;quot;)&lt;br /&gt;
		awk '{print $1}' ${data} | sed -e s/.pad/.pad.fit/ &amp;gt; ${name}.fitlst&lt;br /&gt;
		cp ${name}.pad.avg0 ${name}.pad.avg&lt;br /&gt;
		for (( i=0; i &amp;lt; {$refine}; i++ ))&lt;br /&gt;
		do&lt;br /&gt;
			for element in $(awk '{print $1}' ${data})&lt;br /&gt;
			do&lt;br /&gt;
				mrcImageAutoRotationCorrelation	-i ${element} -r ${name}.pad.avg -fit ${element}.fit -cor ${element}.cor \&lt;br /&gt;
												-Method ${ClusterRotationCorrelationMode} -m ${ClusterCorrelationMode} -Iter ${ClusterRotationIterationNumber} \&lt;br /&gt;
												-range ${ClusterRotationRangeMin} ${ClusterRotationRangeMax} -n ${ClusterRotationRangePartitionNumber}&lt;br /&gt;
			done&lt;br /&gt;
			&lt;br /&gt;
			mrcImageAverage -i ${name}.fitlst -o ${name}.pad.avg&lt;br /&gt;
		done&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg -o ${name}.pad.avg.tiff&lt;br /&gt;
		mrc2tiff -i ${name}.pad.avg0 -o ${name}.pad.avg0.tiff&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 動作検証 =====&lt;br /&gt;
では実行してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
今回は入力画像を32×32(Pixel)を54枚用意しリファインメントを5回として、-t毎の実行時間を検証してみます。画像は全処理のログで、今回の実装部分はRefinement（ログの２分辺り）からです。（入力画像は同ディレクトリ内のMain_ROIr.pioneで作成しました）&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=1（5分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=2（4分程度）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t2.png|730px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t=4（3分強）&amp;lt;br&amp;gt;&lt;br /&gt;
[[画像:Outdata-PIONE-Advanced5-t4.png|670px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
タスク数を増やす毎に処理時間の短縮（本処理が半分以下に軽減）が実現できています。今回の検証では入力画像の枚数が少ないので、ファイル通信があまりなく本処理の時間にほぼ直接影響されるため並列処理の効果が得られました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile内のパラメータ設定 ====&lt;br /&gt;
今回は処理の一部をMakefileの処理に委ねていますが、使用するパラメータはMakefile.configに設定するようになっています。パラメータ管理をまとめて行えるようにこの部分のパラメータもPIONEで設定できるようにしてみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
元のMakefile.configは下記のようになっています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Makefile.config for 2D Clustering &lt;br /&gt;
&lt;br /&gt;
# Cluster Name&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
SHRINK=1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
PADMODE=13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
LowPassMode=4 &lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
#&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
#&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回はPIONEで設定したパラメータから上記のようなMakefile.configを作成することで各種パラメータの管理を全てPIONE定義書内で行えるようにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Main.pione内に下記の内容を追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Cluster Name&lt;br /&gt;
param $CLUSTER := &amp;quot;all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Pad Parameter&lt;br /&gt;
#  Width(Nx) before shrinking &lt;br /&gt;
param $PADWIDTH := 32&lt;br /&gt;
#  Height(Ny) before shrinking &lt;br /&gt;
param $PADHEIGHT := 32&lt;br /&gt;
#  Shrink for Speed Up in clustering&lt;br /&gt;
param $SHRINK := 1&lt;br /&gt;
#  Pad Mode &lt;br /&gt;
param $PADMODE := 13&lt;br /&gt;
#  LOWPASS&lt;br /&gt;
param $LowPassMode := 4 &lt;br /&gt;
param $LowPassResolution := 0.1&lt;br /&gt;
&lt;br /&gt;
# Clustering&lt;br /&gt;
param $ClusterCorrelationMode := 19&lt;br /&gt;
#&lt;br /&gt;
param $ClusterRotationRangeMin := 0&lt;br /&gt;
param $ClusterRotationRangeMax := 360&lt;br /&gt;
param $ClusterRotationRangePartitionNumber := 72&lt;br /&gt;
param $ClusterRotationIterationNumber := 2&lt;br /&gt;
param $ClusterRotationCorrelationMode := 0&lt;br /&gt;
#&lt;br /&gt;
param $ClusterMode := 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ClusterShow&lt;br /&gt;
param $TreeRootPositionX := 0&lt;br /&gt;
param $TreeRootPositionY := 400&lt;br /&gt;
param $TreeScaleX := 10&lt;br /&gt;
param $TreeScaleY := 100&lt;br /&gt;
param $TreeOffset := &amp;quot;1e1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Sequence with Keys(Makefile.config for 2D Clustering)&lt;br /&gt;
$Config :=	(&amp;quot;CLUSTER&amp;quot;:$CLUSTER) |&lt;br /&gt;
			(&amp;quot;PADWIDTH&amp;quot;:$PADWIDTH) |&lt;br /&gt;
			(&amp;quot;PADHEIGHT&amp;quot;:$PADHEIGHT) |&lt;br /&gt;
			(&amp;quot;SHRINK&amp;quot;:$SHRINK) |&lt;br /&gt;
			(&amp;quot;PADMODE&amp;quot;:$PADMODE) |&lt;br /&gt;
			(&amp;quot;LowPassMode&amp;quot;:$LowPassMode) |&lt;br /&gt;
			(&amp;quot;LowPassResolution&amp;quot;:$LowPassResolution) |&lt;br /&gt;
			(&amp;quot;ClusterCorrelationMode&amp;quot;:$ClusterCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMin&amp;quot;:$ClusterRotationRangeMin) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangeMax&amp;quot;:$ClusterRotationRangeMax) |&lt;br /&gt;
			(&amp;quot;ClusterRotationRangePartitionNumber&amp;quot;:$ClusterRotationRangePartitionNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationIterationNumber&amp;quot;:$ClusterRotationIterationNumber) |&lt;br /&gt;
			(&amp;quot;ClusterRotationCorrelationMode&amp;quot;:$ClusterRotationCorrelationMode) |&lt;br /&gt;
			(&amp;quot;ClusterMode&amp;quot;:$ClusterMode) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionX&amp;quot;:$TreeRootPositionX) |&lt;br /&gt;
			(&amp;quot;TreeRootPositionY&amp;quot;:$TreeRootPositionY) |&lt;br /&gt;
			(&amp;quot;TreeScaleX&amp;quot;:$TreeScaleX) |&lt;br /&gt;
			(&amp;quot;TreeScaleY&amp;quot;:$TreeScaleY) |&lt;br /&gt;
			(&amp;quot;TreeOffset&amp;quot;:$TreeOffset)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パラメータを設定しています。$TreeOffset := &amp;quot;1e1&amp;quot;のようにeを使用するような数値はPIONEの記法にはありませんので、&amp;quot; &amp;quot;で囲んで一旦文字列として設定しておきます。また、Makefile.configに書き出す処理を簡潔にするために設定したパラメータをキー付きシーケンスとして$Configに登録しています。新たにパラメータを追加したときは$Configにも追加するようにすれば後述で作成されるMakefile.configにも追加されるようになります。Configに値を直接登録することもできますが、実行ユーザが[[pione-client#オプション --params]]を利用してパラメータ設定できるようにparamで定義してから登録しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
では、Makefile.config作成用のルールを作成して、Mainに追加します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rule SetParam&lt;br /&gt;
	output 'Makefile.config'&lt;br /&gt;
Action&lt;br /&gt;
	key=({$Config.keys})&lt;br /&gt;
	value=({$Config.values})&lt;br /&gt;
	for (( i=0; i&amp;lt;{$Config.length}; i++ ))&lt;br /&gt;
	do&lt;br /&gt;
		echo &amp;quot;${key[${i}]}=${value[${i}]}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	done&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
それぞれのパラメータをキー付きシーケンスとしてConfigに登録しているので、[[PIONEの式#キー付きシーケンス]]のメソッドkeysとvaluesを利用してパラメータ名と値を得ることができますので、Makefile.configに書き込むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetParamで作成したMakefile.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CLUSTER=all&lt;br /&gt;
PADWIDTH=32&lt;br /&gt;
PADHEIGHT=32&lt;br /&gt;
SHRINK=1&lt;br /&gt;
PADMODE=13&lt;br /&gt;
LowPassMode=4&lt;br /&gt;
LowPassResolution=0.1&lt;br /&gt;
ClusterCorrelationMode=19&lt;br /&gt;
ClusterRotationRangeMin=0&lt;br /&gt;
ClusterRotationRangeMax=360&lt;br /&gt;
ClusterRotationRangePartitionNumber=72&lt;br /&gt;
ClusterRotationIterationNumber=2&lt;br /&gt;
ClusterRotationCorrelationMode=0&lt;br /&gt;
ClusterMode=2&lt;br /&gt;
TreeRootPositionX=0&lt;br /&gt;
TreeRootPositionY=400&lt;br /&gt;
TreeScaleX=10&lt;br /&gt;
TreeScaleY=100&lt;br /&gt;
TreeOffset=1e1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
元のMakefile.configと同様のファイルを作成することができました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分類の点数付け ====&lt;br /&gt;
[[単粒子解析#クラスター解析]]で行った分類されたグループと元のモデルとの一致数を算出する処理を追加してみましょう。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For GroupingPoint&lt;br /&gt;
param $filename := &amp;quot;121p-shift2&amp;quot;&lt;br /&gt;
param $ROT2 := (0.upto(3)) * 45&lt;br /&gt;
&lt;br /&gt;
Rule GroupingPoint&lt;br /&gt;
	input '*.lst'.all&lt;br /&gt;
	input '*.tree'.all&lt;br /&gt;
	output '{$CLUSTER}.groupinfo'&lt;br /&gt;
Action&lt;br /&gt;
	array_rot2=( {$ROT2} )&lt;br /&gt;
&lt;br /&gt;
	total=0&lt;br /&gt;
	element_total=0&lt;br /&gt;
	for num in {$I[1][1]}&lt;br /&gt;
	do&lt;br /&gt;
		element_num=$(wc -l ${num}.lst | awk '{print $1}')&lt;br /&gt;
		element_total=$(( ${element_total} + ${element_num} ))&lt;br /&gt;
		data=$(head -1 ${num}.tree)&lt;br /&gt;
		root_i=$(echo ${data} | awk '{print $1}')&lt;br /&gt;
		root_name=$(basename $(awk -v i=${root_i} '$2==i {print $1}' ${num}.lst) &amp;quot;.pad&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
		max=0&lt;br /&gt;
		max_i=0&lt;br /&gt;
		i=0&lt;br /&gt;
		include_max_rot2=${array_rot2[0]}&lt;br /&gt;
		for rot2 in ${array_rot2[@]}&lt;br /&gt;
		do&lt;br /&gt;
			include_num=$(grep &amp;quot;{$filename}-0-${rot2}-&amp;quot; ${num}.lst | wc -l | awk '{print $1}')&lt;br /&gt;
			if [ ${include_num} -gt ${max} ] ; then&lt;br /&gt;
				max=${include_num}&lt;br /&gt;
				include_max_rot2=${rot2}&lt;br /&gt;
				max_i=${i}&lt;br /&gt;
			fi&lt;br /&gt;
			i=$(( ${i} + 1 ))&lt;br /&gt;
		done&lt;br /&gt;
		&lt;br /&gt;
		echo &amp;quot;group${root_i}:	match:	${max}	owner:	${include_max_rot2}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
		total=$(( ${total} + ${max} ))&lt;br /&gt;
		&lt;br /&gt;
		unset array_rot2[${max_i}]&lt;br /&gt;
		array_rot2=(&amp;quot;${array_rot2[@]}&amp;quot;)&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;quot;				total:	${total}&amp;quot; &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
	echo &amp;quot;${total} ${element_total}&amp;quot; | awk '{printf(&amp;quot;parcentage:	%f\n&amp;quot;, $1 / $2)}' &amp;gt;&amp;gt; {$O[1]}&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
今回、入力する使用ファイルはモデル有りで作成したサンプル画像のみを対象としています。（実際の[[電子顕微鏡]][[画像]]での分類の評価はもっと複雑で、手法としては[[クラスター解析]]や[[単粒子解析#クラスター解析]]で議論する内容）ファイル名がAAAA-0-Y-Z-S.roiのような画像（同ディレクトリMain_ROI.pioneで作成される）でYの回転の違いのみでグループ分けされることを前提として、モデルとの一致数を.groupファイルに出力します。上記のパラメータでは各グループをY回転0°, 45°, 90°, 135°の内、最も一致するグループに当てはめて、その一致数と割合を下記のように出力します。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
group000022:	match:	9	owner:	45&lt;br /&gt;
group000013:	match:	8	owner:	135&lt;br /&gt;
group000028:	match:	0	owner:	0&lt;br /&gt;
group000001:	match:	8	owner:	90&lt;br /&gt;
				total:	25&lt;br /&gt;
parcentage:	0.625000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
group0000NNのNNはグループ分けされたルートのNo.、owenerは最も一致した角度、matchは一致数をそれぞれ表します。またtotalは一致数の合計、percentageは割合です。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はYの回転のみで分類を評価していますが、パラメータやfor文、ログの記述部分などを追加することで、Xの回転も組み合わせて分類することは可能です。また、パラメータROT2は(0.upto(3)) * 45のように等間隔で角度を与えていますが、|で繋いで直接記述することでMain_ROIr.pioneで作成した画像のように等間隔でないファイルについても同様に評価することができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
param $ROT2 := (17.888783 | 114.250336 | 173.771591 | 273.340057)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Takahiro</name></author>	</entry>

	</feed>