# スパコン実習 ## スパコンへのログイン この実習で使うのはヒトゲノムセンター(HGC)にあるスーパーコンピュータです。使い方のWikiは[ここ](https://supcom.hgc.jp/internal/mediawiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)です。SecureCell(SSH)というプロトコルを用いて、安全に接続できます。 鍵認証方式でログインします。まず、[HGCでの公開鍵の登録方法](https://supcom.hgc.jp/internal/mediawiki/%E5%85%AC%E9%96%8B%E9%8D%B5%E7%99%BB%E9%8C%B2%E3%83%9A%E3%83%BC%E3%82%B8%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95)の指示に従って、鍵を生成し、公開鍵をHGCに登録します。 ### Unix/Linux,MacOSの場合 これらのOSではすでに接続に必要はソフトウェアが揃っています。sshというコマンドを使って、スパコンに接続します。 [HGCのWiki](https://supcom.hgc.jp/internal/mediawiki/%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95_(UNIX/Linux%E3%80%81Mac_OS_X_%E3%81%AE%E5%A0%B4%E5%90%88))に従って接続してみましょう。 ### Windowsの場合 Macの場合はsshというコマンドでスパコンに接続することができたのですが、Windowsではこのコマンドが入っていません。なので、SSHで通信するために、SSHのクライアントをダウンロードします。この実習では、Windowsで動作するSSHクライアントであるTeraTermを使います。 #### TeraTermのインストール [TeraTerm公式サイト](https://ja.osdn.net/projects/ttssh2/)よりインストールします。このサイトの説明に従って、最新版をインストールしましょう。 #### 接続 WindowでのWikiは[これ](https://supcom.hgc.jp/internal/mediawiki/%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95_(Windows_%E3%81%AE%E5%A0%B4%E5%90%88))です。説明に従って接続してみましょう。 ### 接続できたら 今接続したのは、ログイン用の計算ノードなので、機能が制限されています。そこで、```qlogin```と入力し、エンターキーで実行し、様々な機能を持ったノードにログインします。 ## Linux入門 ### 基本コマンド 普段はマウスやキーボードでパソコンの操作を行っていると思いますが、ここではコマンドで操作する必要があります。基本的なコマンドを試してみましょう。 #### ```pwd``` 現在のディレクトリを確認するコマンドです。実行すると現在のディレクトリのパスが表示されます。パスとはファイルシステムでの場所を示すものです。 ログイン直後は、自分のホームディレクトリにいるはずです。ホームディレクトリは自分が自由に使えるディレクトリのことで、```~```という記号で表されます。 試しに```echo ~```と実行してみてください。pwdと同じ結果が得られると思います。 #### ```ls``` 現在のディレクトリに存在するファイル、ディレクトリの一覧を表示します。今のディレクトリの中身を確認してみましょう。 #### ```man``` コマンドのマニュアルを表示します。試しにさきほどの`ls`のマニュアルを確認してみてください。`ls`のさまざまなオプションが書いてあります。 たとえば`ls -l`とすると詳細が表示されます。 #### ```mkdir``` 現在のディレクトリに、新しいディレクトリを作成します。 ```mkdir [新しいディレクトリの名前]```とすると、今のディレクトリの下に新しいディレクトリを作成できます。試しにtestというディレクトリを作成してみてください。 #### ```cd``` ディレクトリを移動します。```cd [移動先のパス]```として移動します。では、先ほど作成したtestというディレクトリに移動してください。 パスの指定では、`.`や`..`という記号が使えます。`.`は現在のディレクトリ、`..`は現在のディレクトリの一つ上のディレクトリを表します。例えば`../..`は今いるディレクトリの二つ上のディレクトリを表します。このように、現在のディレクトリからの相対的な位置によって表されたパスを相対パスといいます。それに対して、`pwd`で得られた結果のように`/`から始まっているパスは、絶対パスと呼ばれます。`/`はファイルシステムの一番上のディレクトリであり、そこからのルートを示しています。 #### ```touch``` 指定したファイルのタイムスタンプを変更します。指定した名前のファイルが存在しない場合、その名前のファイルを作成します。試しに、test.txtというファイルを作成してみてください。 #### ```cat``` ファイルの中身を表示するのに使用できます。先ほど作成したtest.txtの中身をこのコマンドで確認してみましょう。まだ作っただけなので、なにも表示されません。 #### ```echo``` ```echo [text]```とすると、[text]を出力します。 試しに、```echo Hello, Linux```を実行してみましょう。 このコマンドとリダイレクト(```>```)というものを組み合わせて、ファイルの内容を編集することができます。 リダイレクトを使うと、出力をそのまま表示させるのではなく、出力の中身をファイルに書き込むことができます。 ```` echo [好きなテキスト]>test.txt ```` としてみましょう。こうすると、テキストの内容がtest.txtに書き込まれます。変更が反映されているかどうかを```cat```で確認してください。 #### ```cp``` ファイルなどをコピーするのに使うコマンドです。 `cp [コピーしたいターゲットのパス] [コピーされたターゲットのパス]`で使います。 #### ```mv``` ファイルやディレクトリの場所を変更します。 ```mv [移動するファイル/ディレクトリのパス] [移動先のディレクトリのパス]```の順で指定します。 #### ```vi``` テキストの作成、編集を行うコマンドです。 ```vi [ファイル名]```と入力すると、テキストを編集することができます。ファイルが存在しない場合は、新たにファイルが作られます。 具体的な使い方は、後でこのコマンドを使う際に詳しく説明します。 #### ```for``` ```` for 変数 in (値のリスト); do 行いたい処理 done ```` という形式で、ループを書くことができます。試しに、下のコードを実行してみてください。 ```` list=`seq 1 100` for i in $list; do echo $i done ```` `seq 1 100`は1から100までの自然数のリストを作成します。リストを`list`という変数に格納して、for文で`list`の変数を順番に表示させました。`$`は変数の中身を参照する場合に使います。 #### `if` 基本的な形は ```` if 条件式;then 行いたい処理 fi ```` です。複数の条件によって分岐をさせたい場合 ```` if 条件式1;then 条件式1が成立するときに行われる処理 elif 条件式2;then 条件式2が成立するときに行われる処理 else 条件式1も条件式2も成立しない時に行われる処理 fi ```` のようにして分岐をさせることができます。 条件式の書き方は[この記事](https://qiita.com/toshihirock/items/461da0f60f975f6acb10)を参照してください。詳細な条件式の書き方は`man test`で確認することができます。 ### 整数の四則演算 ```$((式))```の形で、整数の四則演算を行います。 次のコマンドを試してみてください。 ```` echo $((3+5)) #足し算 echo $((3-5)) #引き算 echo $((3*5)) #乗算 echo $((3/5)) #除算 echo $((3%5)) #あまり ```` ### 演習 今までのコマンドを組み合わせてやってみましょう。解答例はこのページの一番下に書いてあります。 1. 1~100までの数字を出力してください 2. 1で、数字が3の倍数の時にはその数字ではなくFizzを出力してください 3. 数字が3の倍数の時にはFizzを、その数字が5の倍数のときにはBuzzを出力してください。また、その数字が3の倍数かつ5の倍数である時にはFizzBuzzを出力してください <!-- ### 発展演習 sam? --> ## UGE 時間がかかるジョブを行いたい場合などは、終わるまでずっとスパコンと接続しておいたりするのは大変です。また、qloginした場合、確保されるCPUコアは 1、メモリは5.3GBでそれほど多くありません(実際はオプションで変更することもできます)。 時間がかかるジョブやメモリを多く使う場合では、ジョブをスクリプトに記述し、実行させます。このスパコンではUniva Grid Engine(UGE)というシステムがジョブを管理しています。 ### qsub qsubはジョブを投入するためのコマンドです。スクリプトを作成し、実際にジョブを投入してみましょう。 はじめに、qsub.shというファイルを作ります。スパコン上では、マウスで「新規作成」を押すというようなグラフィカルな操作でファイルを作ることはできません。今回は```vi```コマンドを使って、キーボードの操作でファイルを作成します。 まず、 ```vi qsub.sh``` と入力してください。何も書かれていないファイルが開かれるはずです。 ファイルを開いた時点では、テキストの編集ができないノーマルモードと呼ばれる状態です。 キーボードの```i```を押すと、インサートモードに切り替わり、テキストが編集できるようになります。切り替えができていれば、画面の下の方に-- INSERT --と表示されているはずです。 次に、以下のテキストをコピペしてください。 ``` #!/bin/bash #$ -S /bin/bash #$ -cwd echo "wrote by qsub to stdout" >&1 echo "wrote by qsub to stderr" >&2 ``` キーボードの右上の方にある```est```というキーを叩くと、再びノーマルモードに切り替わります。 ノーマルモードで```:wq```と入力し、```Enter```を押すと、編集を保存した上でviを閉じることができます。 ```ls```コマンドを打ち、qsub.shが作成されたことを確認してください。 次のコマンドでジョブを投入します。 ``` qsub qsub.sh ``` ```qstat```でジョブの状態を確認することができます。 stateがqwのときはジョブの実行待ち、rのときはジョブを実行中であることを表します。 ```qstat```と打って、何も表示されなくなったらジョブが完了しています。 ジョブが完了すると、qsub.sh.e[ジョブ番号]とqsub.sh.o[ジョブ番号]のファイルができているはずです。.oのファイルにはジョブの実行結果、.eのファイルにはエラーが記述されています。 ### アレイジョブ 複数のジョブを同時に実行させることができます。 array.shを作成し、次のように編集してください。 ``` #!/bin/bash #$ -S /bin/bash #$ -t 1-10 #$ -cwd #$ -o /dev/null #$ -e /dev/null dir=array_job/ echo $SGE_TASK_ID > $dir$SGE_TASK_ID.txt sleep 10 ``` 先ほどと同様に、ジョブを投入します。 ``` qsub array.sh ``` qstatで確認してみましょう。タイミングがよければ複数のジョブが実行されているところを確認できます。 qwはジョブの実行待ち、rはジョブを実行中であることを表します。 ## 解答 ### Linux演習解答 1. 1~100までの数字を出力してください ```` list=`seq 1 100` for i in $list; do echo $i done ```` 2. 1で、数字が3の倍数の時にはその数字ではなくFizzを出力してください ```` list=`seq 1 100` for i in $list; do if [ $(($i%3)) -eq 0 ];then echo Fizz else echo $i fi done ```` 3. 数字が3の倍数の時にはFizzを、その数字が5の倍数のときにはBuzzを出力してください。また、その数字が3の倍数かつ5の倍数である時にはFizzBuzzを出力してください ```` list=`seq 1 100` for i in $list; do if [ $(($i%15)) -eq 0 ];then to_print=FizzBuzz elif [ $(($i%3)) -eq 0 ];then to_print=Fizz elif [ $(($i%5)) -eq 0 ];then to_print=Buzz else to_print=$i fi echo $to_print done ```` vimの書き方 [](fastqを渡してsamtools、ジョブを投げる、watch qstast) qstatの説明
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up