diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 5469afa5..7859f567 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -55,6 +55,23 @@ export default withMermaid({ { text: '1-B. Windowsの環境構築', link: '/cpp/chapter-1/1-B' }, ] }, + { + text: '2. はじめてのプログラミング', + link: '/cpp/chapter-2/', + items: [ + { text: '2.1 プログラミングの基礎知識', link: '/cpp/chapter-2/1' }, + { text: '2.2 作業環境の構築', link: '/cpp/chapter-2/2' }, + { text: '2.3 はじめてのプログラミング', link: '/cpp/chapter-2/3' }, + { + text: '練習問題', + link: '/cpp/chapter-2/problems/', + collapsed: true, + items: [ + { text: '2-Q1. Hello, Shell!', link: '/cpp/chapter-2/problems/hello-shell' }, + ], + }, + ] + }, ], '/text/': [ { diff --git a/docs/cpp/chapter-2/1.md b/docs/cpp/chapter-2/1.md index 35095081..8ec189b1 100644 --- a/docs/cpp/chapter-2/1.md +++ b/docs/cpp/chapter-2/1.md @@ -2,6 +2,44 @@ ## 2.1.1 プログラミングとは -## 2.1.2 OSとは +プログラミングとは「コンピューターにどのような動作をさせるかを予め指示する行為」である。ここでいうコンピューターは、我々が今使っているノートパソコンだけではなく、TSUBAME のようなサーバーなどや、電子レンジ等の中に入っている制御装置(残り何分かを表示したり、どのボタンを押したかで動作を変えたり)も指し示す。 + +コンピューターは、私達よりもずっと速く、そして正確に計算することができるが、人間の言語を理解できない。人間の言語は思っているよりも曖昧であり、一方コンピューターはすべて0と1の2進数によって動作し厳密に指示を与えなければならない。 +そのコンピューターが理解できる形で指示するために、プログラミングをするのである。 + +::: tip +プログラミング"言語"というものは様々あって、「C++」はその中の一つである。他にも「Python」「JavaScript」「C#」など言語がある中で今回C\++を選んでいる理由は2つ。 + +1. 大抵の言語はC++の(もっと言えばCの)派生だから。C\++で一通りプログラミングを勉強してしまえば、C#など他の言語にすぐに乗り換えられます。 +2. C++が比較的コンピュータ寄りだから。 + +::: + +## 2.1.2 コンパイルとは + +先述した通り、コンピューターは2進数によって動作する。よって与える命令も2進数でできるだけコンピューターでの動作に特化した形式になっている(「機械語」の形になっている)のだが、これを人間が読むことは困難である。よって比較的わかりやすく、かつ機械語に変換できる言語としてプログラミング言語を用いる。 + +プログラミング言語によって記述されたプログラムは、コンピューターが直接命令として理解できる形ではなく、よってコンピューターが読める形に変換しなければならない。 +この操作を「コンパイル」と呼び、コンパイルによって生成された01からなるデータ(バイナリ)をコンピューターは読み込む。 + +```mermaid +flowchart LR +th("人間の考えていること") --> |"プログラミング"| pg("プログラミング言語") +pg --> |"コンパイル"| mc("バイナリ(機械語)") +mc --> |"命令"| cp("コンピューター") +``` + +## 2.1.3 OSとは + +OS は、Operating System の略。この講習会中では、上のグラフの「機械語」を読み取って、コンピューターを実際に動かす部分を担当している。他にも、ユーザーの様々な操作(画面上のポインタを動かす、キーボードの入力を受け付けて適切に情報を分配する、HDD/SDD を操作する、などなど…)とコンピューターをつなぐ役割を果たす。 + +Windows / Mac (Macintosh) は主要な OS である。受講者の大半はこのどちらかのOSを使用しているだろう。 + +他にも、開発においてよく使用される OS として **Linux** が存在し、いくつかの班では Linux を用いて作業する。 + +Mac OS は Linux に「近い」(初学者である間は Linux の一種だと思っても良い)が、Windows は Linux とは大きく異なる OS +なので、Windows ユーザーはよく **WSL** を使用する。 +WSL は **Windows Subsystem for Linux** の略。コンピューターの内部に、仮想的な Linux のコンピューターが入ってると考えると良い。 + +Ubuntu は、Linux ディストリビューションの一つで、Linux のカスタマイズみたいなものである。 -## 2.1.3 コンパイルとは diff --git a/docs/cpp/chapter-2/2.md b/docs/cpp/chapter-2/2.md index a4a80524..938d647a 100644 --- a/docs/cpp/chapter-2/2.md +++ b/docs/cpp/chapter-2/2.md @@ -2,6 +2,77 @@ ## 2.2.1 はじめてのターミナル +まずはターミナルを開いてみよう。黒い画面に白い文字(Mac では白い画面に黒い文字)が出ていて、ここにコマンドを打ち込むことでコンピューターを直接操作することができる。 +試しに `echo "Hello"` と打ち込んで改行すると、`Hello`が出力される。 `echo` は、次に与えられた文字列をそのまま出力するコマンドである。 + +Windows においては、 WSL のターミナルを用いて Linux を操作することができ、Mac においてはターミナルを用いてコンピューターを操作する事ができる。 +Windowsの環境構築で少し出てきた 「PowerShell」は Windows を操作するイメージ。 + +::: tip +`echo` は「こだま・反響」 +::: + +1. 「ターミナル」を起動する +2. `echo "Hello"` と入力する +3. `Hello` という行が表示されていればOK + +![](https://md.trap.jp/uploads/upload_8550a6882b611e212c99ef7b78187cb6.png) + +自分の画面とはおそらく違うだろうが、概ねこのような風に `Hello` が表示されれば問題ない。 + ## 2.2.2 ディレクトリとは +ディレクトリは、エクスプローラー(Windows)/Finder (Mac)で「フォルダ」に相当するものである。ターミナルは常にどこかのディレクトリ上に居るものとして振る舞う。 +Finder/エクスプローラーと見比べながら、コマンドを打ち込んで理解しよう。 + +### ターミナルでの操作 + +1. ターミナルを開く +2. `pwd` で、現在の自分の場所がわかる +3. `ls` で、今居るディレクトリにあるファイル一覧が表示される(最初はほぼないはず!) + +#### エクスプローラー(Windows) + +エクスプローラーを起動すると、自分のコンピューターに保存されているファイルを一覧することができる。 + +1. エクスプローラーの「表示」をタップ + ![](./fig-1.png) + +2. 「ファイル名拡張子」にチェックを入れる + +3. サイドバーに「Linux」があるので、それをダブルクリックする。 + ![](./fig-2.png) +4. 「Ubuntu」をクリック +5. `pwd` コマンドの結果を見ながら、「home」→「(自分の名前)」でアクセスする。 + +#### Finder (Mac) + +Finder を起動すると、自分のコンピューターに保存されているファイルを一覧することができる。 + +1. ⌘ + `,` → 「すべてのファイル名拡張子を表示」をON +2. Finder で⌘+Shift+G +3. `pwd` で出てきたテキストをそのまま入力 + ## 2.2.3 作業環境の構築(仮) + +### コマンド紹介 + +- `pwd` : 現在の自分の場所 (**P**rint **W**orking **D**irectory) +- `ls` : 今いるディレクトリにあるファイル (**L**ist **S**egments) +- `cd <...>` : ディレクトリを移動する (**C**hange **D**irectory) +- `cd ../` 一つ親のディレクトリに移動する (`/home/trap` なら `/home` に移動) +- `mkdir <...>` : ディレクトリを作成する (**M**a**k**e **Dir**ectory) + +### 作業環境の作成 + +1. `cd ~` と入力( `~` は 0 の2つ右のキー `^` と Shift 同時押し);最初の場所に戻る +2. `mkdir pgbasic` と入力; `pgbasic` というディレクトリを作成する +3. `cd pgbasic`; `pgbasic` に移動する +4. `pwd`; 今いるディレクトリの場所を出力する + +### 作業環境を開く方法 + +1. `cd pgbasic`; `pgbasic` に移動する +2. `code main.cpp`; VSCode を開く。ここが講習中の作業場所。 + +もしくは、VSCode を直接起動しても前回のファイル・ディレクトリを開けるようになる。 diff --git a/docs/cpp/chapter-2/3.md b/docs/cpp/chapter-2/3.md index 4f129d5b..947eda2f 100644 --- a/docs/cpp/chapter-2/3.md +++ b/docs/cpp/chapter-2/3.md @@ -2,4 +2,61 @@ ## 2.3.1 Hello, traP! +- VSCode を開く (`code main.cpp` コマンドで開く) + +```cpp:line-numbers +#include +using namespace std; + +int main() { + cout << "Hello, traP!" << endl; + // Hello, traP! を出力する +} +``` + +- 保存して、VSCode 上で 「Run Code」で実行できる。 +- `Hello, traP!` となっている部分を書き換えると出力が変わる。実際に試してみよう。 + +::: tip I 章のまとめ + +- プログラミングとは、「コンピューターにどのような動作をさせるかを指示する行為」 +- プログラムは、コンパイルして実行される +- Windows, Mac, そして Linux という OS がある +- ディレクトリという概念が存在する +::: + +ここまで読んだら、練習問題を解いてみましょう! + ## 2.3.2 [発展] nanoを使ったプログラミング(仮) + +さきほどの操作はすべてターミナル上で完結させることもできる。ここでは少しだけそれを試してみよう。 + +::: info +ここで紹介するのは「できる」というだけでの紹介で、本講習中では VSCode を使うことを強くおすすめします! +::: + +1. 「作業環境を開く方法」まで一緒 +2. `nano nano-test.cpp` でコードを開く +3. キーを入力すると色々入力できる。 +4. ソースコードを入力する。 +5. `Ctrl + X`で終了 +6. `y`を入力したあと、`Enter`を押すと保存 +7. `ls`コマンドで`nano-test.cpp`があることを確認 +8. ターミナル上で、`clang++ nano-test.cpp` で「コンパイル」 +9. エラーが出なかったら、 `./a.out` で「実行」 +10. できた! + +この方法で、次のソースコードからなる `nano-test.cpp` を作成してみよう。 + +```cpp:line-numbers +#include +using namespace std; + +int main() { + cout << "Hello, nano!" << endl; +} +``` + +::: tip +わからなかったり、詰まったりしたらすぐに TA を呼びましょう! +::: diff --git a/docs/cpp/chapter-2/fig-1.png b/docs/cpp/chapter-2/fig-1.png new file mode 100644 index 00000000..6e299a18 Binary files /dev/null and b/docs/cpp/chapter-2/fig-1.png differ diff --git a/docs/cpp/chapter-2/fig-2.png b/docs/cpp/chapter-2/fig-2.png new file mode 100644 index 00000000..ea9c8cd0 Binary files /dev/null and b/docs/cpp/chapter-2/fig-2.png differ diff --git a/docs/cpp/chapter-2/index.md b/docs/cpp/chapter-2/index.md index e9779b21..25b32ae8 100644 --- a/docs/cpp/chapter-2/index.md +++ b/docs/cpp/chapter-2/index.md @@ -1 +1,9 @@ # 2. はじめてのプログラミング + +:::warning @講師, TA + +**この段階で環境構築にまだまだ時間が掛かりそうな受講者が居る場合は、GitHub Codespaces に移行させてください。** +講習後に環境構築の続きをするようにお願いします。 +::: + +まずは「プログラミング」とはなにか、という半ばご高説を垂れるような話から始めよう。 diff --git a/docs/cpp/chapter-2/problems/hello-shell.md b/docs/cpp/chapter-2/problems/hello-shell.md new file mode 100644 index 00000000..63bc070c --- /dev/null +++ b/docs/cpp/chapter-2/problems/hello-shell.md @@ -0,0 +1,113 @@ +# 2-C1. Hello shell + +ターミナル (シェル) のファイルを検索するコマンド、 `find` コマンドで遊んでみましょう。 + +## 問題 + +のひとくんは晩ごはんのメモの URL をディレクトリの中に丁寧にしまっていたつもりだったのですが、名前を適当につけていたのでどこに置いていたか忘れてしまいました。 + +代わりに見つけて、晩ごはんのメモを教えて下さい。ファイルは .txt って末尾だった気がします。 + +そういえば `ls` ってコマンドでファイル一覧を見れた気がするけど、実行してみても全く見当が付きません。 `find` コマンドを使わないと難しいなぁ……。 + +それと、見つけたファイルは `cat [FILE]` で開けるそうです。 + +## 問題ファイルのダウンロード方法 + +```sh +curl https://pg-basic.trap.show/hello-shell.zip -o hello-shell.zip +unzip hello-shell.zip +rm hello-shell.zip +cd hello-shell/ +``` + +::: tip + +Windows (Ubuntu) で、↑のステップの中でエラーが出たら TA を呼んでください。 + +TA 向け: curl と zip のインストールが必要です。もし入ってなければ以下の手順で導入してください。 + +```sh +sudo apt install zip curl -y +``` + +::: + +## 今いるフォルダを Finder / エクスプローラーで開いてみる方法 + +### Mac + +```sh +open . +``` + +### Windows + +```sh +explorer.exe . +``` + +`ls` を実行したときと同じ場所が開かれているはず! + +## 試しにファイルを開いてみる + +`ls` を実行したときに `index.txt` があったはず。以下のコマンドで `index.txt` の中身を見てみましょう。 + +```sh +cat index.txt +``` + +## いざ実践 + +この状態から目標のファイルを探してみましょう。 + +::: tip おさらい コマンドいろいろ + +- `pwd` : 現在の自分の場所 (**P**rint **W**orking **D**irectory) +- `ls` : 今いるディレクトリにあるファイル (**L**ist **S**egments) +- `cd <...>` : ディレクトリを移動する (**C**hange **D**irectory) +- `cd ../` 一つ親のディレクトリに移動する (`/home/trap` なら `/home` に移動) +- `mkdir <...>` : ディレクトリを作成する (**M**a**k**e **Dir**ectory) + +::: + +### ヒント + +::: info ヒント1 + +::: spoiler クリックして展開 + +ファイルの検索は `find` コマンドを使います。 `man find` で find コマンドについて調べることができます。ただし英語。 + +もしくは、Google で `man find` と検索しても良いでしょう。こっちは日本語もあります。 + +見つけたファイルは `cat [file]` で出力できます。 + +::: + +::: info ヒント2 + +::: spoiler クリックして展開 + +`find . -name [探したいファイル]` で調べられます。 `*` を使うと、曖昧検索ができます。 `code-*` と書くと、 `code-` で始まるファイルを検索できます。 + +::: + +::: info ヒント3 + +::: spoiler クリックして展開 + +- `find . -name '*.txt'` でファイルを見つけることができます。 +- `cat [FILE]` でファイルを開くことができます。 `TAB` キーを押すと、候補を選んでくれます。 + +::: + +### 解答 + +::: tip 解答 + +::: spoiler クリックして展開 + +`cat 6db1b5a2e7/08dc869896/memo.txt` でファイルを開いてみましょう。 + +::: diff --git a/docs/cpp/chapter-2/problems/index.md b/docs/cpp/chapter-2/problems/index.md index c62e2659..b43c5d43 100644 --- a/docs/cpp/chapter-2/problems/index.md +++ b/docs/cpp/chapter-2/problems/index.md @@ -1 +1,3 @@ # 練習問題 + +- [2-Q1. Hello, Shell!](hello-shell)