第1回 Linux講習会 議事録

これは某月某日某場所で行われた第1回Linux講習会の議事録兼復習用資料です。読む際には予習用資料も参考にして下さい。

Linuxわーいわーいたのしーな午前の部

すべてはここから始まった。

鮟鱇、大幅に遅刻

他のメンバーは9時くらいには来ていたらしく、広見さん主導でUbuntuのインストールとLaTeXのインストールが行われていた。 WindowsではVirtualBoxをこのあたりからダウンロード・インストール。いい感じにチェックを付けたり外したりすると良いらしい。次いでUbuntu Japanese RemixをこのあたりからDL。 VirtualBoxを起動させ「新規」をクリックして、名前を入れ、いい感じに上でDLしたISOを放り込んで起動。 Ubuntuに誘われるままにインストールする。

ここでmacOSの人は「まぁUNIX系だし」とかほざいて導入せず。これのせいで後からえらい目に会う。

Ubuntuの人はsudo apt updatesudo apt upgradeした後にsudo apt install texlive-fullとして、 LaTeXを導入。ここでapt-getでなくaptを使ったのは完全に広見さんの趣味…… と鮟鱇は思っていたが、aptではapt-getにはない進行状況のプログレスバーがあったり、カラーになったりしてなんとなく嬉しいらしい。へー。ここで颯爽と鮟鱇が到着。お茶を買いに行ったりだべったりしたので、結局始まったのは10時半。予定より1時間半の遅れ。

Ubuntuとは

UbuntuとはLinux Distributionのうちの一つである。実はLinuxは一つではなくて、核の部分(Kernelと呼ぶ)がLinuxならば大体なんでもLinuxってよんじゃうので、いろんなものがまとめてLinux。

初心者向け、というか初心者でも簡単に使える、とかいう話は予習資料に詳しい。

Linuxは、Linus Torvaldsという人が、MINIXというOS(これ自体もUnixの模倣)を模倣して作ったUNIX系OS。 Linusさんはポプテピピック以上に中指をぶったてることで有名。予習資料に詳しい。

Ubuntu以外のLinux DistributionとしてはArch LinuxとかDebianとかopenSUSEとかCentOSとかRed Hat Linuxとかがある。

Ubuntuは半年に1回にリリースされる通常版と、LTSと呼ばれる2年に1度の長期サポート版がある。こないだ出た17.10は通常版。最後のLTSは16.04。バージョンはリリースされた「西暦.月」とするのが慣例なので、次の通常版とLTSははともに「18.04」となる(はず)。ちなみにArch Linuxは毎日更新が飛んでくるローリング・リリースを採用しています。Arch Linuxはいいぞ。

主要なLinux Distributionにはパッケージマネージャと呼ばれるソフトウェアがついており、これを利用することでいとも簡単にソフトウェアを導入することができる。ソフトウェアは「パッケージ」と呼ばれる単位でひとくくりにされる。 Ubuntuの場合はaptと呼ばれるパッケージマネージャを使う。例えばTerminalから apt-get install gccとやる。ただし実際はこれにsudoが必要だが後述。実はTerminalを使わずにもできる。「興味の有る人はSynapticでケンサクケンサク!」などと鮟鱇は当日ほざいた気がするが、 Synapticはシステムに必須なパッケージもいじれる超エキサイティングなツールなので、よくわからない人は標準搭載のソフトウェアセンターを利用するのが良いらしい。へー。

さてパッケージは「レポジトリ」という場所から取ってくるのが普通である。 mainと呼ばれるレポジトリは、UbuntuのバックについているCanonicalによってしっかり保守されているので(基本的に)安心安全。universeとかmulti universemultiverse(3/5訂正)と呼ばれるやばめのレポジトリもある。あんまり使わないことをおすすめ、と当日言ったけど、universeは結構普通に使う。texlive-fullもここだし。詳しくは「Ubuntu道場」のこのあたりを参考のこと。ちなみに、これら以外のレポジトリを追加して使うこともできるが、安全性とか保守とかの観点からおすすめはしない。必要な場合をみきわめて使うと吉かも。

Linuxにはユーザーという概念が有る。しかも結構頻繁に使われるので本当は抑えておきたいが、ここではrootの話だけをする。rootはいわゆる「管理者」で、このユーザーからでないと Ubuntuのシステムをいじることができない。rootになるためには一般にsuコマンドを使うのだが、実はUbuntuではセキュリティの観点からこれができない。代わりに、実行したいコマンドにsudoをつけることで、そのコマンドをroot権限で実行する。この際、root権限で実行するためにパスワードを入力する。この時入力したパスワードは何も表示されない。驚くかもしれないが、入力してエンターキーを入力すると確かに実行される。

Terminal基礎編

座学ばかりでも面白くないので実際に手を動かす。「じゃぁやってみましょう」「PC教室かよ」という会話をしつつコマンドを打つ。

TerminalはWindowsに付属しているエクスプローラのおばけという認識で良い。右クリックすると出てくるメニューが1万個くらいあるイメージ。 Ubuntu 17.10だと左下のボタンをクリック後terminalと検索し、「端末」というソフトウェアを起動する。

プロンプト(打ち込むところ)の左に~と出る。これは、今自分がホームディレクトリに居ることを表す。ホームディレクトリというのはWindowsで言うところの「ピクチャ」なり「ドキュメント」なりがあるフォルダと考えて良い。エクスプローラでは何もしなくてもその場所にあるファイルやらフォルダが見えるが、Terminalでは「教えて!」って言わないと教えてくれない。 lsと打つと教えてもらえる。lsはlistの略。ls --colorとやると色付けされる。しかしmacOSでは–colorオプションがない

一般にコマンド名 --オプション名やらコマンド名 -1文字のオプション名やらとやる。以下例。

  • ディレクトリの中身を表示する。
    • ls ディレクトリ名
  • カレントディレクトリ(今居るディレクトリ)の中身を表示する。.はカレントディレクトリを表す。
    • ls .
    • 実はこの場合.は省略できるのでlsだけでも良い。
  • カレントディレクトリの中身を詳細を含めて表示する。
    • ls -l
  • 別のディレクトリに移動する。
    • cd ディレクトリ名
  • ホームディレクトリに移動する。
    • cd ~
    • 実はこの場合~は省略できるのでcdだけでも良い。
  • 一つ上のディレクトリに移動する。
    • cd ..
    • ..は一つ上のディレクトリを意味する。例えば一つ上のディレクトリのファイル一覧が欲しい場合はls ..
    • 一つ上のディレクトリにある別のディレクトリ(testdirとする)の中身の一覧が欲しい場合はls ../testdir
  • 新しいディレクトリを作成。
    • mkdir ディレクトリ名
  • テキストファイルの中身を見る。
    • cat テキストファイル名
  • 今自分が居るディレクトリを表示する。
    • pwd
  • ファイルをコピーする。
    • cp コピー元のファイル コピー先のパス
  • ただしディレクトリをコピーする際にはオプション-Rをつける。すなわち
    • cp -R コピー元のディレクトリ コピー先のパス
  • ファイルを移動する。
    • mv 移動元のパス 移動先のパス
  • ファイルを消去する。
    • rm ファイルのパス
    • ただしディレクトリを削除する際にはオプション-rfをつける。rm -rf ディレクトリのパス

ちなみに、Windowsなどと違いLinuxには「ゴミ箱」のようなシステムはない。 rmした瞬間にファイルとはおさらばすることになる。つまり手が滑った拍子にrm -rf ~などとやってしまうと、ホームディレクトリ以下のファイルが全て消えてしまうことになる。頑張って集めたあーんなファイルやこーんなファイルも消えてしまうのだ。注意せよ。場合によっては-iとか-Iオプションを使うと幸せになれるかもしれない。

コマンドにおいてはファイルをまとめて指定するためにワイルドカード*などのグロブが使える。例えばカレントディレクトリにある拡張子がpdfのファイルのみをリストアップするには ls *.pdf とする。これで「ほにゃらら.pdf」というファイルばかりがlsされることになる。

ホームディレクトリからcd ..とやると/homeに移動する。さらにcd ..とやると/に移動する。これはルートディレクトリと呼ばれ、システムの中で最も上(階層として浅い)ディレクトリである。 lsするといろいろなディレクトリが見えるが、一般に気にする必要があるのは次のもの。

  • /etc
    • 各種の設定ファイルが入る。
  • /home
    • 各ユーザーのホームディレクトリがある。例えばanqouのホームディレクトリは/home/anqouである。~はこれの別名。
    • ~ユーザー名でユーザー名のホームディレクトリを指す。すなわちanqouでログインしている時 ~ = ~anqou = /home/anqou
  • /tmp
    • 各種ソフトウェアの一時ファイルが入る。
  • /var
    • 当日鮟鱇は設定ファイルが入っているなどとぬかしたが全くのデタラメ。正しくはログファイルなどが入る。
  • /usr/bin
    • 実行ファイルが入ってたりする。
    • ここに /usr なるフォルダがあるのは歴史的事情。今となっては /binは大抵 /usr/bin を指している。

詳しいことが知りたければWikipediaのFHSの項を読むと幸せになれるかもしれない。サーバー管理でもしない限りはあんまり必要ない知識かもしれない。

Terminal応用編

Linuxの(というよりはUnixの)コマンドには、テキストファイルをいい感じに処理できるものが多い。これらを使うと日々の仕事をより素早く効率的にできるようになる、かもしれない。

例えば融合不定記の記事データのファイル群から「鉄のザル」という文字列が含まれているファイルだけを見つけたい時 grep "鉄のザル" *.texとやるといい感じに表示される。一般的にはgrep 検索したい文字列 ファイル名と書く。検索したい文字列にスペースが入っている場合は"'でくるむ。また"で包んだ文字列の中に"が出てくる場合は、 \"とする。つまりgrep "He said \"chaos is not kaos.\"" fuj.txtとか。

Linuxには(というよりUnixには。以下省略)「パイプ」と呼ばれる便利な機能がある。例えばlsコマンドとgrepコマンドをパイプ(|)でつなぐことで、lsコマンドの出力から文字列を検索できる。 ls | grep 検索したい文字列といった感じ。さらにsedというコマンドを併用することで、こいつらを整形することができる。例えばls | grep 検索したい文字列 | sed 's/もとの文字列/置換後の文字列/'と書くことで、 lsの出力結果からgrepで検索して、そいつらに対してsedで文字列置換を行うことができる。便利!(?)

ここでgrepはどういう単位で検索を行うのかという質問。grepは改行単位で検索結果を表示する。ただしlsコマンドは結果表示のときにタブを間に挟むが、これは単に人間的な見やすさのため。 lsコマンドをパイプで繋いて使うときは、勝手に改行区切りになる。

さらに別の人から、サブディレクトリも含めてgrepに検索させるにはどうすればいいのかという質問。ここで鮟鱇、何をとちくるったのかfindコマンドを使わないとできないと思い、findコマンドの説明に入る。 findコマンドは再帰的に(つまりサブディレクトリまで階層を順々に降りて)ファイルとディレクトリをリストアップしてくれるコマンド。 lsの強化版という認識で良い。使い方はfind 検索したいディレクトリ オプションいっぱいという感じ。例を上げる。

  • カレントディレクトリ以下すべてのファイルを列挙したい場合
    • find .
  • カレントディレクトリ以下で、名前が「anqou.txt」であるファイルを列挙
    • find . -name anqou.txt
  • testディレクトリ以下にあるファイルを全列挙
    • find test -type f

と、ここで広見さんからツッコミが入る。findコマンドを使ってgrepをかますよりももっと単純な方法がある。ということでmanコマンドを説明する。manコマンドはmanualの略で、コマンドの説明を読むことができる。今回の場合man grepとやるとマニュアルが出るが、全部英語。日本語化したい場合はsudo apt-get install manpages-ja manpages-ja-devとすればよいのだが、ここはノリで英語で読む。矢印でも動くがjで下、kで上に動いたりする。あとgで一番上、Gで一番下に移動。またPgUpPgDnで一画面分動けたりするが、鮟鱇は知らなかった。へー。 hを押せばヘルプが出るそうな。しゅごい。終了はq

manコマンドを使う他にオプション--helpを指定する方法もある。man コマンド名としても何も出てこないときに使うと良いかも。 grepの場合はgrep --helpとする。ただし出力が長い場合には見切れるのでlessコマンドにパイプでつなぐ。つまりgrep --help | lessなどとやればmanと同じ感じで操作できるようになる。lessはページャと呼ばれるソフトウェアで、長い出力をいい感じに操作しやすくしてくれる。もちろんgrep以外の出力にもつなげることができて、例えばls /etc | lessとかやれば、 /etcにあるディレクトリやらファイルやらをいい感じに見ることができる。

さて、man grepを読んでみると、-rというオプションをつければrecursivelyに(再帰的に)grepが仕事をしてくれることがわかる。ということで、ある文字列を含んだファイルを、カレントディレクトリから再帰的に検索したい場合はgrep -r 文字列 .とやる。

ここで.*の違いがわからんという質問。*は、そのパターンに当てはまるファイルを指定する。 .はカレントディレクトリを指定する。指定するものが違う。また、実は*という記号を処理するのはコマンドそのものではなく、ユーザーとコマンドの間に挟まる「シェル」と呼ばれるプログラム。 Ubuntuの場合は特にBashが処理する。例えばカレントディレクトリに「A.txt」と「B.txt」というファイルがある場合に、 grep anqou *とやるのとgrep anqou A.txt B.txtとやるのは全く同じ意味になる。

Terminal上でプログラムを強制終了する方法を説明しようとした鮟鱇、とりあえず延々何かが表示されればいいかなぁなどと適当なことを考え cat /dev/nullと打ったところシステムが固まり無事死亡。しかしこんな時でも立ち直れるのがLinuxの良いところである。大爆笑しながらCtrl+Alt+F2とやり、別の仮想コンソールを開く。実は、Linuxは複数のコンソール(画面という認識で良い)を同時に使用することができるのだ。 topコマンドでTerminalのプロセス番号を突き止め、killコマンドを使って強制終了させた。ふぅ。

で結局広見さんの助言でsleepコマンドを使用。sleep 100とやると100秒くらいTerminalから処理が返らない状態にできる。ここでCtrl+Csleepコマンドを強制終了できる。わーい便利。ちなみにCtrl+Cという表記は「Ctrlボタンを押しながらCを押す」ことを意味する。決して同時にじゃーんと押すわけではない。また同じことをCtrl-CとかC-CとかC^Cとか表したりもする。内部的には、Ctrl+Cを押すとプログラムに対してSIGINTというシグナルを送っている。シグナルを受け取ったプログラムは現在行っている処理を中断してこのシグナルを処理することになる。普通このシグナルは強制終了に結び付けられているのでsleepコマンドが終了することになる。「普通」と書いたように、これを別の機能と結びつけることも可能である。例えばVimではEscキーの代わりに使ったりできる。こういう感じのコマンドを終了させたいときはCtrl+Zとやると良い、と鮟鱇は思っていたのだが、実際のところこれはプログラムをバックグラウンドで動かすことで入力を取り戻すだけの話で、終了させているわけではないようだ。終了させたい場合はCtrl+Zでコマンドを打てる状態にしたあとにtopコマンドなどで当該コマンドのプロセス番号を把握し、 kill プロセス番号とやって終了させるのが良いだろう。奇しくも俺が先程やった操作そのものである。決して無駄ではなかった。シグナルについて詳しく知りたいときはこのあたりを参照すると良いかもしれない。

さて、インターネットでコマンドについて調べると$ cd anqouとか# apt-get updateとかいう表記を目にする。この$やら#には慣習的に意味が有る。 $はノーマルユーザー、#はスーパーユーザーを意味する。つまり# apt-get updateと書いてあるコマンドを実際に打ち込む場合はsudo apt-get updateなどとやると良い。が、実際問題としてはsudoをつけない状態で実行して、その上でエラーが出たらつけるという方法でも特段問題はない。ちなみにmacOSではHomebrewというソフトウェアがパッケージマネージャみたいな感じらしいのだが、こいつは逆にsudoをつけると動かないので注意。

パッケージマネージャを使わないでソフトウェアを導入することを考える。もちろんこれは避けるべきだが、どうしてもソフトウェアの最新版がほしいとか、そもそもパッケージが無いとかで、これをせざるを得ないときもちょくちょく有る。ちなみにArchLinuxはAURというシステムが有るので、このような状況になることが極めて少ない。ArchLinuxはいいぞ。そのような場合、そのソフトウェアについているインストールガイドを読むのが最善手だが、そのようなものが無い場合には、当該ディレクトリで./configureのちmakeのちsudo make installとやると慣習的にうまくいくことが多い。以下コマンドの説明。 ./configureはそのディレクトリにあるconfigureというプログラムを動かすことでMakefileというファイルを生成する。 makeはそのMakefileを設計図にプログラムをコンパイルする。そしてsudo make installでこのプログラムをインストールする。このインストールという作業で/usr/local/binなどに実行ファイルが置かれ使えるようになる、ことが多い。この辺りは複雑で、ソフトウェアによって全然違ったりするので、適宜ドキュメントを当たりながらやると吉。もちろんもっと良いのはパッケージマネージャを使うこと。この辺りを自動でやってくれる(正確にはすでにやったものをダウンロードしてくれる)。アップデートもsudo apt updatesudo apt upgradeを叩くだけで自動でしてくれる。便利。

と、いうことでこれの実践としてslコマンドを入れる、のだが、実はslコマンドは割と単純な構造なので、 ./configuresudo make installがなく、 makeの後sudo install --strip sl /usr/local/binとする (installやstrip については省略)。もっと言えば、Ubuntuの場合パッケージが存在するのでsudo apt install slとやれば良い。ということであんまり演習にならなかったが、中身は面白い。インストールしておもむろにslを叩こう。さてさて何が起こるのか。それは実行した人だけのお楽しみ。会場は大爆笑でした。

ここらでaptの使い方説明。

  • パッケージをインストール
    • # apt install パッケージ名
  • パッケージをアンインストール
    • # apt remove パッケージ名
    • # apt purge パッケージ名 これだとユーザーが作った設定ファイルなどもまとめて消す。
  • パッケージをアップデート
    • # apt update# apt upgrade
    • 毎日実行するのがおすすめ。
  • Ubuntuのシステムに関わるソフトウェアのアップデート
    • # apt-get dist-upgrade
    • 必要なときには「以下の〜〜が保留されました」みたいなメッセージが出るので、そのメッセージをネットでググればこのコマンドが出てくる。
    • ついでに、上のコマンドを実行した後に# apt-get autoremoveをかましておくと、要らないファイルを消してくれる。

この辺りで午前の部が終了。お昼ご飯をどうしようなどと参加者が話している間に、広見さんが「macOSがなぜUNIX系か」というような話を鮟鱇にしていた。その後ライセンスの話やらデスクトップマネージャのレイヤーの話などをした。大変興味深かった。また機会があれば発表してほしい。

ちなみに、Terminalに関しては「Ubuntu道場」のこのあたりに詳しくまとまっている。一読すると良いかも知れない。

Linuxわーいわーいたのしーな午後の部

昼食から帰ってくると、いきなり「可換な行列の最大の部分集合は何か」という議論が始まる。数弱の鮟鱇は大きなスクリーンにmikutterを写してキャッキャしていた。mikutterはいいぞ。結局これの結論は出ないままに後半戦に突入する。

Git

後半戦初っ端はGit。さてなんてこれは読むでしょう、という話から……

constexpr

いきなりC++の話題に。完全余談。constexprとは、普通の関数でもいい感じに定数っぽく扱うためのC++のキーワードである。例えば累乗を計算するpowという関数があったとして、コード中でこれをpow(2, 5)と呼び出すとする。コンパイル時にこれを32と置き換えてしまえば、powを呼び出す必要がなく、効率化が期待できる。この変換を促すのがconstexprというキーワードなのである。この単語はおそらくconstantexpressionから成り立っているので「コンストエクスパー」などと呼ぶのが普通である。しかし、このような読みにくい単語の読みを決めるサイト「YOMIKATA」では、なんと「チュウサンジョシ」が圧倒的多数となっている(参考)。楽しい。

種明かしをすれば、ボレロ村上という陶芸家かつC++専門家の方が居て、その方のハンドルネームが(なぜか)「中3女子」なのである。この方はかなりすごい方で、constexprでフーリエ変換とか、レイトレーシングとかを行っている。簡単に言えば、C++でコードを書き、それをコンパイルするだけで3D空間の投影を完了させることができるのである。ただしコンパイルにかかる時間は長大で、8192px x 8192pxの画像を作るソースコードをコンパイルするのに7日かかるらしい。キモはプログラムの実行ではなくコンパイルにこれだけの時間がかかるということである。たのしー!興味が湧いた人は最近IT proというサイトでインタビューが公開されたので、読んでみると面白いかも知れない。心配しなくてもconstexprの話はほとんど無く、中3女子の半生みたいな感じの記事だったので気楽に読める。ぜひどうぞ。

閑☆話☆休☆題

Git(ギット)はファイルのバージョン管理ソフトである。主にテキストファイルを対象としているが、一応バイナリファイルも扱うことができる。予習資料にも書いたように、例えばAというファイルがあって、少し編集してBにして、やっぱりやめにしてAに戻って、ちょっと編集してCにして、あーでもやっぱりBのほうが良かったね、などという作業を効率化できる。

tryGitというサイトがチュートリアルとして有用であるのでこれをやる。 15分でGitが学べる素晴らしいサイトだが、全編英語である。日本語サイトとしてはサルでもわかるGit入門などがあるが、このサルのキャラクターが微妙にうざいので俺は嫌い。

チュートリアルをやりながら説明を補足する。まずgit add ファイル名でファイルをGitに認識させる。 git statusで今どのファイルをGitが認識しているかがわかる。ただしgit statusで表示されるファイルは最後のコミットから変更されたものだけであることに注意。次にgit commit -m "コミットメッセージ"で変更をコミットする。これで新しいバージョンを作成することになる。以下、ファイルを変更し、git addし、git statusでどのファイルがコミットされることになるか確認した後にgit commitという作業を繰り返す。

さてGitにはブランチという概念がある。これによって、様々なコードを統一的に扱うことができる。何もブランチに対して操作をしていないときには、Gitによって自動的にmasterブランチが作られている。新しいブランチを作成するにはgit branch ブランチ名とする。その上でgit branchとやると、現在存在するブランチを一覧表示できる。作ったブランチに移動するにはgit checkout ブランチ名とやる。ちなみに、この「ブランチを作成してそのブランチに移動」をまとめてgit checkout -b ブランチ名とすることもできる。

さて新しいブランチでgit addgit commitなどして作業した後に、 git checkout masterとしてmasterブランチに戻る。すると作業したファイルがもとに戻っている、つまりブランチを切る前の状態になっていることがわかるはずである。ここで新たに作業をすると、その変更は先に作ったブランチとは独立して保存されることになる。このブランチという仕組みによって複数の変更が同時に存在することができるのである。

先に作ったブランチをmasterブランチに取り込むためにはgit checkout masterとした上で git merge ブランチ名とやる。ただし、そのブランチで変更した部分とmasterで変更した部分が重なっている場合、Gitはどちらを選択すれば良いのか分からない。そこで「コンフリクト」という状態になる。この場合は当該ファイルを手動で修正した上でgit commitしてやればよい。 mergeしたブランチは勝手に消えるわけではないので自分で消す必要がある。git branch -d ブランチ名とやる。

これまでの話はローカル、すなわち自分のPC上だけでやるものだったが、実はGitは複数人で開発するときにも使用することができる。すなわち、「リモートリポジトリ」と呼ばれる場所を用意し、そこに各々の変更を突っ込んだり、そこから他の人の変更をもらってきたりする。具体的には、まずgit remote add origin リモートリポジトリのURIとやると、originという名前でリモートリポジトリが登録される。次いでgit push -u origin masterとやると、自分のmasterブランチの中身をリモートリポジトリに突っ込むことができる。ここで-uオプションをつけることで、次回以降git pushとやるだけで良くなる。便利。逆にリモートリポジトリからデータを引っ張ってくるときにはgit pullとやればよいが、実はgit pullはいろいろと怖いコマンドだったりする。詳しく知りたければググること。ここではgit fetchした上でgit merge origin/masterでも同じことができるよとだけ言っておく。

さて、tryGitを終わらしたところで、実際にTerminalでもGitを使ってみる。まずGitをUbuntuに入れなければならない。sudo apt-get install gitと前の電子黒板に書いたところ、広見さんからaptを使えと言われたのでsudo apt install gitと訂正。正直、鮟鱇にはどう違うのか全然分からないが、先述のようにaptは実行時に進行状況を表示してくれるなどapt-getよりも分かりやすいらしい。ついでにGitの設定を行う。Gitはユーザー名とメールアドレスをコミットの際に要求するので、これを以下のコマンドで設定する。

  • git config --global user.name "ユーザー名"
  • git config --global user.email "メールアドレス"

このメールアドレスはgit pushなどすると他の人にも見られることになるので注意。フリーメールにしておくのが吉。後述するGitHubの登録情報と同じものにしておくと幸せになれるかも知れない。うまく設定できると~/.gitconfigというファイルができ、その中にこれらの情報が記述されているのがわかる。午前の部でも話したようにcat ~/.gitconfigとやると、その中身が見える。この.gitconfigというファイルにはエイリアスと呼ばれるGitのコマンドの別名も指定できる。例えばここらへんを参考にすると、git lgaできれいなログを見ることができるようになる。あとはcheckoutは長いのでcoにするとか。工夫次第で便利になる。

git addやらgit commitやらはtryGitと同じように使える。適当なフォルダでgit initした後にls -aとやると.gitディレクトリができているのが見える。この.gitディレクトリを使ってGitは動作している。ちなみに.gitのように先頭に.がつくと隠しファイルやら隠しディレクトリになる。これらは普通にlsするだけでは表示されず-aをつけてやる必要がある。

ここでプルリクエストの練習をするために広見さんがGitHubにプライベートレポジトリを作る。 GitHubとはリモートリポジトリを簡単に作れたり、快適に閲覧できたりする、最近流行りのすごいサービス。公開するリモートレポジトリ(パブリックレポジトリ)なら無料で作れる。最近は就職でGitHubのアカウントを提出するように求められるとか求められないとか。アカウントを持っておいて損はないので皆さん作ろうね〜とか言ったのだが、持っていないのは一人だけだった。しゅごい。ちなみにGitHub Educationというシステムを使って学生身分でのゴリ押しを実行することで、普通は一月7ドル払わないと作れないプライベートレポジトリを何個でも持つことができる。 GitHubしゅごい。

さてリモートレポジトリをローカルにDLするにはgit clone レポジトリのURIとする。 GitHubを使用している場合、このレポジトリのURIは、GitHubのページの右側緑色のボタン「Clone or download」と書いてあるところからコピーできる。 git cloneによって新しくディレクトリが作られるのでcd ディレクトリ名で移動。lsすると現在存在するファイルが見える。今回は新しくブランチを作り、ファイルを作成してgit pushし、プルリクエストを作る演習をした。

  • git branch ブランチ名
    • ブランチ名は任意の名前で良いが、今回は各々のハンドルネームとした。
  • 適当なファイルを作成。
  • git add .
    • 実は.(カレントディレクトリ)を指定することで、カレントディレクトリ以下の全てのファイルをgit addすることができる。
  • git status
    • どのファイルがコミットされるかを確認。
  • git commit -m "コミットメッセージ"
  • git push -u origin ブランチ名
    • 今回のレポジトリはGitHubからgit cloneしたものなので、すでにoriginが登録されている。そこに向かってgit pushすれば、リモートレポジトリに対して変更が突っ込まれる。

ここでGitHubのページを見てみるとプルリクエスト、すなわちレポジトリの管理者に「この変更をとりこんでちょ」というメッセージを作成するためのボタンが出現する。これを押して必要事項を記入し登録する。管理者がこのリクエストをマージすれば、リモートレポジトリのmasterブランチにこの変更が適用される。その変更をリモートに取り込むためにはgit pullすれば良い。あるいはgit fetchしてgit checkout masterした後にgit merge origin/masterとすれば良い。

ただし、今回の場合、我々はリモートレポジトリのコントリビュータとして予め指定されている、つまりこのレポジトリの編集権限が与えられているため、実は自分のプルリクエストを自分でマージできる。さらに言えば、プルリクエストを介さずとも、ローカルでmasterブランチに変更を加えた上で、 mastergit pushできる。

レポジトリの編集権限が与えられていない場合には、はじめの段階で git cloneではなくforkというGitHubの機能を使用する必要がある。詳しくはググること。ただし大まかな動きとしては変わらない。また、我々が実際に行った方法は「GitHub Flow」と呼ばれ、実務で使われているケースもあるようだ。参考

そうこうしているうちに広見さんが全てのPRをmerge。各人が追加したファイルを読みながら笑う。個人的にはfeeleのふぇぇぇが一番面白かった。今回のこの辺りのファイル群は、Part1/ 以下に残っている。

このあたりでGitの話はおしまい。やったぜ。ちなみにGitの参考文献としては『入門Git』(Travis Swicegood著・でびあんぐる訳、オーム社、2009)などが有名だが、実は鮟鱇は持っていない。都度ネットで調べるという場当たり的な対処でも今の所何とかなっている。一応『入門Git』を立ち読みしたところ良さそうだったので記しておく。まぁでも、この先どうなるかわからないし、俺も一冊買おうかな。

LaTeX

LaTeXは自動組版ソフトウェアである。ちなみに「組版」は「くみはん」と読む。間違っても文書作成ソフトウェアではない。これを間違えるとひどい目に会う、かも知れない。

名前はLatexでもLATEXでもなくLaTeXである。また、LaTeXの元になっているTeXとLaTeXは完全に別のものである、らしい。よくわからない。ちなみに発音は「ラテフ」または「ラテック」である。「ラテックス」と読むと警察が飛んでくる。怖いソフトウェアである。

予習資料にも書いたように、とにかく初心者のうちは『[改訂第7版]LaTeX2ε美文書作成入門』(奥村・黒木、技術評論社、2017)が絶対正義である。この本は、9章ぐらいまでちゃんと読めば普通のレポートなどは書けるようになる、すごい本である。分厚く見えるが図や表が多いのでそれほどでもない。また後ろの方は中級者向けの内容なので、初めのうちは流し読みで良い。ぜひ買って読もう。ちなみに上のリンクから買っても鮟鱇に金が入るような仕組みには1ミリもなっていないので、その点は安心してほしい。

まずLaTeXをインストールする。Ubuntuの場合はtexlive-fullというパッケージを入れれば良い。実は今日の初めに導入しているのでここでは省略できた。ちなみにmacOSに導入する場合は後述するようにフォント周りで色々と面倒であるが、とりあえずmacOS High Sierra以外ならば『美文書』の付属CDからインストールした後にtlmgrでアップデートをかますとよいはず。『美文書』の付録Aを参考のこと。

さてtexlive-fullによって入るのは、実はLaTeXではなく、TeX Liveと呼ばれるTeX周りのソフトウェアの集合体である。 TeXは様々な周辺ソフトウェアを伴って発展してきた。それらを適宜組み合わせて使用するためには、各々のソフトウェアを個別にインストールするよりも、全てまとめてインストールしたほうが何かと便利である。ということで、これらをまとめたTeX Liveが年に一度リリースされている。詳しくはこのあたりを参考のこと。一年に一度のリリースのため、Ubuntuのtexlive-fullには最新版が入らないことも多く有る。 tlmgrというプログラムを使うことでアップデートすることができるが、このプログラムはtexlive-fullには入っていないため、 TeX Liveを手動で、つまりパッケージマネージャに頼らずにインストールする必要が有る。詳しくはググること。

次にLaTeXで使用するフォントを決める必要がある。Wordなどと違い、LaTeXでは基本的に「明朝体」と「ゴシック体」の二つのみをフォントとして使用する。また使用したフォントを、生成するPDFに埋め込むことで、どのような環境でも同じように文書が描画されることを保証できる。

Ubuntuの場合、ほとんどIPAexフォント一択である。 IPAexフォントとはIPA(独立行政法人情報処理推進機構)が作成したフリーのフォントで、 TeX Liveに同梱されているため気軽に使用できる。 IPAexフォントをデフォルトとして使用・埋め込みする場合は、以下のコマンドを実行する。 sudo kanji-config-updmap-sys ipaex

しかし、IPAexフォントでは表示できない漢字が多い場合や、多ウェイト(太い明朝体や細いゴシック体)のフォントを使用したい場合もある。そのような時は「源ノ角ゴシック」や「源ノ明朝」を使うのが良い。ここでは説明しないので使いたい場合は適宜ググってほしい。

一方でmacOSでは「ヒラギノフォント」というとても高級なフォントが同梱されているため、これを使えば良い。ただし使うにはひと工夫必要である。詳しくはググること。またHigh Sierraは他のバージョンと異なりヒラギノフォントが使いにくいらしい。こちらもググること。正直、鮟鱇は手元にmacOSが無いので全然分からない。

また、歴史的な事情からLaTeX(ないしTeX)周りのフォント事情は泥沼を極めているので設定が非常にややこしいが、 pLaTeXあるいはupLaTeX(これらが何者かは後述)を使用する場合はpxchfonというパッケージを使うと幸せになれるかも知れないということだけ添えておく。またLuaLaTeX(後述)などを使用すれば、より容易にフォントを扱えることも記しておく。

さて、実はTeXには様々な種類が有り、各々仕様がことなっている。これまた歴史的な事情による。詳しく知りたい場合はこのあたりを参照すること。とりあえず我々の講習会ではpLaTeXを使用することになった。

まず以下のようなファイルを作成する。適当なテキストエディタを使用すれば良い。Ubuntuだとgeditが使える。適当なディレクトリでgedit main.texとかやるとmain.texというファイルを編集するようにgeditが起動する。ちなみにこの時、Terminalの制御がgeditに奪われる形になるが、gedit main.tex &&を後ろにつけるか、 gedit main.texとして起動した状態で、Terminal上でCtrl+Zを入力することで、 Terminalの制御を取り返すことができる。便利。

さてテキストエディタ上で以下のLaTeXソースを打つ。 %以下はコメント。

\documentclass{jsarticle}       % クラスファイルを読み込む。文書作成に便利なアレコレが読み込まれる。
\usepackage{lmodern}            % Latin Modernという欧文フォントを使うようにする。
\usepackage[T1]{fontenc}        % いい感じに文字を扱うためのパッケージを読み込む。
\usepackage{textcomp}           % いい感じに文字を扱うためのパッケージを読み込む。
\usepackage[utf8]{inpuntenc}    % いい感じに文字を扱うためのパッケージを読み込む。
\begin{document}                % 文書を始める。基本的には、以下に書いたものが出力されることになる。
ほげ、ふが、ふえぇ。
\end{document}                  % 文書を終わる。

保存して終了し、以下のコマンドを順に打つ。

  • platex main.tex
    • LaTeXソースをDVIファイルに変換する。実はplatex mainでも良い。
  • dvipdfmx main.dvi
    • DVIファイルをPDFに変換する。実はdvipdfmx mainでも良い。
  • xdg-open main.pdf
    • PDFを開く。

無事「ほげ、ふが、ふえぇ。」と表示されれば正しく動作している。

LaTeXを使いこなしていくと、複数回のplatexの実行を要求される場合がある。これを一々行うのは面倒なのでlatexmkというコマンドを利用することができる。詳しい使い方はこのあたりを参考すること。ちまちまplatexやらdvipdfmxやらを打ちながら文章を書いている時にlatexmk -pvcを知ると人生が変わる。

他のLaTeXの使い方については以下のLaTeXソースを『美文書』と共に見るとだいたい分かるはず。

% 文字サイズ12pt、A4用紙を指定。
\documentclass[12pt,a4paper,dvipdfmx]{jsarticle}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
% OTFパッケージを使用し「𠮷」などを出力しやすくする。またオプションで、特殊なフォントを使用できるようにする。
\usepackage[expert,deluxe]{otf}
% 余白を指定。上下左右を1inchとする。
\usepackage[dvipdfm,margin=1truein]{geometry}
% 画像を入れる際に必要。
\usepackage[hiresbb]{graphicx}
% 表題を指定する。
\title{様々なコピペ}
% 著者を指定する。
\author{艮鮟鱇}
% 日付を指定する。\todayとするとこの文書がplatexに通された日になる。
\date{\today}
\begin{document}
% タイトルを生成。
\maketitle
% 目次を生成
\tableofcontents
% 節を生成。
\section{コピペの例}
ここではコピペの例を挙げる。
% 小節を生成
\subsection{\UTF{20BB7}野家コピペ}
ここでは\UTF{20BB7}野家コピペを挙げる。まず以下にオリジナルを引用する。
% 引用を始める。
\begin{quote}
    昨日、近所の\UTF{20BB7}野家行ったんです。\UTF{20BB7}野家。
    そしたらなんか人がめちゃくちゃいっぱいで座れないんです。
    で、よく見たらなんか垂れ幕下がってて、150円引き、とか書いてあるんです。
    ……
    % 引用を終える。
\end{quote}
% 画像を挿入する。横に大きいので、用紙の幅(正確には1行分の文字列の幅)に合わせる。
\includegraphics[width=\textwidth]{yoshinoya.png}
\end{document}

文章は最近話題の吉野家コピペより。ちなみに、ソース中の\UTF{20BB7}は「上の部分が土である吉」(𠮷)を表しているが、 IPAexだとこの文字が収録されていないために出ない。残念。

以上は和文で文書を作る時の方法である。欧文で文書を作る場合は少々勝手が異なる。以下のようにすれば良い。

\documentclass[12pt,a4paper]{article}
\usepackage{txfonts} % use fonts like times
\usepackage[margin=1truein,dvipdfm]{geometry}
\renewcommand{\baselinestretch}{2}  % double line spacing
\settowidth{\parindent}{~~~~~}  % five space indent
\title{Lorem ipsum}
\author{Ushitora Anqou}
\date{\today}
\begin{document}
\maketitle
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{document}

Vim

すでに鮟鱇も参加者もヘトヘトだったが、時間が有るということでVimにトライ。まずVimのチュートリアルをやる。Terminalでvimtutor jaと打ってリターンするとチュートリアルとしてのテキストファイルが開く。上から順にやればVimの基本的な使い方を学べるようになっている。ちなみに、このチュートリアルを訳したのはVimその他でめちゃんこ有名なmattnさんと、 Windows用の日本語化Vimを配布しているKaoriyaさんで、その時の詳しい話などがこのあたりから読める。面白い。

その後Vimのヘルプを日本語化しようという話になる。ここでVimでおなじみ宗教戦争が鮟鱇と広見さんの間で起こる。二人の間だけでヒートアップしていて他の人が置いてけぼりになっていた気がするので、ここで詳しく説明しておく。

まず一番大きな枠組みでの対立として「Vim vs Emacs」があるが、今回はVimの枠組みだけで話を進めていたのでこの対立は重要でない。次にVimと、それから派生したソフトウェア間での対立が有る。最近の対立として一番有名なのは「Vim vs Neovim」であるが、とりあえず今回はVimをとる。さてVimは最近アップデートされ、Vim7からVim8となった。しかしUbuntuなど多くのディストリビューションでは通常Vim7が導入される…… と当日鮟鱇は思っていたが、Ubuntu 17.10だとVim8が導入されるようだ。なーんだ。じゃあいいや。

さて、無事にVim8を使用することが決まった。次なる対立は「プラグインを使うか否か」である。 Vimには様々な人によって制作されたプラグインが多数存在する。これを導入することでVimをよりいい感じに使えるようになるのだが、人によってはあえて「素のVim」を使うことで異なる環境でも同じように作業できることを重視する場合が有る。実は広見さんはこちらの立場に近い。しかしそれでも、Vimのヘルプを日本語化するくらいなら許してくれるようなので、とりあえずここでは「プラグインを使う」立場を取ることにする。

そろそろ面倒くさくなってきたが、まだまだ対立はある。次は「プラグインマネージャを使うか否か」である。そして鮟鱇と広見さんの対立の主はここにある。Vimのプラグインは手動で導入することもできるが少々面倒である。そのためウェブにある解説記事などではほとんど例外なく「プラグインマネージャ」と呼ばれるプログラムを導入する。これによってプラグイン導入が容易になると同時に、更新なども楽にできるようになる。ところが、これを良しとしない派閥がある。広見さんはこちらの人間であるようだ。多分。またVim8ではプラグインマネージャ(の簡単なもの)の機能がVim側に導入されたことも有り、この派閥の人間はさらに増えている、かもしれない。

とりあえず講習会当日は広見さんにゴメンナサイしながらプラグインマネージャを入れた。実はどのプラグインマネージャを使うかでも対立があるのだが、ここは無難(?)にdein.vimを入れる。まず以下のような内容で~/.vimrcというファイルを作成する。すでに存在する場合は追記する。

" .vimrc by Anqou

let s:dein_dir = expand('~/.cache_dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'

if &runtimepath !~# '/dein.vim'
    if !isdirectory(s:dein_repo_dir)
        execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
    endif
    execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
endif

if dein#load_state(s:dein_dir)
    call dein#begin(s:dein_dir)

    let g:rc_dir    = expand('~/.vim/rc')
    let s:toml      = g:rc_dir . '/dein.toml'
    let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'

    call dein#load_toml(s:toml,      {'lazy': 0})
    call dein#load_toml(s:lazy_toml, {'lazy': 1})

    call dein#end()
    call dein#save_state()
endif

if dein#check_install()
    call dein#install()
endif

filetype plugin indent on
syntax enable

このコードはおおよそ次のようなことをやっている。

  • ~/.cache_deinをプラグインの貯蔵場所とする。
  • dein.vimが導入されていない場合はGitを使用して自動的に導入する。
  • runtimepath~/.cache_deinとする。これによってプラグインがVimに読み込まれる準備ができる。
  • ~/.vim/rc/dein.toml~/.vim/rc/dein_lazy.tomlに書かれているプラグインを有効にする。まだインストールされていないプラグインがあればインストールする。
  • ファイルタイプの検出やシンタックスハイライトなどを有効化する。

つまり、実際にどのプラグインをインストールするかは~/.vim/rc/dein.toml~/.vim/rc/dein_lazy.tomlで指定してやる必要が有る。まずこれらのファイルを作成する。以下のようにコマンドをTerminalで打つ。

  • mkdir -p ~/.vim/rc
    • ~/.vim/rcというディレクトリを作成する。本来mkdirは一つのディレクトリしか作成できないが、-pオプションを指定することで、必要なディレクトリを全て作ってくれる。
  • cd ~/.vim/rc
    • 上で作ったディレクトリに移動する。
  • touch dein.toml dein_lazy.toml
    • dein.tomldein_lazy.tomlというファイルを作成する。touchコマンドはファイルの更新日時を更新するコマンドだが、存在しないファイルを指定した場合、そのファイルを作成してくれる。
  • gedit dein.toml
    • dein.tomlを編集する。ここでVimを使うと色々とアレしそうなので使わない。多分問題ないと思うけど。

さてdein.tomlに以下を書き込む。

[[plugins]]
repo = 'Shougo/dein.vim'

[[plugins]]
repo = 'vim-jp/vimdoc-ja'

これでdein.vimとvimdoc-ja(Vimのヘルプを日本語化するプラグインのようなもの)をインストールするという指示になる。実際にはdein.tomlは別ルートでインストールされる(.vimrc内でgit cloneを呼ばれる)が、アップデート時にはこちらの情報が使われる(はず)。

この状態でVimを起動する。Terminalでvimと打ちエンター。少し表示が崩れつつdein.vimその他のプラグインのインストールが始まるので待つ。 1分後くらいに「Done」と出るので、一応Vimを再起動させて(:qすると終了するので、その後Terminalでvimと打ってリターン)、 :helpと打ちリターンする。画面が分割され、日本語のヘルプが出てくれば正しく行われている。以降:help 検索したい文字列とやれば日本語でヘルプを参照できる。詳しい使い方は「Software Design」という雑誌の2018年2月号に載っていたりする(これもmattnさん)ので読んでみると良いかも知れない。

お開き

このあたりでタイムアップ。学科一回生のおつかれコンパと日程が被っていたので、その主催者だったすぺくたさんなどはそちらへ。残ったメンバーで別のところに夕食を食べに行った。するといきなり消防車のサイレン。はてさて。

学科打ち上げ@某焼肉屋

ここからは私すぺくたが担当します。鮟鱇さんがVimをいい感じに紹介し、軽い†聖戦 ~ジ・ハード~†が巻き起こっている中、私はvimtutorと格闘しながら何度もEscキーと半角全角打ち間違えたりして「Vim使いにくいやんけー!!!」となっておりました。つらい。かれこれしているうちに学科の打ち上げ(私以外の講習会参加者は不参加)の待ち合わせ時間になったので私は中途退出。集合し焼肉屋へ向かう。「お疲れ様でした~」とか「わいわい」とか「未配属の危機なんやがwww」とか「ゆるキャンはいいぞ」とか飛び交うなか、私の囲む七輪が勢いよく火を噴いていましたが、「ホルモンやしこれくらいはね……」と言っていました。それがあの大惨事を招くことになるとも知らずに……

焼肉が始まりわずか15分ほどのことでした。我々の打ち上げは1階の奥の座敷4卓で行われていたわけですが、どうにもいつもよりも煙が多い。しかもその煙もどうやら焼肉を焼いた煙ではない…… なんだこれはと思って隣に座っていた友人と七輪直上の吸煙口を覗くとなんと

吸 煙 口 が 燃 え て い る
これはヤバいと思っているうちに煙に気付いた店員さんが消火器を持って私の卓へ。ダクトを開くともう大☆炎☆上。店内の全員が避難するのでした……。避難後の様子はこんな感じ↓

さて、小一時間ほど消防と警察の事情聴取などを受けて、事なくして(は?)15分ほどのタダ焼き肉を手に入れた我々は、どう考えてもお腹が満ち足りていなかったのですぐそばのサイゼリヤに行ってご飯を食べ、お開きとなりました。

それにしても弊学科、最初を飾る集まりでは停電・断水を食らい、締めの会とも言える打ち上げでは火事が起こり、次に起こるのは一体……いや、やめておきましょう……。

ちなみに

$ cat matome.md | grep いい感じ | wc -l
12

あんまり言わなかったね!

コメント

  1. nininga より:

    ゆるキャンは良いゾ(打ち上げだけ読んだ)