ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

とあるプログラミングの演習でTAをやっていました。

ちなみに演習は今日が最終回で、来週がテストだそうです。
この演習はどちらかと言うとプログラミングの基礎から叩きなおす基礎を再確認する感じの内容で、受講者のほとんどは、エディタの操作もままならなかったり、プログラミング自体にかなり抵抗感があったりするたちでした。
演習ではだいたい2つか3つの問題が用意され、

  • C言語ソースコードを打ち込み、コンパイルして結果を確認する
  • そのプログラムが何をしているのか考える
  • プログラムの文法や技法に関しての問題を解く
  • 打ち込んだソースコードを少し改変して機能を追加したり変更したりする

といったことを行います。問題自体はそれなりにプログラミングをしたことのある人間なら予習なしでも演習中にだいたい分かるものがほとんどでした。ただ、受講者たちにとってはそんなはずもなく、ひと通り打ち込んでコンパイルしてみる段階で、構文エラーや論理エラーが起きて画面とにらめっこしているという光景がよく見受けられました。
私の仕事は彼らの質問に答えたり、問題の解き方に詰まっているようならちょっとしたヒントを教えたり、バグやコンパイルエラーが見えたらデバッグの手伝いをしたり、果てしないLinuxの沼へと沈み込むきっかけになるかもしれないプログラミングに役立つ小ネタを披露したりすることでした。
問題を紹介するのはそれを作った先生方が気が向いた時にされるとおもいますので*1、私の方は演習中に披露した小ネタをいくつかご紹介しようと思います。

Emacsの小ネタ

小ネタといっても相手は右も左も分からないといった人たちなので、基本的なコマンドの確認くらいになります。
以下
C-x:Ctrlキーを押したままxを押す
C-x k:Ctrlキーを押したままxを押し、手をキーボードから一旦離してkを押す
C-x C-s:Ctrlキーを押したままxを押し、Ctrlキーを押したまま今度はsを押す
M-x term:左Altキーを押したままxを押し、続けて「term」と入力する*2

  • C-x C-f:ファイルを開く。存在しない名前を指定した場合新しいファイルを作成する
  • C-x C-s:ファイルを上書き保存する。存在しないファイルの場合は新しくファイルを作成して保存する
  • C-x C-w:名前をつけてファイルを保存する。すでにある名前をつけようとした場合上書きするか確認してくれる
  • C-x C-c:Emacsを終了する。保存していないファイルがある場合は保存してないよと注意してくれる。
  • C-x k:ファイルを閉じる*3。閉じるファイルを指定することも可能
  • C-x 1:ウィンドウをの分割をやめる*4
  • C-x 2:ウィンドウを上下に分割
  • M-x term:端末を起動する
  • スタートアップの画面で「never show it again」にチェックを入れる:起動時にスタートアップの画面が表示されない
  • M-%文字列を置換する。ファイルの先頭の方からやらないとうまくいかない。一括置換は!でできる。途中で止めたい時はq
  • 下の方にある太字のファイル名のところをクリックすると編集するファイルを切り替えられる

私自身あまり良くわかってないのもあってEmacs Lispの小ネタはなしです。

シェルコマンドの小ネタ

こちらも基本的なコマンドの確認です。やってみせるとだいたい「おおー」と言ってくれました。

  • clear:端末の画面をクリアする
  • rm <ファイル>:<ファイル>を削除する
  • chmod u-w <ファイル>:<ファイル>を書き込めなくする(所有者からファイルへの書き込み権限をなくす)
  • chmod u+x <ファイル>:<ファイル>を実行できるようにする(所有者にファイルの実行権限を与える)
  • mv <ファイル> <移動先>:<ファイル>を<移動先>へ動かす。<移動先>がディレクトリとして存在しない場合、<ファイル>の名前は<移動先>に書き換わる
  • cat <ファイル>:<ファイル>を端末に出力する。複数ファイルを一気に出力して > でファイルに書き込むのがよくある使い方
  • head <ファイル>:<ファイル>の最初のほうを端末に出力する。
  • tail <ファイル>:<ファイル>の最後のほうを端末に出力する。-f をつけると変更があったときに*5それを出力してくれる
  • less <ファイル>:<ファイル>を閲覧する。数字を押してEnterをッターンとするとその行を表示してくれる。/を押してから文字列を入力してEnterを押すとその文字列を検索できる。終了するときはq
  • <適当なコマンド> | less:<適当なコマンド>の出力結果をlessに渡して見ることができる
  • <適当なコマンド> | grep <検索したい文字>:<適当なコマンド>の出力結果から<検索したい文字>を検索する
  • <適当なコマンド> > <適当なファイル>:<適当なコマンド>の出力結果を<適当なファイル>に書き込む
  • <適当なコマンド> < <適当なファイル>:<適当なファイル>の中身を<適当なコマンド>の引数にする

「|」は左側のコマンドの出力を右側のコマンドの入力に渡してやるための記号です。ものすごく大量の出力結果をgrepに渡して、所望の文字列がきちんと出力されているか検索するのが基本の使い方ですね。

シェルの小ネタ

慣れた方には当たり前ですが、この演習では受講者の皆さんにやってみせると目を輝かせてくれます。

  • ↑もしくは↓:最近実行したコマンドを再び表示する
  • tabキー:ファイル名やコマンドなどを補完する。ファイル名・ディレクトリ名でのみ使うのが無難です
  • Ctrl+r:コマンド入力の履歴から検索する。入力した文字列にマッチする最後に入力したコマンドが調べられます。
  • Ctrl+c:プログラムの終了
  • Ctrl+Shift+c:コピー
  • Ctrl+Shift+v:貼り付け

受講者のみなさんは、講義中に披露したちょっとした小ネタやテクニックでも、素直に「おおすごい」といってくれたり、無駄な世間話にお付き合いいただいたりしてくれて、こちらこそありがとうございました。今後の演習や研究生活でのプログラミングで、少しでも活かしてくれたら本望です。

※タイトルと内容があんまり関わりありませんがよくあることです。今までの日記やブログでもよくあることです。

*1:勝手に公開して(゚Д゚)「この記事消してね」/(^o^)\「オウフ」というのは最悪のパターンです

*2:もしくはESCキーを押したあとxを押し、「term」と入力する

*3:正確には「バッファ」なんですがだいたいあってるのでここではこう言っておきます

*4:これも正しくは「フレーム」なんですが(ry

*5:正確にはファイルの末尾になにか追加された時に