競技プログラミング練習会

2019 Normal

第11回  Ubuntu使い方for ICPC C++er

担当:laft

slides.com/procon2019/11/fullscreen

自己紹介

自己紹介

  • 京都大学工学部情報学科計算機科学コース2回生
  • 本名:平井 雅人
  • AtCoder水色
  • CとC++を普段使ってます。
  • 近況:レポートやばい…

KMC-ID:laft

今日の内容

今日の内容

  • Linux, Ubuntuって何?
  • ターミナルって?
    • GUIとCUI(CLI)
    • 基本的なコマンド
    • C++コンパイル,実行のためのコマンド

Linux, Ubuntu is 何?

OSとは

  • オペレーティングシステムの略。
    • OSは他にもWindowsとかMac OSとかChrome OSとか色々あるよ。
    • (どうでもいいけどOSはオペレーションシステムの略じゃない)

Linuxとは

  • OSの一種
  • 元々、Linux Kernel(狭義のLinux)というOSの核がオープンソース(無料でソースコードまで公表)として公開された。
  • しかしこれ単体ではOSとして動かせない
  • そこで、カーネルに色んなライブラリやアプリケーションなどを詰め込んでそのままでもOSとして使えるようにしたのがLinuxディストリビューション(広義のLinux, 一般にはこれをLinuxと呼ぶ場合が多い)である。

Linuxの特徴

  • 無料ソフトが多くて動作が軽いという特徴を持つ。
  • サーバーによく使われるし、開発者によく使われるイメージ。
    • KMCのサーバーもLinuxで動いてるはず
  • AndroidとかはLinuxをベースにしていたりするので実は結構身近。
  • 多くのディストリビューションは無料なので、本番に向けて一度導入しても良いかも。

Ubuntuとは

  • Linuxディストリビューションの1つ。
  • Linux初心者にはオススメでかなりのシェアを誇る。
  • 他にも良いディストリビューションはあるが、ICPC本番の環境はこれなので、さっきまでの話で入れてみたいと思ったらこれを選ぶと良さそう。

GUIとCUI(CLI)

UIとは

  • User Interface の略。
    • Interfaceは接点、接触面という意味で、UIはユーザーとデバイスの接点を表す。
      • 見た目や使い勝手のことを示すことが多い。
  • 使い方
    • 「このゲームのUI最高!全てが直感的に操作できる。」
    • 「このUIは何。何でこんなに邪魔になるところにReady to Fight置いちゃったの」

GUI、CUI(CLI)ってなに

  • GUI(Graphical User Interface)
    • 普段人々が使っている、マウスで操作できる簡単なUI。
  • CUI,CLI(Character User Interface, Command Line Interface)
    • 強そうな人が使うようなターミナルやパワーシェル、コマンドプロンプトなどで操作するUI。
    • 基本的にキーボードだけで操作する。

当日の環境について

  • 予選当日の環境ではUbuntuのGUI環境が使える。(サーバーにはCLIしか存在しない環境もある。)
  • エディタもEmacsのGUIが使えるのでそこまで不便はしないと思う。
  • ただ、コンパイルや実行はターミナルというCLIからしかできないので、最低限UbuntuのCLIについて知っている必要がある。
  • インターネットも提出と問題閲覧にしか使えないから、WandBoxなども使えない。

端末(ターミナル)について

  • 端末(ターミナル)はUbuntuに標準であるCLI。
    • GUI上でCLI操作をしたい時に使うアプリ。
    • コマンドプロンプトみたいなもの。(Macはターミナルがあるのでほとんどそれ)
  • ターミナルからしかコンパイル、実行はできない。(GUIで実行までできる統合開発環境は使えない。)

シェルについて

  • ターミナルで、ユーザーとOSの中核であるカーネルとのやりとりを仲介してくれるもの。
  • 今日はUbuntuのデフォルトのシェルが「bash」なのでこれについてやります。
  • シェルが理解できる命令コードをコマンドという。
  • というわけでbashのコマンドについて紹介していきます。

ディレクトリとパス

ディレクトリ

  • Windowsで言うフォルダのこと。
    • Linuxではよくこう呼ぶ。
  • この世界にはファイルディレクトリの2種類がある。(他にも特殊なのはあるが)
  • ディレクトリは根つき木構造。
  • カレントディレクトリ
    • 開いているディレクトリのこと。
  • 親ディレクトリ
    • 今見ているディレクトリを含むディレクトリのこと。(要は1つ上のディレクトリ)

ディレクトリ_図(例)

重要なディレクトリ

  • rootディレクトリ
    • 最上位のディレクトリ
    • 大事なものがたくさんあるため、アクセス制限がかかっている。
  • homeディレクトリ
    • 今loginしているユーザー用のディレクトリ
    • 基本的にこの下は自由に使って良い。
    • さっきの図の~がついてるところ。

パスについて

  • パスとは、そのファイルやディレクトリを指定するときの道のこと。
  • Linuxではパスの指定に'/'を使う。
  • "laft/Documents"のように、/でその下のディレクトリを見るイメージ。
  • Documentsディレクトリのmemo.txtファイルを指定する例を次のスライドで示す。
  • カレントディレクトリは'.'
  • 親ディレクトリは'..'である。

パスについて

  • 絶対パス
    • rootディレクトリから見たパス。
    • /Users/laft/Documents/memo.txt
    • ~/Documents/memo.txt
  • 相対パス
    • カレントディレクトリから見たパス。
    • (今、laftがカレントディレクトリとして、) Documents/memo.txt
  • 基本的には楽な相対パスを使うが、どちらを使っても良い。
  • ホームディレクトリの絶対パスに'~'を使える。

基本コマンド集

重要コマンド

  • Linux基本コマンド
    • ls
    • cd
    • mkdir
  • gccのコンパイル及び実行に必要なコマンド
    • g++
    • ./a.out

Linuxの基本コマンド

  • Linuxの基本コマンドの用途
  • Linux基本コマンド集
    • lsコマンド
      • 一覧表示
    • cdコマンド
      • ディレクトリ移動
    • mkdirコマンド
      • ディレクトリ作成

Linuxの基本コマンドの用途

  • 基本的にLinuxの基本コマンドでできることはファイル操作
  • 多分全てをコマンドでやるには経験が足りないので、出来るだけGUIの「ファイル」アプリを使えば十分。
  • これをわざわざやる理由は、コンパイルと実行がCLIからしかできないから。
  • そのために最低限必要そうなコマンドだけやっていくよ!!

lsコマンド

  • lsはリストの略
  • "ls"とすると、カレントディレクトリの中身の一覧を出力する。
atcoder$ ls
abc     agc     arc    test.txt

lsと直接関係ないが、atcoder はカレントディレクトリ名で'$'は仕切りだと思えば良い。常に表示されている。

  • 上の例ではカレントディレクトリのatcoderのディレクトリとファイルの一覧を表示している。

cdコマンド

  • cdはChange Directoryの略
  • "cd <行き先ディレクトリのパス>"とすると、そのディレクトリに移動できる。
atcoder$ cd abc
abc$
  • 上の例ではatcoderからabcに移動している。
  • cdに限らず、行き先ディレクトリのパスはTabキーで補完できる。

cdコマンド2

  • 親ディレクトリに移動したい場合、親ディレクトリのパスは'..'なので、"cd .."とすれば良い
  • 当然、親の親のパスは"../.."
atcoder$ cd abc
abc$ cd ..
atcoder$ cd ../..
program$ 
  • 上の例ではatcoderからabcに、abcからatcoderに移動している。
  • 最後にatcoderの親の親ディレクトリに移動。

mkdirコマンド

  • mkdirはMake Directoryの略
  • "mkdir <新規ディレクトリ名>"とすると、カレントディレクトリ直下にその名前の空のディレクトリを作成できる。
atcoder$ ls
abc     agc     arc    test.txt
atcoder$ mkdir other
atcoder$ ls
abc      agc      arc      other    test.txt
  • 上の例ではlsコマンドによって、作ったotherというディレクトリが増えているのが確認できる。

コンパイルと実行のコマンド

  • g++
    • gccを用いてコンパイルする
  • ./a.out
    • コンパイルで生成されたa.outを実行する

g++コマンド

  • "g++ <コンパイルしたいC++ファイルのパス>"でコンパイルした後、実行ファイル"a.out"をカレントディレクトリに生成する。
a$ ls
main.cpp  sample1.txt
a$ g++ -O2 -std=gnu++14 main.cpp
#コンパイル時のwarning,errorがあればここに出力される。
#errorが発生した場合は当然a.outは生成されない。
a$ ls
a.out  main.cpp  sample1.txt
  • 上の例では、普通はこれくらい書くかなというオプションをg++の後に積んでいます。
  • main.cppの部分のみを書き換えると良さそう。

実行コマンド

  • "./a.out"とするとa.outが実行される。
  • 基本的に以下の手順でファイルを使うと(ICPCでは)便利
  • 入力は予めファイルで取っておいて、<で渡せる。(渡さない場合はその下に手で入力)
  • 出力>で渡すとそのファイルがない場合は作成される。ある場合は全て書き換えられる。(渡さない場合はその下に結果が表示される)
a$ ls
a.out  main.cpp  sample1.txt
a$ ./a.out < sample1.txt > sample1out.txt
a$ ls
a.out  main.cpp  sample1.txt  sample1out.txt

コンパイル・実行について

  • cdとlsを駆使して、作業中のディレクトリに移動する。その後にコンパイルなどのコマンドを叩く!
  • コードを書き換える場合は、C++ソースファイルを保存してから、コンパイル・実行のコマンドを叩こう。
  • 書き変えずに実行のみをもう一度行う場合は、"./a.out"をもう一度するだけで良い。

コマンドを叩くときの小技

  • GUIの「ファイル」ソフトで開いている場所のパスをcdに入れるの面倒。
    • 行きたいディレクトリにあるファイルをドラッグして、ターミナルにドロップすればそのファイルのパスを写せる
  • 同じコマンド叩くのだるい。
    • 矢印キーの上で過去のコマンドを遡れる
  • g++ のオプション長い。
    • "alias gpp=g++ -O2 -std=gnu++14"と一度叩いておけば、gpp main.cppでコンパイルできるようになる。('='の両端に空白を入れると通らないので注意)

導入方法

Ubuntuの導入for Windows

Ubuntuの導入for Mac

  • そもそもMacのターミナル、デフォルトはBashだし、このためだけに導入する必要はなくないですか??
  • Virtual Boxとかいうのを使ってインストールできる。(2回目)(後述)

Virtual Boxで導入する

コンテスト

  • 今日は過去問2017!!!!!!!
  • 今日はチーム戦!
    • チーム内の相談ありで、同時にコーディングに使える計算機を一台までとします。(ググったり、問題を見るのに使うのは可)
Made with Slides.com