# SWC @ 千葉大学 2024-05-30, 2024-05-31 <https://software-carpentry.org/> <https://swcarpentry-ja.github.io/> ## リンク - [ワークショップ用HackMD](https://hackmd.io/@swcarpentry-ja/rkXVzlJV0) - [スライド](https://swcarpentry-ja.github.io/2024-05-30-chiba-slides/) - [ワークショップのホームページ](https://swcarpentry-ja.github.io/2024-05-30-chiba/) - [ワークショップ前のアンケート](https://carpentries.typeform.com/to/CvmMM8re?slug=2024-05-30-chiba) - [ワークショップ後のアンケート](https://carpentries.typeform.com/to/hIg7dK3r?slug=2024-05-30-chiba) ## マークダウン記法 https://qiita.com/tbpgr/items/989c6badefff69377da7 - "#"で見出し - "-"で箇条書き - "```"でコード埋め込み ```bash ls ``` ## 作業メモ by ヘルパー(5/30,31) - **シェル(Bash)** - URL: https://swcarpentry-ja.github.io/2024-05-30-chiba-slides/shell/ - [shell-lesson-data.zip](https://swcarpentry-ja.github.io/shell-novice/data/shell-lesson-data.zip)を事前にダウンロード - ターミナルを起動 - Windows: 事前にインストールしたGit Bash - スタートメニュー -> git bash と入力 - Mac OS: ターミナル.app - GUI vs CLIの説明 - ```ls # listの略(何があるかリストアップ)``` - ファイルシステムの説明 - ```pwd # print working directoryの略(パスの表示)``` - ルートディレクトリ、/の説明 - ```ls -F # 出力フォーマットの調整(環境によっては変化なし?)``` - ```clear # これまでの出力履歴を消す``` - ```ls --help # lsコマンドのヘルプファイルの表示(長いオプションは--と2回書く場合が多い)``` - ```man コマンド名 # manualの略(同じくヘルプファイルの表示)``` - チャレンジ: ls - ```cd ディレクトリ名 # change directoryの略 (別の作業ディレクトリに移動)``` - 応用例 - ```cd # ホームディレクトリに移動``` - ```cd .. # 上の階層に移動``` - ```cd ~ # 直前にいたディレクトリ``` - 絶対パス(ルートから見たパス) vs 相対パス(現在いるところから見たパス)の説明 - チャレンジ: 相対パス - シェルスクリプトの構文の説明 - 隠しファイル、隠しディレクトリ(.から始まるもの) - ```ls -a # で表示可能``` - ```ls --all # ロングフォームVer``` - ファイル、ディレクトリ操作 - ```mkdir ディレクトリ名 # make directoryの略(ディレクトリを作成)``` - 応用例 - ```mkdir -p dir1/dir2/dir3... # ネスト(入れ子)のディレクトリをいきなり作れる``` - ```ls -FR dir1 # ネストされたディレクトリを全て表示``` - ファイル名に適さない文字(スペース、-、~) - テキストエディタ(`nano`) - ```nano ファイル名 # nanoの起動``` 1. 何か書く 2. Ctrl + o: 保存 3. またはCtrl + X: nanoの終了、保存するか聞かれるから「Y」、Enter - ```cat ファイル名 # concatinateの略 (ファイルの中身を全部見る)``` - ```touch ファイル名 # ファイルが無い場合はファイルを作成、既にある場合はタイムスタンプを変更``` - 拡張子の説明 - ```rm ファイル名 # removeの略(ファイルの削除)``` - **!!!カーソルでゴミ箱に入れる場合と違い、完全に消えてしまうので注意!!!** - ```mv file1 file2 #ファイル/ディレクトリの移動、または名前の変更``` - ```cp file1 file2 # ファイルのコピー``` - ```cp -r dir1 dir2 # ディレクトリのコピー``` - ```rm -r dir # ディレクトリの削除``` - **!!!カーソルでゴミ箱に入れる場合と違い、完全に消えてしまうので注意!!!** - 複数のファイル、ディレクトリに同時に操作したい場合 1. 全部列挙する - ```cp file1 file2 dir # file1 file2をdir以下にコピー``` 2. ワイルドカード(*や?)を使う - ```cp file* dir # fileから始まるファイルをdir以下にコピー``` - チャレンジ: パターンに一致するファイル名 - こういう書き方は[正規表現](https://www.tohoho-web.com/perl/regexp.htm)ともいう - チャレンジ: ディレクトリとファイルの整理 - ターミナル上でCtrl + C(実行中のコマンドをキャンセル) - **Git** - URL: https://swcarpentry-ja.github.io/2024-05-30-chiba-slides/git/ - 教材: https://swcarpentry-ja.github.io/git-novice/01-basics.html - ```git config --global user.name "MYNAME" # ユーザー名の登録``` - ```git config --global user.email "myemail.address@gmail.com" # メールアドレスの登録``` - ```git init # 今いるディレクトリをgitレポジトリ(変更履歴の追跡対象)にする``` - ```ls -a # うまくいくと.gitが生成される``` - チャレンジ: gitレポジトリの中に、gitレポジトリを作ってしまったらどうなるか? - **使い方(基本)** 1. 何かファイル、ディレクトリを作成・変更する(e.g., ```nano mars.txt```) 2. ```git add ファイル名 # 追跡(Track)対象リストに追加``` 3. ```git commit -m "コミットメッセージ" # コミット(変更を保存)``` - ```git status # 現在の状況を表示``` - ```git log # ログ(これまでのコミットの履歴)を表示``` - ```git diff # 差分を表示(現在変更)``` - ```git diff --staged # 以前のコミットの差分を表示 ``` - コミットメッセージを囲むクォートは半角でなければいけません。プロンプトが `>dquote` となっている場合、正しくクォートを閉じられていないので、一度 `Ctl+C` でコマンドをキャンセルして、やり直すとよいです。 - **GitHub** - 他の人とともコードを共有するためのもの - とにかくローカルマシン上に秘密鍵(例 : id_rsa)、リモート側に公開鍵(例 : id_rsa.pub)がある状態を作る - それにより安全に通信できる - 秘密鍵と公開鍵のペアの生成 `ssh-keygen -t ed25519 -C "myemail.address@gmail.com"` - GitHub上で公開鍵をコピペ - `ssh -T git@github.com`でうまく通信できるかチェック - ローカル・リモート連携方法 - **1. 最初にローカルがあり、それをリモート側にpushパターン** - 同名の空リポジトリをリモート側で作る - `git remote add origin`でローカル側と連携 - `git remove -v`で確認 - **2. 最初にリモート側を作っておき、それからローカル側に落としてくるパターン** - `git clone https://github.com/ユーザー名/リポジトリ名.git`でローカルに落としてくる - 以降は普通に`git add/commit/push` - 共同作業 - 隣りの人をCollaboratorに設定、リモートリポジトリをgit cloneしてもらい、変更したものをpushしてもらう練習 - Host⇄Collaboratorの役割を逆にしてもう一度練習 - 衝突(Conflicts) - Hostがリモート側に変更を加えたことを、Collaborator側が気づかずに、`git push`したことでコンフリクトしたというシナリオ 1. ファイルに変更を加える 2. `git add/commit`をする 3. `git push origin main`をしたところrejectされる 4. `git pull`したところ、コンフリクトしているとわかる 5. 該当箇所を修正(Host側を残すか、Collab側を残すか、全く別の記述をするか) 6. `git push origin main`ができることを確認 ## 作業メモby ヘルパー(5/31) - **Docker** - URL: https://swcarpentry-ja.github.io/2024-05-30-chiba-slides/docker/ - Dockerとはコンテナ管理システム - コンテナ: 必要なデータやコードやライブラリを格納した実行中のプログラム(プロセス) - イメージ: コンテナを作るためのファイル、コンテナのベースとなるもの - コンテナと仮想マシンの違い - Docker Desktopを起動、右上にくじらのアイコンが表示されていることを確認 - **!!!注意: Dockerは常駐プログラムなので、最初に起動しておかないと、各種dockerコマンドは使えない!!!** - `docker container ls`をターミナルで実行 - 色々なオプションがあることを確認 - `docker --help` - `docker container --help` - `docker container ls --help` - `docker image --help` - `docker image ls --help` - `docker images --help` - `docker image pull hello-world`(または単に`docker pull hello-world`)でhello-worldイメージがダウンロードされる - `docker container run hello-world`(または単に`docker run hello-world`)でhello-worldの出力を確認 - `docker container run コンテナ内で実行するLinuxコマンド`で色々なことができる(`echo`, `cat`, `ls`, `whoami`, `pwd`...) - ```docker container run -it alpine sh # 対話モードで実行``` - ```exit # コンテナの中から出る場合(Ctrl + Dでも可)``` - チャレンジ: `ubuntu`コンテナ内部で`apt-get --help` - ```docker image rm イメージID```(または単に```docker rmi イメージID```)でイメージファイルを削除 - **!!!注意: そのイメージから作られたコンテナがまだ起動中だと削除できない!!!** - ```docker container ls```(または単に```docker ps```)で起動中のコンテナを一覧 - ```docker container ls --all```だと、起動はしていないけど、シャットダウンもされていない状態のコンテナ達で出力 - ```docker container prune # 全てのコンテナを削除``` - **DockerHub** - Dockerイメージを登録するところ - cf. PythonのDockerイメージ(https://hub.docker.com/_/python) - ```docker pull ユーザー名/イメージ名:タグ名``` - `3.8`や`latest`などタグの区別がある - 何も指定しないとlatest - チャレンジ: DockerHubから`rocker/tidyverse:3.6.1`を`docker pull` - 優良イメージの目安: プル数が多い、公式バッジが付いている組織・人 - [continuumio/miniconda3](https://hub.docker.com/r/continuumio/miniconda3) - [Bioconda](https://bioconda.github.io) - [rocker](https://hub.docker.com/u/rocker) - [Docker containers for Bioconductor](https://www.bioconductor.org/help/docker/) - Dockerコンテナを自作する - Dockerfileという名前のファイルを作成 ``` FROM alpine RUN apk add --update python3 py3-pip python3-dev CMD ["python3", "--version"] ``` - ```docker build -t 自分のユーザー名/イメージ名 .```(または単に```docker image -t 自分のユーザー名/イメージ名 .```)として、イメージを生成 - ```docker container run 自分のユーザー名/イメージ名 コマンド名 # 自作したイメージをコンテナ化 & 実行``` - ```docker image push # 自作したイメージをDockerHubに登録``` - **マウント(自分のPCのディレクトリとコンテナ内を接続する)** - ```docker container run --mount type=bind,source=${PWD},target=/temp alice/alpine-python python3 /temp/sum.py```(または単に```docker run -v $(pwd):/temp python3 /temp/sum.py```) - チャレンジ: マウントした後のコンテナ内部に対話モードで入る、ローカルファイルを触れるかチェック - ビルド時にイメージファイルの中にファイル(例: プログラム、データ)を入れる(`COPY`タグをDockerfile内で使う) - コンテナ内部にあるプログラムにパラメーターを渡したい - ❌ `CMD`だとコマンドとして解釈されてしまう - ⭕️ `ENTRYPOINT`タグを使う - `ENTRYPOINT`を設定したコンテナ内部には対話モードで簡単に入れない - `docker run -it`時に`--entrypoint /bin/sh`が別途必要 - Dockerfile集 - [joelnitta/pleurosoriopsis](https://github.com/joelnitta/pleurosoriopsis) - [joelnitta/targets_vcf_example](https://github.com/joelnitta/targets_vcf_example) - [kokitsuyuzaki/Dockerfiles](https://github.com/kokitsuyuzaki/Dockerfiles)