前回に引き続き、電子実験ノートの自作の記事です。
今回は、電子実験ノートから計算機に job を投入し、同時にノートを作成する機能を実装していきます。
参考:電子実験ノートを自作してみた!導入コストゼロ!(1/5)
参考:リアルタイムで計算状況を表示するシステムの構築!【電子実験ノートを自作してみた!導入コストゼロ!】(2/5)
参考:CRUD を実装!電子実験ノートを自作してみた!導入コストゼロ!(3/5)
参考:ログイン機能を実装する。電子実験ノートを自作してみた!導入コストゼロ!(5/5)
構成
- html で入力フォームを作成する。POST メソッドと SESSION メソッドを組み合わせて変数を受け渡す。
- 計算機にリモートログインし、job を投入する。
- MySQL にデータを登録
今回の記事で必要なファイルは下リンクからダウンロードしてください。
入力フォームの作成
前回の記事と同様に <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']; 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->execute(array( $filename, $content, $calculation, $machine_name, $remote_path, $job_number )); echo "ノートに書き込みました。<br>";
第4回のまとめ
今回の記事では、電子実験ノートから直接 job を投入し、同時にノートの作成も行う方法を解説しました。
一見難しそうに見えますが、全て PHP と MySQL を組み合わせれば簡単に実装できます。
次回は、ログインシステムについてお話しします。