CS50 for Japanese(開始2日目。なお、カウントは取り組んでいる日数)
Week0 Scratch
映像授業を受講した。映像は1時間41分54秒。
日本語字幕もつけられるけど、ある程度の英語能力がある人なら冒頭のめちゃくちゃ早口謝辞以外なら聞き取れるし意味もとれそうなくらい簡単な英語をかなり明確な発音で話してくれている。
今回の目的は「問題を解決することの意味についてよく考えること」。
情報入力(input)と情報出力(output)の間にはブラックボックスがあって、そのまさにブラックボックスこそがコンピュータサイエンスである、
その書き方を今回学んでいこうということです、と授業が始まる。
指を使って数を数えること、電球のオンオフで0か1と数字を表現できること、
またいつも使っている0から9の10進法の数で表現できることをまずは確認(それぞれの各桁に10の異なる値があるよね、という確認)し、
2進法について電球3つを使って説明される。
1つの電球オンオフだけだと2通りだけれど、3つだったらいくつ表せるか。
答えは8。アンケートで7を選んだ人が36%いたけど、
全部オフもカウントできるよね、という確認があった。
コンピュータは、0と1の2桁だけを使用する、2進 (バイナリ) または基数2と呼ばれるシステムを使用している(それぞれの2進数をビットとも呼ぶ、との共有もされた)、
バイナリの世界ではそれぞれの各桁を1(2の0乗)の場所、2(2の1乗)の場所、4(2の2乗)の場所、として定義する、
この時点でやっと電球の比喩から離れられるよね、電球のオンオフはコンピューターの中ではトランジスタと呼ばれているので知っておいてね、ということも言っていた。
ASCII(アメリカ規格らしい、知らんかった)の例で、簡単なメッセージを送ることができるよねということを示し、さらに最近はコンピューターでは8ビットを用いるということを言っていた。あと、ASCIIの時は7ビットだったらしい。
8ビットで表現できるのは256通りであり、これを用いて文面でコミュニケーションをするにはいろいろと足りない、特に学生の指摘の通りアジアの言語(アラビア語等)においては様々なものが足りないよね、というお話があった。
それを現在においては Unicode という規格を使って表現することができており、
泣き笑いの絵文字もコンピューターがビットを受け取って、それをマッピングして表現している、とのことだった。
Notesより
- 絵文字を受け取ると、コンピュータは実際にはバイナリ形式の数字を受け取り、Unicode標準に基づいて絵文字のイメージにマップします。
- たとえば、 「泣き笑い顔」 の絵文字はビット
000000011111011000000010
に他なりません。
色、画像についても同じ原理で、赤・青・緑を混ぜ合わせる量を3バイトで示すのが色、画像はそれを水平方向と垂直方向に色がついた点をならべていくことにより、できるとの説明がなされた。
画像については、拡大してみるとわかりやすいよねと実際に拡大した絵文字を見ていった。
映像はパラパラ漫画を示しつつ、画像の束が映像であることを説明された。
音楽についても同じで、音階やそのほかの指示記号をバイトで表すことができることをかなり簡単に示された。
総括として、JPEGとかエクセルとかそういったものは、どういった規則によって0と1のパターンを保存し、表示するかということについて合意形成の類型であるということが確認された。
アルゴリズムとは、問題を解決するための段階的な指示のことであり、
コンピューターの中の話でなくとも、レシピ本を見て料理を作ることもアルゴリズムということもできるが、人間間のやりとりとは違い、そこに曖昧さの残る余地がないことを説明された。
電話帳で自分の名前を検索する、という事例をベースに以下の説明がされた。
・1ページずつめくって名前を探していくと時間がかかりすぎる。
・2ページずつめくって名前を探していくと、時間は上記の2分の1になるがめくってしまったページに自分の名前が含まれている可能性がある。
・よって、上記2ページずつめくるというアルゴリズムは正しくない。
・しかしながら、この誤り(バグ)はめくってしまったページに戻ることにより修正ができる。
・もう1つのアルゴリズムは、電話帳を真ん中で開き探している名前が右にあるか左にあるかを考えるだけのものである。
・このアルゴリズムは右か左かだけを判断するだけで電話帳が1024ページであれば、10回繰り返すだけで、あと1ページをチェックするというところまで到達可能である。
ここからは、実際にそれをどう落とし込んでいくかということの解説があった。
擬似コード
このパートにおいては、どういったことをやりたいのかを実際の言語(この場合は英語)で記載しそれをどのようにプログラムに落とし込むかの準備が行われた。
いくつか用語の定義が示された。
- 私たちは疑似コードを書くことができます。これは、アルゴリズムを正確な英語 (または他の人間の言語) で表現したものです。
1 Pick up phone book 2 Open to middle of phone book 3 Look at page 4 If person is on page 5 Call person 6 Else if person is earlier in book 7 Open to middle of left half of book 8 Go back to line 3 9 Else if person is later in book 10 Open to middle of right half of book 11 Go back to line 3 12 Else 13 Quit
この文章はすべて動詞で始まっており、これを関数と呼ぶ。
道の分岐のように、どちらに行くかということについて示す文言(If,Else if)がありこれを条件と呼ぶ。
どこに行くのかを決める質問(person is on page,person is earlier in book)はブール式と呼ぶ。
プログラムの一部を繰り返すための文言のことをループと呼ぶ。
実際にScratchを見て触って動かしてみようということが行われた。(詳細は省略)
とてもわかりやすいため自分でも簡単にできるのでは?と思ったけれど実際やってみると多くの過程や前提を落としてしまっており、きちんととらえなおして考えることが大事だと実感した。
Notesにすごくわかりやすくまとまっている。
Scratch (スクラッチ)
この中で「抽象化」という言葉が出てきた。
「猫の鳴き声を」「1秒待って」「3回繰り返す」ということを「meow」という1つにまとめることができる。
これについては、メリットとしてプログラムの中で読みやすく、そのプログラムを構成する要素が少なくてすむということであるという説明がなされた。
なお、Scratchを用いてゲームを作ったということでその実例を見せてくれたが、
自分が作ったもの以外にAndrewという人が作ったRaining Manという実例を見せてくれた。Andrewは現在、CSもプログラミングも関係ない、スポーツチームのマネジャーをやっているということであった。
ただし、CSを学ぶことによって自分の専門性とそれがぶつかりあい、新たなことを考え付くことができるのではないか、ということで授業が終了した。
最初に示された「問題を解決をすることの意味についてよく考えること」に対しては、
原始的な手段を丁寧に確認し次第に複雑な手段へ、という様々なことに通じる基本的な態度や、目的から手段としての正誤を確認すること、などいわれてみると当たり前でしかないことを違う側面からいくつも示してくれていたように思う。