千葉大学 2024-11-25 ~ 26
Etherpadにリンクとコードを貼っておきます。
千葉大学 国際学術研究院 准教授
研究テーマ:シダ植物の進化、生態学、ゲノム解析
趣味:ジョギング
パートタイマー
東京農工大学 理化学研究所 等
研究テーマ:パスウェイ-オミクスデータ マッピング・可視化
趣味:オープンサイエンスコミュニティに貢献すること
東京農工大学 工学府 生命工学専攻 修士課程
研究テーマ: 大規模コホートデータを用いたアルツハイマー病態進行予測に資する代謝物バイオマーカーの探索
趣味: ドライブ
千葉大学 医学研究院 人工知能(AI)医学 特任講師
研究テーマ: パッケージング、(シングルセル)オミックス解析
趣味: サーフィン、パン作り
どなたでも気兼ねなくワークショップに参加できるように、行動規範があります。
行動規範に反する行為があった場合は、インシデントレポートフォームで報告することができます。
このワークショップは 日本バイオインフォマティクス学会 の 公募研究会・地域部会として採択され、ご協力をいただいています。
非会員の方はぜひ入会をご検討ください。
ファイルのダウンロード
研究者は近年、コードを使うことが必要不可欠になっています。
多くの研究者は独学でコードを学びます。
しかし、効率があまり良くありません。
研究者がコミュニティを作り、互いに教え合います。
2日間にわたるワークショップで、3〜4つのレッスンを学びます。
誰でも参加可能
無料または少額で提供
ワークショップの指導には資格が必要です。
改善のためのフィードバックを重視します。
Slack
#local-japan
チャンネルに入ってください。上記のリンクからレッスンの内容にアクセスできます
(ChatGPTによる翻訳が含まれています)
軽いスライドによる内容の説明
ライブコーディング
インストラクターが入力するコードを、同時に自分のパソコンで入力します。
コードを理解することを最優先してください
(メモを取るよりも)。
インストラクターは参加者の理解を確認します
(例:「〜ができましたか?」)
理解できている場合は緑の付箋をラップトップに貼ってください。
困ったことがある場合は赤い付箋をラップトップに貼ってください。
インストラクターが聞かなくても、何か問題があった時は声をかけてください(または赤い付箋を貼ってください)。
Etherpadにコードを貼っておきます。
感想(1日の終わりに付箋に記入していただきます)
ワークショップ前後のアンケート
隣の方に自己紹介をしましょう
研究テーマは何ですか?
趣味は何ですか?
shell-lesson-data.zipをダウンロードして、デスクトップに移動してください。
ファイルを解凍します。デスクトップにshell-lesson-data
という新しいフォルダが作成されているはずです。
人間はGUI(グラフィカルユーザインターフェース)またはCLI(コマンドラインインターフェース)を使ってコンピュータと対話します。
GUI: 視覚的で直感的な操作が可能ですが、反復作業には効率的ではありません。
CLI(Unixシェル): 反復作業に効率的で、タスクを迅速に自動化できます。
シェルはユーザーが入力したコマンドを解釈し、実行します。
よく使われるUnixシェル: Bash(Bourne Again SHell)。
シェルを使う利点:
サンプルデータセットは”Nelle Nemo”のストーリーに基づいています。
Nelle Nemoは海洋生物学者で、海洋生物をサンプリングしています。
Nelleのタスク: goostats.sh
を使って1520のサンプルのタンパク質量を測定します。
課題: GUIを使用すると、Nelleは1520のファイルを手動で実行する必要があり、12時間以上かかります。シェルを使えば、これをより効率的に行うことができるでしょうか?
ls
pwd
が/Users/thing
を表示している場合、ls -F ../backup
は何を表示しますか?
../backup: No such file or directory
2012-12-01 2013-01-08 2013-01-27
2012-12-01/ 2013-01-08/ 2013-01-27/
original/ pnas_final/ pnas_sub/
以下のコマンドシーケンスで、最後のlsコマンドの出力はどうなりますか?
/Users/jamie/data
proteins.dat
$ mkdir recombined
$ mv proteins.dat recombined/
$ cp recombined/proteins.dat ../proteins-saved.dat
$ ls
proteins-saved.dat
recombined
recombined
proteins.dat
recombined
proteins-saved.dat
Jamieはプロジェクトに取り組んでいますが、ファイルがあまり整理されていないことに気づきました:
analyzed/ fructose.dat raw/ sucrose.dat
fructose.dat
とsucrose.dat
のファイルはデータ解析の出力を含んでいます。 以下のコマンドが示す出力を得るために、Jamieはどのコマンドを実行する必要がありますか?
analyzed/ raw/
fructose.dat sucrose.dat
以下のコミットメッセージの内、最後の mars.txt
のコミットに最適なメッセージはどれでしょう?
bio
リポジトリbio
という Git リポジトリ新しく作りましょう。me.txt
というファイルに自分について3文書いて、変更点をコミットしてください。以下の内、myfile.txt
を Git リポジトリに保存するためのコマンドはどれでしょう?
HEAD~1
の意味ジェニファーは、数週間取り組んできたPythonスクリプトに変更を加えました。そして今朝行った変更により、スクリプトが “壊れ”、動作しなくなりました。 彼女はそれを修正しようとして約1時間費やしましたが、うまく機能しません…
幸い、彼女はGitを使用してプロジェクトのバージョンを追跡していました! 以下のどのコマンドで、data_cruncher.py
と呼ばれるPythonスクリプトの最後にコミットされたバージョンを復元できるでしょうか?
$ git restore
$ git restore data_cruncher.py
$ git restore -s HEAD~1 data_cruncher.py
$ git restore -s <最後のコミットのID> data_cruncher.py
2番と4番の両方
以下のようなディレクトリ構造があるとします:
results/data
ではなく、results/plots
のみを無視するにはどうすればよいでしょう?
仮に log_01
、log_02
、log_03
といった中間ログファイルを作成するスクリプトを書いたとします。 これらのログファイルは保存しておきたいものの、gitで追跡したくありません。
log_01
、log_02
などのファイルを無視するためのルールを1つだけ.gitignore
に記入してください。log_01
などのファイルを作成してください。log_01
ファイルが重要であると判明しました。.gitignore
を編集せずにこのファイルを追跡対象に加えてください。リモートリポジトリに接続する前に、自分のコンピュータをGitHubに認証する方法を設定する必要があります。
これにより、GitHubはあなたのコンピュータからのアクセスを信頼します。
コマンドラインでアクセスを認証する一般的な方法を設定します。
この方法は「Secure Shell Protocol(SSH)」と呼ばれます。
SSHは、暗号化されたネットワークプロトコルで、通常は安全でないネットワークを介して安全な通信を可能にします。
GitHub の planets
リポジトリに移動してください。
「Code」ボタンの下にある「XX commits」というテキストを見つけてクリックします(「XX」は数字です)。各コミットの右側にある3つのボタンにカーソルを合わせてクリックします。
これらのボタンからどのような情報を収集・探索できますか?
シェルで同じ情報を得るにはどうしますか?
今回の課題は、ペアを組んで行います。
一人は「オーナー」、もう一人は「コラボレーター」を担当します。
コラボレーターの目標は、オーナーのリポジトリに変更を加えることです。
最後に役割を交代し、両方の人がオーナーとコラボレーターの役割を経験します。
コラボレーターはオーナーのリポジトリのコピーを自分のマシンにダウンロードします(クローンする)。
自分の planets.git
バージョンを上書きしないよう、オーナーのリポジトリを別の場所にクローンしてください。
デスクトップフォルダにクローンする場合:
vlad
をオーナーのユーザー名に置き換えてください。
クローンパス(~/Desktop/vlad-planets
)を指定しない場合、自分の planets
フォルダ内にクローンされるので、最初にデスクトップフォルダに移動してください。
オーナーのリポジトリを再確認し、コラボレーターが行った新しいコミットを確認します。
ブラウザを更新する必要がある場合もあります。
オーナーがコラボレーターに情報を提供せずにリポジトリにコミットをプッシュしました。
コマンドラインでは、コラボレーターは何が変更されたかをどのように確認できますか?
GitHub ではどのように確認できますか?
千葉大学 2024-11-26
Etherpadにリンクとコードを貼っておきます。
「ふせんのおかげで質問や意思表示がしやすかった」
「よくわからないことがあった時にすぐにサポートに来ていただいて大変助かりました」
「トラブルが起きても言いやすい環境だったのが良かった」
ホワイトボードの文字(図)が見づらい → 濃いペンを使います!大きく書きます!
画面の文字が少し小さい → 大きくしました
ユーザー名やディレクトリ名が色分けされるようなターミナルを用いてくれると嬉しい → ターミナルの設定を変えました
「何のためにどうしてコマンドを行うのか、何に使うことができるのか、説明があると嬉しかったです」 → 背景の説明を増やします
コラボレーターの方にだけ 1 行追加してみましょう。
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
This line added to Wolfman's copy
コラボレーターの方で変更をコミットします。
[main 5ae9631] Add a line in our home copy
1 file changed, 1 insertion(+)
コラボレーターの方でコミットを GitHub にプッシュします。
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 331 bytes | 331.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/vlad/planets.git
29aba7c..dabb4c8 main -> main
オーナーが GitHub から pull せずに、自分のコピーに「別の」変更を加えてもらいます。
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
We added a different line in the other copy
オーナーは変更をローカルにコミットできます:
[main 07ebc69] Add a line in my copy
1 file changed, 1 insertion(+)
しかし、オーナーは Git で GitHub にプッシュできません。
To https://github.com/vlad/planets.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/vlad/planets.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Git は、リモート リポジトリにローカル ブランチに組み込まれていない新しい更新があることを検出したため、プッシュを拒否しました。
必要なのは、GitHub から変更を pull し、現在作業中のコピーにマージしてからプッシュすることです。 まずは pull から始めましょう:
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/vlad/planets
* branch main -> FETCH_HEAD
29aba7c..dabb4c8 main -> origin/main
Auto-merging mars.txt
CONFLICT (content): Merge conflict in mars.txt
Automatic merge failed; fix conflicts and then commit the result.
git pullコマンドは、ローカル リポジトリを更新して、リモート リポジトリにすでに含まれている変更を組み込みます。 リモート ブランチからの変更が取得された後、Git はローカル コピーに加えられた変更がリモート リポジトリに加えられた変更と重複していることを検出し、 以前の作業が損なわれないように 2 つのバージョンのマージを拒否します。 コンフリクトは、影響を受けるファイルで下記のようにマークされます。
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
<<<<<<< HEAD
We added a different line in the other copy
=======
This line added to Wolfman's copy
>>>>>>> dabb4c8c450e8475aee9b14b4383acc99f42af1d
このファイルを編集して、これらのマーカーを削除し、変更を調整するのは私たちの仕事です。 ローカル リポジトリでの変更を維持するか、リモート リポジトリでの変更を維持するか、両方を置き換える新しいものを書き込むか、変更を完全に削除するか、何でも好きなように行うことができます。 両方を置き換えて、ファイルを次のようにしてみましょう。
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
We removed the conflict on this line
On branch main
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: mars.txt
[main 2abf2b1] Merge changes from GitHub
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 645 bytes | 645.00 KiB/s, done.
Total 6 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), completed with 2 local objects.
To https://github.com/vlad/planets.git
dabb4c8..2abf2b1 main -> main
Git は何を何とマージしたかを追跡しているので、最初の変更を行ったコラボレーターが pull したときに、再度手作業で修正する必要がありません。 今度はコラボレーターが pull してください
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 4), reused 6 (delta 4), pack-reused 0
Unpacking objects: 100% (6/6), done.
From https://github.com/vlad/planets
* branch main -> FETCH_HEAD
dabb4c8..2abf2b1 main -> origin/main
Updating dabb4c8..2abf2b1
Fast-forward
mars.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
コラボレーターはオーナーにマージされた内容を確認してみましょう
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
We removed the conflict on this line
次の中で有効なRの変数名はどれですか?
上記のコードを実行し、massとageを比較するコマンドを書きましょう。massはageより大きいですか?
作業環境を整理し、massとageの変数を削除しましょう。
以下のパッケージをインストールしてみましょう:
質問:
目的:
RStudio で新しいプロジェクトを作成してみましょう:
ファイルシステムを使って RStudio のプロジェクトを開いてみましょう:
このリンクから CSV ファイルをダウンロードしてください。
gapminder_data.csv
という名前で保存されていることを確認します。data/
フォルダに保存します。後ほどこのデータを読み込み、確認します。
R に読み込む前に、コマンドラインからデータセットについての一般的な情報を得ることは有益です。 これにより、R に読み込む際の判断に役立ちます。コマンドラインシェルを使用して以下の質問に答えてください:
ヒント: RStudio のコンソールペインにある「Terminal」タブを使用すると、RStudio 内で直接コマンドラインを操作できます。
getwd() コマンドを使用するか、RStudio のメニューを使って現在の作業ディレクトリを確認します。
setwd() コマンドを使用するか、RStudio のメニューを使って作業ディレクトリを変更します。
質問
目的
下記の例を試して、それぞれが何を返すのかを説明してください。
ヒント: 返されるものを調べるには、typeof() 関数を使用してください。
次の構文を使用して、新しいデータフレームを R 内で作成できます:
以下の情報を持つデータフレームを作成してください:
次に、rbind を使用して隣の人のエントリを追加しましょう。 最後に、cbind を使用して「コーヒーブレイクの時間ですか?」という質問への各人の回答を含む列を追加してください。
データの最後の数行や中間のいくつかの行も確認するのが良い習慣です。これをどのように行いますか?
特に中間の行を探すのは難しくありませんが、ランダムな行をいくつか取得することもできます。これをどのようにコード化しますか?
File -> New File -> R Script に移動し、gapminder
データセットを読み込むための R スクリプトを作成します。このスクリプトを scripts/
ディレクトリに保存し、バージョン管理に追加してください。
その後、source
関数を使用してスクリプトを実行します。ファイルパスを引数として指定するか、RStudio の「Source」ボタンを押します。
質問
目的
次のコードが与えられた場合:
a b c d e
5.4 6.2 7.1 4.8 7.5
次の出力を生成する少なくとも 2 つの異なるコマンドを考え出してください:
b c d
6.2 7.1 4.8
2 つの異なるコマンドを見つけたら、隣の人と比較してみてください。異なる戦略を持っていましたか?
以下のコードを用いて:
a b c d e
5.4 6.2 7.1 4.8 7.5
x
から 4 より大きく 7 未満の値を返すサブセットコマンドを書いてください。
ベクトルの要素を、特定のリスト内のいずれかと一致させる操作は、データ解析で非常に一般的なタスクです。 例えば、gapminder
データセットには country
と continent
の変数がありますが、これらの間の情報は含まれていません。 東南アジアの情報を抽出したいとします。このとき、どのようにして東南アジアのすべての国について TRUE
、それ以外を FALSE
とする論理ベクトルを作成しますか?
以下のデータを使用します:
以下の3つの方法を試し、それぞれがどのように(正しくない、または正しい方法で)動作するのか説明してください:
==
のみを使用)==
と |
を使用)%in%
を使用)以下の一般的なデータフレームサブセットエラーを修正してください:
continent
と lifeExp
)を抽出するなぜ gapminder[1:20]
はエラーを返すのでしょうか? gapminder[1:20, ]
とはどう異なるのでしょうか?
行 1 から 9 と 19 から 23 のみを含む新しい data.frame
を作成し、それを gapminder_small
と名付けてください。この操作は 1 ステップまたは 2 ステップで行うことができます。
質問
目的
例を修正して、平均寿命が時間とともにどのように変化したかを示す図を作成してください:
ヒント:gapminder
データセットには “year” という列があり、これを X 軸に表示する必要があります。
ポイントレイヤーとラインレイヤーの両方を入れてみてください。何が起こるでしょうか?
前の例のポイントレイヤーで、ポイントの色とサイズを変更してください。
ヒント:aes
関数を使用しないでください。
ヒント:ポイントに対する linewidth
に相当するものは size
です。
チャレンジA の解答を修正し、ポイントの形状を変更し、大陸ごとに異なる色と新しいトレンドラインを追加してください。
ヒント:color
引数は aes
関数のマッピング内で使用できます。
異なる大陸間で利用可能な年における平均寿命を比較するボックスプロットを生成してください。
応用:
‘pdf’ コマンドを変更して、PDFの2ページ目を作成し、 同じデータを使って facet_grid
を使用して大陸ごとに1つのパネルを表示するプロットを追加してください。
gapminder
データを1990年以降に収集されたデータポイントのみを含むようにサブセット化する データクリーニングスクリプトファイルを作成してください。
このスクリプトを使用して、新しいサブセットを cleaned-data/
ディレクトリに保存してください。
「公開しても大丈夫」という方は、ぜひご協力ください。
後ろから撮影した集合写真を公開する場合があります。もし公開を希望されない場合は、お知らせください。