インストラクター用メモ

  • なぜシェルを学ぶのでしょうか?
    • ユーザーが繰り返し作業を自動化できるようになるため
    • 通常記録されない小さなデータ操作手順を記録し、 研究を再現可能にするため
  • 問題点
    • 同じワークフローを複数のサンプルで実行するのは不必要に労力がかかる場合がある
    • データファイルの手動操作は以下のような課題がある:
      • 文書化に記録されないことが多い
      • 再現が困難
      • 問題の解決やレビュー、改善が難しい
  • シェルの利点
    • シェルスクリプトを使用することでワークフローを自動化できる
    • 組み込みコマンド(例: sortgrep など)により簡単にデータ操作が可能
    • すべての手順をシェルスクリプトで記録できるため、再現性や問題解決が容易になる

全体的な考察


シェルをまだ教えるべきかどうか、多くの人が疑問を抱いています。 結局のところ、数千のデータファイルを名前変更するには、 Python インタプリタで簡単にインタラクティブに実行できますし、 本格的なデータ分析を行う人はおそらく IPython Notebook や R Studio 内で作業の大半を行うでしょう。 では、なぜシェルを教えるのでしょうか?

理由 1: 他の多くのことがシェルに依存しているから

ソフトウェアのインストール、デフォルトエディタの設定、 リモートマシンの制御などは、 シェルや標準入力・標準出力の基本的な理解を前提としています。 また、多くのツールがシェルの用語を使用しています (例: IPython の %ls%cd マジックコマンド)。

理由 2: 基本的なコンピュータ利用の考え方を紹介する簡単な方法だから

Unix シェルの使い方を教えるとき、 タブ補完や !(コマンド番号の再実行)、 for ループを通じて、 コンピュータに繰り返し作業を任せるべきだという考えを教えます。 また、頻繁に行う作業を保存して再利用する方法 (シェルスクリプトの使用)や、 意味のある名前を付けること、簡単なドキュメントを書くことの重要性も伝えます。

理由 3: ドメイン固有ツールや計算リソースの利用が可能になるから

シェルを使えるようになると、リモートマシンへのアクセスや、 高性能計算インフラの利用、新しい専門ツールの操作が可能になります。 ここでは HPC(高性能計算)やドメイン固有のスキルを教えることはありませんが、 これらのスキルの基礎を提供します。 特に、コマンドの構文、フラグ、ヘルプシステムの理解は ドメイン固有ツールに役立ちます。 また、ファイルシステムの理解やナビゲーションの方法もリモートアクセスに有用です。

理由 4: 関数の構成というプログラミングの考え方を教えられるから

シェルを教えることで、 小さな部品を組み合わせるという考え方を伝えることができます。 シェルの場合、この考え方はネストされた関数呼び出しではなく、 パイプラインの形式を取りますが、 基本的なアイデアは「小さな部品を緩やかに結合する」という点で同じです。

これらすべての内容は3時間以内でカバーできますが、 Windows を使用している学習者が次のような問題に直面しない場合に限ります:

  • ホームディレクトリがどこにあるのか分からない (特に Cygwin を使用している場合)
  • プレーンテキストエディタを実行できない
  • シェルが DOS の改行コードを含むスクリプトを実行しない

教える準備


  • ワークショップでの練習やライブコーディングの例には data ディレクトリを使用します。 shell-novice リポジトリをクローンするか、 右側の Download ZIP ボタンを使用して Git リポジトリ を取得できます。 また、data ディレクトリの ZIP ファイルは セットアップページでも提供しています。

  • ウェブサイトについての注意:

    • オプション1: レッスンの前にリンクを学習者に提供し、 レッスンの進行に合わせて学習者が内容を追えるようにします。 特に、レッスン内容があまり変更されない場合に有用です。
    • オプション2: レッスン中にウェブサイトを見せない。 注意が散漫になる場合があり、学習者が読むことに集中したり、 別ウィンドウを開く認知負荷が増える可能性があります。
    • どちらの場合でも、ワークショップ後の参考資料としてウェブサイトを指摘することを忘れないでください。
  • コンテンツ: 時間が非常に余裕がある場合(4時間以上)を除き、 このレッスンのすべての内容を1回の半日セッションでカバーすることは難しいでしょう。 事前に、何をスキップするか、何を強調するかを計画してください。

  • 練習問題: レッスン中に練習問題をどのように扱うか事前に考えてください。 どのように課題を割り当てるか(ウェブサイト、スライド、配布資料)? 全員が試してから解答を示しますか? 学習者に解答を示してもらいますか? グループごとに異なる課題を解き、解答を発表しますか?

  • 参考ページを印刷して学生に配布することも可能です。

  • その他の準備: 独自の例や補足コメントを追加しても構いませんが、 必要はありません。 トピックやコマンドはレッスンページに記載されている通りに教えることができます。 レッスンに不足があると感じた場合は、 イシューを提出したり、プルリクエストを送信してください。

教育用ノート


  • とても便利なオンラインリソース! http://explainshell.com/ は、入力した任意のシェルコマンドを解析し、 各部分のヘルプテキストを表示してくれます。 また、非常に簡潔で説明的なシェルコマンドのマニュアルを提供する http://tldr.sh/ も便利です。 特に、man が動作しない Git BASH を使用する Windows で役立ちます。

  • もう一つの優れたオンラインリソースとして http://www.shellcheck.net があります。 これは、シェルスクリプト(アップロードまたは入力)をチェックし、一般的なエラーを指摘してくれます。

  • 最近使用したコマンドを表示したまま作業するためにシェルを「分割」するリソース: https://github.com/rgaiacs/swc-shell-split-window

  • タブ補完は一見小さなことに思えますが、実際にはそうではありません。 !123!wc を使用して以前のコマンドを再実行することや、 ワイルドカード展開や for ループも同様です。 これらはすべて、Software Carpentry の大きなアイデアの1つを繰り返す機会です: コンピュータが何かを繰り返すことができるならば、 それを可能にする方法がプログラマーによってほぼ確実に作られています。

  • 4~5段階のパイプラインを構築し、それをシェルスクリプトにまとめて再利用し、 そのスクリプトを for ループ内で呼び出すことは、 「7プラスマイナス2」というアイデアがプログラミングとどう結びつくかを示す 素晴らしい機会です。 中程度に複雑な操作方法を見つけたら、それを再利用可能にして名前を付けることで、 ワーキングメモリ内の複数のスロットではなく1つのスロットしか使わなくなります。 これは、探索的プログラミングについて話す良い機会でもあります。 プログラムを最初から設計するのではなく、 いくつかの有用なことを行い、それを遡って再利用に値するものとしてまとめるのです。

  • すべてが順調に進んでいる場合、 ファイル拡張子は本質的にコンピュータ(および人間の読者)がファイルの内容を理解するのを助けるためのものであり、 ファイルの要件ではないことを強調するのも良いでしょう。 これは、Pipes and Filters のセクションで、 .txt 拡張子なしで標準出力をリダイレクトしてファイルに保存することを示すことで行えます (例: lengths)。結果として得られるファイルは完全に使用可能なテキストファイルです。 GUI でダブルクリックすると、コンピュータが何をしたいか尋ねる可能性が高いことを指摘してください。

  • 時間の制約により、ファイルの権限、ジョブ管理、SSH など多くの重要なトピックを省略しています。 学習者が基本的な内容を理解している場合は、オンラインのレッスンをガイドラインとして これらを代わりに取り上げることができます。 これらの制限には以下のような影響もあります:

    • ファイルの権限を最初に説明せずに #!(シェバン)を説明するのは難しい。 また、#!非常に複雑であるため、 権限を説明したとしても取り上げたくない場合があります。

    • Windows に Bash と適切な Unix コマンドセットをインストールするのは、 いくつかの調整とフラストレーションが伴います。 最新のインストールガイドラインを確認し、クラスを教える前に自分で試してみてください。

  • デフォルトでは、Git Bash のコマンドプロンプトには多くの情報が表示されます。 プロンプトをシンプルにするには、次のコマンドを入力します:

    BASH

    PS1='$ '
  • Windows マシンで nanoSoftware Carpentry Windows Installerで 正しくインストールされていない場合、代替として notepad を使用することができます。 GUI インターフェースが表示され、改行コードの扱いが異なりますが、 このレッスンの目的では notepadnano はほぼ同等に使用できます。

  • Windows の場合:

    BASH

    $ cd
    $ cd Desktop

    で常にデスクトップに移動できます。 (ただし、企業の OneDrive バックアップを使用している場合を除きます。次のポイントを参照してください。) デスクトップにシェル演習用の例のディレクトリを作成させると、 簡単に見つけられ、進行が確認できます。

  • エンタープライズ OneDrive でバックアップされた Windows マシンの場合、 GUI デスクトップが OneDrive 内のフォルダからレンダリングされ、 ~/Desktop の内容と一致しない場合があります。 OneDrive デスクトップは次のコマンドでアクセス可能です:

    BASH

    $ cd "~/OneDrive - Name Of Enterprise/Desktop"
    $ cd "C:/Users/Username/OneDrive - Name Of Enterprise/Desktop"

    コンピュータがこの種の設定を使用しているかどうかを確認する1つの方法は、 デスクトップ上のファイル、フォルダ、またはリンクを調べることです。 通常、アイコンにはリンクの場合にショートカット/矢印の記号が含まれています。 OneDrive と同期されたファイルには追加の同期状態を示す記号 (通常は「同期保留中」の青い矢印や「同期済み」の緑色のチェックマーク)があります。

  • POSIX 準拠のコマンド内で作業を進めてください。 教材全体も POSIX 準拠で設計されています。 使用するシェルによっては、macOS のデフォルトの bash や Windows の bash エミュレーターでは 利用できない拡張機能が含まれる場合があります。 たとえば、POSIX の ls には --ignore=-I オプションがありません。 また、POSIX の head-n 10 または -10 を受け付けますが、--lines=10 のような ロングフォームは使用できません。

Windows


Windows に Bash と適切な Unix コマンドをインストールするには、いくつかの調整とフラストレーションが伴います。 最新のインストールガイドラインを参照し、ワークショップの前に自分で試してみてください。 検討したオプションは以下の通りです:

  1. msysGit(「Git Bash」とも呼ばれる)
  2. Cygwin
  3. デスクトップ仮想マシンの使用
  4. 学習者をリモート Unix マシン(通常はクラウド上の VM)に接続させる

2013年中頃まで Cygwin が推奨されていましたが、 Git の指導を始めた頃から msysGit の方がより良い選択肢となりました。 デスクトップ仮想マシンやクラウドベースの VM は、 技術的に熟練した学習者にとっては良い選択肢であり、 ワークショップの開始時のインストールと設定を簡素化できますが:

  1. 性能の低いマシン

ではうまく機能しない 2. 初心者には混乱を招きやすい(コピー&ペーストのような簡単な操作が異なるため) 3. 学習者が自身の選んだ OS 上で動作する環境を持ち帰れない 4. 学習者が VM を事前にダウンロードしていない、またはワークショップ中に無線がダウンする (または混雑する)可能性がある

使用する環境にかかわらず、ワークショップの前に Windows マシンで必ず自分でテストしてください。 前回のワークショップ以降に状況が変わっている場合があります。 また、Software Carpentry Windows Installer を活用してください。