スッキリわかるC言語入門 第2版

【動画あり】スッキリC 第2版 学習環境コンテナの使い方

学習環境コンテナとは、『スッキリわかるC言語入門 第2版』の読者さまによる学習の敷居を下げる目的で、無償・非保証で提供されているしくみです。以下の手順に従って導入・構成を行うことで、お手持ちのPCの中に「C言語開発のために必要なツールやファイルがセットアップ済みの、仮想的なLinuxマシン」を手軽に準備して、学習に利用することができます。

参考『スッキリわかるC言語入門 第2版』購入読者様むけの学習用開発環境としては、当記事で紹介するコンテナのほか、クラウド学習環境dokoCもご用意しています。dokoCを用いると、さまざまなツールをお手元のPCにインストール・セットアップすることなく、ブラウザだけですぐに学習を始められます。「まずはいますぐ、C言語に慣れてみたい」という方は、dokoCの利用をお薦めします。

事前準備

学習環境コンテナを利用するためには、ご利用のPCにDockerDesktopというソフトウェアがインストールされている必要があります。まだインストールされていない場合、以下の手順に従って導入を済ませてください。

コマンドプロンプトからdocker -vと入力することで、バージョンが表示されれば導入には成功しています。

コンテナのダウンロード

学習環境コンテナをダウンロードするには、インターネットに接続された状態で、コマンドプロンプトから

docker run --name sc2 -it flairlink/sc2

と入力するとコンテナのダウンロードと初回起動が行われます。

[misaki@~]$

というプロンプトが表示されたら成功ですので、exitと入力してコンテナを一度終了させます。

注意学習環境コンテナのダウンロード元サーバーであるDockerHubは、多数のアクセスが短時間に集中するとダウンロードを制限します。もしその旨のエラーが表示された場合、時間をあけてアクセスするか、Dockerアカウントを作成してログインして利用するようにします(この制約に関する詳細は、Dockerインストール手順のステップ4解説終盤に紹介があります)。

コンテナの起動とログイン

以降、学習環境コンテナで学習を開始しようとする時は、以下のコマンドでコンテナにログインします。

docker start -ia sc2

次のようなプロンプトが表示されたらログイン成功です。

[misaki@~]$

学習環境コンテナにログインしたら、以後、通常のLinuxマシンとして、ファイルのコピーやプログラムの実行など、一般的なLinuxコマンドを使うことができます。学習を終えるときには、exitと入力して、コンテナから抜けます。

Linuxにおける代表的なコマンドの紹介は、こちらの記事のSTEP3〜6にも紹介があります。こちらの記事は、「macOSにおけるコマンドの使い方」を解説した記事であるため、Linuxコンテナとは画面等が一部異なりますが、「カレントディレクトリの考え方」「lsコマンド」「cdコマンド」「cpコマンド」「mvコマンド」「rmコマンド」「mkdirコマンド」はいずれも同じですので適宜読み替えてご参照ください。
注意exitでコンテナから抜けても、コンテナ内で自分で作成したファイルなどは失われません。ただし、後述の方法でコンテナを削除したり、docker run等で再度イメージを取得すると内容が失われるので十分に注意してください。

コンテナに導入済みのツール

このコンテナには、『スッキリわかるC言語入門』書中で登場するものを含め、以下のツールが既に導入済みなので、すぐに使うことができます。

  • gcc (C言語コンパイラ)
  • make (ビルドツール)
  • nano (エディタ)
  • git (ソースコード管理ツール)
  • doxygen (ドキュメント生成ツール)
  • cppcheck (静的解析ツール)
  • vim (エディタ)
  • emacs (エディタ)
  • curl (Webコンテンツアクセスツール)
  • lynx (Webブラウザ)

たとえば、docker start -ia sc2でコンテナにログインしたあと、/home/misakiフォルダにいる状態となりますので、そのフォルダ内に自分オリジナルのC言語ソースコードhello.cを作成し、コンパイルして実行するには、以下のような一連のコマンドを入力します(灰色部分は入力しません)。


nano hello.c  ・・・nanoエディタが開くのでソースコードを入力して保存して閉じる
ls  ・・・確かに現在のフォルダにhello.cファイルができていることを確認する
gcc hello.c   ・・・gccでコンパイルを行う(成功すればa.outファイルが生成されるはず)
ls  ・・・ 現在のフォルダ内のファイル一覧を表示し、a.outファイルができていることを確認する
./a.out  ・・・ a.outファイルを実行する

code-sc2フォルダの内容

学習環境コンテナにログインした直後、ユーザーは/home/misakiフォルダにいます。
このフォルダには、code-sc2というフォルダが存在し、以下、次のような構造に従って、『スッキリわかるC言語入門 第2版』のファイルが配置されています。

/code-sc2
  /chap00
    /code00-01
      code0001.c ・・・コード0-1のソースファイル
    /code00-02
      code0002.c ・・・コード0-2のソースファイル
     :

たとえば、docker start -ia sc2でコンテナにログインしたあと、code0001.cをコンパイルして実行するには、以下のような一連のコマンドを入力します(黄色マーカー部分は入力しません)。


cd code-sc2   ・・・現在のフォルダにあるcode-sc2フォルダに移動する
cd chap00      ・・・さらにその中のchap00フォルダに移動する
cd code00-01  ・・・さらにその中のcode00-01フォルダに移動する
gcc code0001.c   ・・・gccでコンパイルを行う(これによりa.outファイルが生成されるはず)
ls  ・・・ 現在のフォルダ内のファイル一覧を表示し、a.outファイルができていることを確認する
./a.out  ・・・ a.outファイルを実行する

なお、上記の例では、code-sc2フォルダ内に移動して、ソースファイルがある場所でコンパイルや実行を行いました。nanoエディタを使い、これらソースファイルを自分で書き換えてコンパイル・実行することも可能です。もし、「code-sc2内の書籍掲載ファイルを編集してしまうと、もともとの内容が失われてしまう」ことが懸念される場合は、code-sc2フォルダ内のファイルを/home/misakiにコピーして、その複製したものを修正することもできます。たとえば、docker start -ia sc2をしてコンテナにログインした直後の状態から、


cp code-sc2/code00-01/code0001.c /home/misaki ・・・ code0001.cを自分のフォルダにコピーしておく
nano code0001.c  ・・・ 現在のフォルダ(/home/misaki)にあるcode0001.cを編集して保存する
gcc code0001.c ・・・ 現在のフォルダ(/home/misaki)にあるcode0001.cをコンパイルする

実践動画

ここまでの基本的な利用方法について、コンテナのインストール(0:00〜)⇒コンテナ起動(0:37〜)独自のソースコード作成・コンパイル・実行(0:42〜)⇒書籍掲載コードのコンパイル・実行(1:08〜)を行う様子の動画(無音)です。動画内で入力しているコマンドや操作は、上記記事内のものとは厳密には異なります。

game-sc2フォルダの内容

/home/misakiフォルダには、code-sc2のほかに、game-sc2というフォルダも含まれています。このフォルダが内部に含んでいるpuzmonという実行可能ファイルは、『スッキリわかるC言語入門 第2版』 第12章で取り組むゲーム開発課題の成果物 Puzzle&Monstersの完成品サンプルです(完成品のソースコードは、コンテナ内には含んでいません)。

puzmonは、コンテナ起動直後の状態から、以下の方法で起動することができます。プレイヤー名の部分は、適当に書き換えてください(ゲーム内で使われます)。


cd game-sc2
./puzmon プレイヤー名

第12章の課題に取り組む前に、完成品のイメージをつかんでおきたい場合や、C言語の学習に疲れて息抜きしたい時にご利用ください。

AKAGI-MODEについて

特定の教育指導現場での利用や、「より自分に厳しくC言語の道を究めていきたい」という学習者の方のために、この学習環境コンテナは「AKAGI-MODE」を備えています。AKAGI-MODEでコンテナを利用するためには、コンテナの初回インストールや、以降の利用時のコマンドを、以下のように変える必要があります。

コンテナの初回インストール:
docker run --name sc2a -it -u akagi flairlink/sc2

コンテナ利用時:
docker start -ia sc2a

既に通常モード(misaki-mode)でコンテナを既にインストール・利用している場合も、上記手順で別途AKAGI-MODEのコンテナのインストールや利用が可能です。ただし、これら2つのコンテナは独立しているので、misaki-modeのコンテナで作成したファイルをAKAGI-MODEのコンテナ内から直接利用することはできません。後述の「コンテナ内外でのファイルのやりとり」の手法をつかって、別途ファイルを移動させる必要があります。

AKAGI-MODEでは、通常モード(misaki-mode)と比較して、配置されているファイルに以下のような違いがあります。

  • code-sc2フォルダ内の「スッキリCの章末練習問題」について、その解答例コードが含まれていない
  • code-sc2フォルダ内の「スッキリCの12章課題」について、ヒントコードが含まれていない
  • game-sc2フォルダが存在しない

コンテナのより高度な利用について

学習環境コンテナは、一般的な「AlpineLinuxによるx86-Dockerコンテナ」として、各種のLinuxやdockerの技術を用いて、さらに高度に利用して頂くことが可能です。詳細は、Linux, Dockerに関するWebサイトなどを参照ください。

以下では、特に入門者の方が遭遇しやすいケース別に、いくつか応用を紹介します。

コンテナの利用中に、「なんだかよくわからなくなってしまった」

一度コンテナを終了して再度docker start -ia sc2で利用を再開することが最もおすすめです。コンテナを終了するには、

exit

というコマンドを入力します。状況によっては複数回、exitを入力することで、PCのコマンドプロンプトに戻れるかもしれません。exitコマンドが効かない(無視される)場合は、CTRLキーを押しながらCキーを押す(通称、CTRL+C)でコンテナを終了させられることもあります。

このようにして終了しても、コンテナ自体が削除されているわけではないため、docker start -ia sc2で再度ログインして開発を再開することができます。

 

コンテナ自体の中身のファイルがおかしくなってしまった

「利用中のコンテナの中身がおかしくなってしまった(必要なファイルを削除してしまった等)ので、一度すべて削除して、全部最初からやり直したい」という場合、以下の2つのコマンドを順に入力することで、コンテナを完全に削除できます。


docker rm -f sc2   ・・・ AKAGI-MODEをご利用の場合、docker rm sc2aとしてください
docker rmi -f flairlink/sc2

この操作を行うと、コンテナ内にご自身で作成したソースコードファイル等も失われてしまうため、十分にご注意下さい。

この処理が終わると、再度コンテナのインストール(docker run ...)を行うことが出来るようになります。

コンテナ内とコンテナ外でファイルをやりとりしたい

コンテナ内で作成したファイルを、コンテナ外の自分のPCに取り出すためには、docker cpコマンドを使います。

たとえば、コンテナログイン直後にいる/home/misakiフォルダで作成されたhello.cを、PCの現在のフォルダに取り出すためには、一度exitでコンテナを終了させたうえで、次のようなコマンドを入力します。

docker cp sc2:/home/misaki/hello.c . ・・・末尾に半角スペースとピリオドを入れ忘れないようにすること

逆に、自分のPCの現在のフォルダにあるgoodbye.cを、コンテナ内の/home/misakiにコピーするためには、以下のように記述します。

docker cp goodbye.c sc2:/home/misaki/goodbye.c

よくある質問

Q. docker run 〜でコンテナをインストールしようとしたら、You have to remove (or rename) that container to be able to reuse that name.というエラーが表示されます
既にsc2という名称のコンテナがインストール済みのようです。docker start -ia sc2で利用を行うことができます。一度削除して再インストールしたい場合は、上記の「コンテナ削除」の手順を行ってください。

Q. docker run 〜でコンテナをインストールしようとしたら、toomanyrequests: You have reached your pull rate limit.というエラーが表示されます
多数のユーザーがコンテナをダウンロードしたため、サーバー側によってアクセス制限が行われています。この制限は、Dockerアカウントを作成してログインした状態だと大幅に緩和されますので、こちらの記事のSTEP4終盤の解説に従い、Dockerアカウントを作成・ログインしてご利用いただくか、しばらく待って再度おためしください

Q. docker start 〜でコンテナにログインしましたが、キー入力をしても何も反応しません。
docker start時のオプションとして -ia を付け忘れている可能性があります1。この状態だと、exitと入力してコンテナを終了することもできなくなるため、CTRL+Cで終了させてください。

Q.私のコンテナと知人のコンテナで、収録されているコードに小さな違いがあるようですが、なぜですか
学習環境コンテナは、常に不定期バージョンアップをしています。そのため、誤植報告などによってソースコードに修正が行われた場合、コンテナに収録されるコードも修正版に変更となります。一方、docker runコマンドでコンテナを導入するとき、その時点で最新版のコンテナがダウンロードされます。そのため、docker runを実行した時期が異なると、収録ファイルに違いが生じることがあります。一度手元のコンテナを削除して、再度導入し直すことで、最新版にすることができます。

Q.『スッキリわかるC言語入門』(初版/2018年発売)の購入読者ですが、利用できますか
無償・非保証・非サポートであることと、収録コードが第2版のものですが、それで差し支えなければご自由に利用ください。

Q.『スッキリわかるC言語入門』ではない、他の入門書で学んでいますが、利用できますか
無償・非保証・非サポートですが、それで差し支えなければご自由に利用ください。書籍『スッキリC』もよろしくお願いします。

Q.企業研修や学校教育で利用して構いませんか
無償・非保証・非サポートですが、それで差し支えなければご自由に利用ください。書籍『スッキリC』もよろしくお願いします。

Q.企業に研修サービスを販売している研修企業ですが、利用して構いませんか
無償・非保証・非サポートですが、それで差し支えなければご自由に利用ください。書籍『スッキリC』もよろしくお願いします。

Q.コンテナを修正・拡張・再配布していいですか
さまざまな非公式バージョンが出回ると、入門者の方が混乱したり、緊急性のあるパッチの反映が遅れたり、悪意あるコードを混入させたコンテナが流通するリスクが増えるためお控えください。企業研修や学校教育などで用いる場合も、独自に派生コンテナを作成せず、必ず公式のコンテナの導入方法を学び手の方にご案内ください。

  1. スッキリわかるC言語入門 第2版 第1刷では、p646にて「-a」となっておりました(正誤表)。お詫び申し上げます。正しくは、当マニュアルにあるとおり「-ia」となります。

-スッキリわかるC言語入門 第2版