前回に引き続き、電子実験ノートの自作の記事です。
今回は、電子実験ノートから計算機に job を投入し、同時にノートを作成する機能を実装していきます。
参考:電子実験ノートを自作してみた!導入コストゼロ!(1/5)
参考:リアルタイムで計算状況を表示するシステムの構築!【電子実験ノートを自作してみた!導入コストゼロ!】(2/5)
参考:CRUD を実装!電子実験ノートを自作してみた!導入コストゼロ!(3/5)
参考:ログイン機能を実装する。電子実験ノートを自作してみた!導入コストゼロ!(5/5)
構成
- html で入力フォームを作成する。POST メソッドと SESSION メソッドを組み合わせて変数を受け渡す。
- 計算機にリモートログインし、job を投入する。
- MySQL にデータを登録
今回の記事で必要なファイルは下リンクからダウンロードしてください。
入力フォームの作成
前回の記事と同様に <form> ファグで入力フォームを作成します。
<form action="" method="post" enctype="multipart/form-data">
<dt>計算 input ファイルを選択<span class="required">(必須)</span></dt>
<input type="file" name="input_file" size="35" placeholder="input file" />
<?php if($error['input_file'] == 'type'): ?>
<p class="error">*input ファイルは、[.com]または[.gjf]のファイルを指定して下さい</p>
<?php if (!empty($error)): ?>
<p class="error">*計算 input ファイルを正しく指定して下さい</p>
<dt>local_path を入力(入力がない場合は、/Users/username/Downloads)</dt>
<input type="text" name="input_file" size="60" maxlength="80" placeholder="/Users/username/Downloads" value="<?php print(htmlspecialchars($_POST['local_path'], ENT_QUOTES)); ?>" />
<dt>計算機を選択<span class="required">(必須)</span></dt>
<option value='7960x'>7960x</option>
<option value='ripper'>ripper</option>
<option value='3900x'>3900x</option>
<?php if($error['remote_path'] == 'blank'): ?>
<p class="error">*ファイルアップロード先を指定して下さい</p>
<dt>ファイルアップロード先(例: /home/intel7960x/project1/ts)<span class="required">(必須)</span></dt>
<input type="text" name="remote_path" size="60" maxlength="80" placeholder="アップロード先" value="<?php print(htmlspecialchars($_POST['remote_path'], ENT_QUOTES)); ?>" />
<?php if($error['remote_path'] == 'blank'): ?>
<p class="error">*ファイルアップロード先を指定して下さい</p>
<input type="text" name="calculation" size="60" maxlength="80" placeholder="計算の種類(opt, freq, NMR, scan, etc.)" value="<?php print(htmlspecialchars($_POST['calculation'], ENT_QUOTES)); ?>" />
<dt>計算の内容(ジョブ投入と同時に自動的にノートに記入)</dt>
<textarea rows="5" cols="50" placeholder="計算の内容" name="content" value="<?php print(htmlspecialchars($_POST['content'], ENT_QUOTES)); ?>"></textarea><br />
<div><input type="submit" value="上記の内容で計算を投入" /></div><br>
<form action="" method="post" enctype="multipart/form-data">
<dl>
<dt>計算 input ファイルを選択<span class="required">(必須)</span></dt>
<dd>
<input type="file" name="input_file" size="35" placeholder="input file" />
<?php if($error['input_file'] == 'type'): ?>
<p class="error">*input ファイルは、[.com]または[.gjf]のファイルを指定して下さい</p>
<?php endif; ?>
<?php if (!empty($error)): ?>
<p class="error">*計算 input ファイルを正しく指定して下さい</p>
<?php endif; ?>
</dd>
<dt>local_path を入力(入力がない場合は、/Users/username/Downloads)</dt>
<dd>
<input type="text" name="input_file" size="60" maxlength="80" placeholder="/Users/username/Downloads" value="<?php print(htmlspecialchars($_POST['local_path'], ENT_QUOTES)); ?>" />
</dd>
<dt>計算機を選択<span class="required">(必須)</span></dt>
<dd>
<select name='machine'>
<option value='7960x'>7960x</option>
<option value='ripper'>ripper</option>
<option value='3900x'>3900x</option>
</select>
<?php if($error['remote_path'] == 'blank'): ?>
<p class="error">*ファイルアップロード先を指定して下さい</p>
<?php endif; ?>
<dt>ファイルアップロード先(例: /home/intel7960x/project1/ts)<span class="required">(必須)</span></dt>
<dd>
<input type="text" name="remote_path" size="60" maxlength="80" placeholder="アップロード先" value="<?php print(htmlspecialchars($_POST['remote_path'], ENT_QUOTES)); ?>" />
<?php if($error['remote_path'] == 'blank'): ?>
<p class="error">*ファイルアップロード先を指定して下さい</p>
<?php endif; ?>
</dd>
<dd>
<dt>計算の種類</dt>
<input type="text" name="calculation" size="60" maxlength="80" placeholder="計算の種類(opt, freq, NMR, scan, etc.)" value="<?php print(htmlspecialchars($_POST['calculation'], ENT_QUOTES)); ?>" />
</dd>
<dd>
<dt>計算の内容(ジョブ投入と同時に自動的にノートに記入)</dt>
<textarea rows="5" cols="50" placeholder="計算の内容" name="content" value="<?php print(htmlspecialchars($_POST['content'], ENT_QUOTES)); ?>"></textarea><br />
</dd>
</dl>
<br>
<div><input type="submit" value="上記の内容で計算を投入" /></div><br>
</form>
<form action="" method="post" enctype="multipart/form-data">
<dl>
<dt>計算 input ファイルを選択<span class="required">(必須)</span></dt>
<dd>
<input type="file" name="input_file" size="35" placeholder="input file" />
<?php if($error['input_file'] == 'type'): ?>
<p class="error">*input ファイルは、[.com]または[.gjf]のファイルを指定して下さい</p>
<?php endif; ?>
<?php if (!empty($error)): ?>
<p class="error">*計算 input ファイルを正しく指定して下さい</p>
<?php endif; ?>
</dd>
<dt>local_path を入力(入力がない場合は、/Users/username/Downloads)</dt>
<dd>
<input type="text" name="input_file" size="60" maxlength="80" placeholder="/Users/username/Downloads" value="<?php print(htmlspecialchars($_POST['local_path'], ENT_QUOTES)); ?>" />
</dd>
<dt>計算機を選択<span class="required">(必須)</span></dt>
<dd>
<select name='machine'>
<option value='7960x'>7960x</option>
<option value='ripper'>ripper</option>
<option value='3900x'>3900x</option>
</select>
<?php if($error['remote_path'] == 'blank'): ?>
<p class="error">*ファイルアップロード先を指定して下さい</p>
<?php endif; ?>
<dt>ファイルアップロード先(例: /home/intel7960x/project1/ts)<span class="required">(必須)</span></dt>
<dd>
<input type="text" name="remote_path" size="60" maxlength="80" placeholder="アップロード先" value="<?php print(htmlspecialchars($_POST['remote_path'], ENT_QUOTES)); ?>" />
<?php if($error['remote_path'] == 'blank'): ?>
<p class="error">*ファイルアップロード先を指定して下さい</p>
<?php endif; ?>
</dd>
<dd>
<dt>計算の種類</dt>
<input type="text" name="calculation" size="60" maxlength="80" placeholder="計算の種類(opt, freq, NMR, scan, etc.)" value="<?php print(htmlspecialchars($_POST['calculation'], ENT_QUOTES)); ?>" />
</dd>
<dd>
<dt>計算の内容(ジョブ投入と同時に自動的にノートに記入)</dt>
<textarea rows="5" cols="50" placeholder="計算の内容" name="content" value="<?php print(htmlspecialchars($_POST['content'], ENT_QUOTES)); ?>"></textarea><br />
</dd>
</dl>
<br>
<div><input type="submit" value="上記の内容で計算を投入" /></div><br>
</form>
若干手間ですが、アップロードするファイルの path を入力するようにしてあります。
input type=”file” で選択したファイルの path を取得しようとすると別名で一時保存されたファイルの path が取られてしまいます。また、このままアップロードすると、別名のファイルがアップロードされてしまうので、計算機での job 投入コマンドで困ってしまいます。そのため、local_path を入力してもらっています。
続いて、POST メソッドで得た値をチェックし、OK ならば $_SESSION[‘submit’] メソッドに入れ、submit_check.php に遷移するようにします。
リモートログイン
submit_check.php で job の投入を行います。
第二回目の記事でもお話ししたように計算機へのログインには、ssh2_connect と ssh2_exec を使います。
上でダウンロードしたファイルの中の admin/submit_check.php というファイルを参照してください。
$filename = $_SESSION['submit']['filename'];
$local_path = $_SESSION['submit']['local_path'];
$remote_path = $_SESSION['submit']['remote_path'];
$machine_name = $_SESSION['submit']['machine'];
$content = $_SESSION['submit']['content'];
$calculation = $_SESSION['submit']['calculation'];
$content = "至急、計算内容を書き込んでください。";
$calculation = "not selected";
print("filename: " . $filename . "<br>");
print("local_path: " . $local_path . "<br>");
print("remote_path: " . $remote_path . "<br>");
print("machine_name: " . $machine_name . "<br>");
print("content: " . $content . "<br>");
print("calculation: " . $calculation . "<br>");
$job_number = job_submit($filename, $local_path, $remote_path, $machine_name);
echo $job_number . " を submit しました。";
$filename = $_SESSION['submit']['filename'];
$local_path = $_SESSION['submit']['local_path'];
$remote_path = $_SESSION['submit']['remote_path'];
$machine_name = $_SESSION['submit']['machine'];
$content = $_SESSION['submit']['content'];
$calculation = $_SESSION['submit']['calculation'];
if( $content == ""){
$content = "至急、計算内容を書き込んでください。";
}
if( $calculation == ""){
$calculation = "not selected";
}
print("filename: " . $filename . "<br>");
print("local_path: " . $local_path . "<br>");
print("remote_path: " . $remote_path . "<br>");
print("machine_name: " . $machine_name . "<br>");
print("content: " . $content . "<br>");
print("calculation: " . $calculation . "<br>");
echo "変数の設定 OK";
$job_number = job_submit($filename, $local_path, $remote_path, $machine_name);
echo $job_number . " を submit しました。";
$filename = $_SESSION['submit']['filename'];
$local_path = $_SESSION['submit']['local_path'];
$remote_path = $_SESSION['submit']['remote_path'];
$machine_name = $_SESSION['submit']['machine'];
$content = $_SESSION['submit']['content'];
$calculation = $_SESSION['submit']['calculation'];
if( $content == ""){
$content = "至急、計算内容を書き込んでください。";
}
if( $calculation == ""){
$calculation = "not selected";
}
print("filename: " . $filename . "<br>");
print("local_path: " . $local_path . "<br>");
print("remote_path: " . $remote_path . "<br>");
print("machine_name: " . $machine_name . "<br>");
print("content: " . $content . "<br>");
print("calculation: " . $calculation . "<br>");
echo "変数の設定 OK";
$job_number = job_submit($filename, $local_path, $remote_path, $machine_name);
echo $job_number . " を submit しました。";
リモートログインした際の注意ですが、各計算機で設定してある alias は基本的には使用不能です。.bashrc を読み込む必要があります。
ジョブ・スケジューラーを利用して job を投入するときには sh ファイルを作成し、それを qsub などのコマンドで投入する必要があります。
管理人は、script フォルダ内に、input ファイルの内容を読み取り sh ファイルを作成し job の submit までしてくれるという自作のプログラムを用意しています。さらに alias で kmkm と入力すれば呼び出せるように設定してありますが、php からのリモートログインではこのようなことはできません。
ssh2_exec でコマンドを実行する際には、alias を使わずにフルパスでスクリプトを呼び出す必要があります。例えば、”/script/kmkm input.com“のように。
また、ファイルのアップロードには、ssh2_scp_send という関数を使います。include/job_submit.php の中身を参照してください。
ノートを作成
前回の記事でも説明したように、INSERT コマンドを使って MySQL に登録します。
$query = $pdo->prepare('INSERT INTO report(title, content, calculation, machine, directory, job_number) VALUES (?, ?, ?, ?, ?, ?)');
$query = $pdo->prepare('INSERT INTO report(title, content, calculation, machine, directory, job_number) VALUES (?, ?, ?, ?, ?, ?)');
$query->execute(array(
$filename,
$content,
$calculation,
$machine_name,
$remote_path,
$job_number
));
echo "ノートに書き込みました。<br>";
$query = $pdo->prepare('INSERT INTO report(title, content, calculation, machine, directory, job_number) VALUES (?, ?, ?, ?, ?, ?)');
$query->execute(array(
$filename,
$content,
$calculation,
$machine_name,
$remote_path,
$job_number
));
echo "ノートに書き込みました。<br>";
第4回のまとめ
今回の記事では、電子実験ノートから直接 job を投入し、同時にノートの作成も行う方法を解説しました。
一見難しそうに見えますが、全て PHP と MySQL を組み合わせれば簡単に実装できます。
次回は、ログインシステムについてお話しします。