YKTのどっちがいいかな?

実世界連動地域貢献型すごろくゲームのアプリ開発状況を書いていきます。

シンカリオンでもわかるプログラミング講座(序)

みなさん、ががーん(挨拶)labheaです。
MOMOまであと2週間を切りました。毎日ニヤニヤしながら開発してます。

もう後は当日のお楽しみということで、本番までのあと2回はMOMOの話はおやすみにしようかと思います。

本日のお話

じゃあ今日はなに書くねんということですが、前回出したプログラミングの問題をinovativeさんが解答してくれましたので、その答え合わせをしようと思います。

・・・こら、そこ。戻るボタンを押さない

いまさらではありますが、プログラミング?なにそれ?おいしいの?(懐かしい)な読者層も、ちょっとだけわかった気になれるようなレベルで話を進めていきたいと思います(このやる気が最後まで持つといいなぁ…)。

プログラミング教育

まずは読む気を出してもらうための導入からですかね。今回なんでこんなめんどくさい解説を始めたかというと、2020年度より小学生のプログラミング教育が始まるからです。

小学校の先生がいきなりプログラミングなんか教えられるかと話題になりましたが、プログラミング教育とは果たしてどんなものになるのでしょうか。

文部科学省が公開している手引きをのぞいてみますと、プログラミング教育を行う目的が以下のように書かれています。

小学校におけるプログラミング教育のねらいは、(中略) ①「プログラミング的思考」を育むこと、②プログラムの働きやよさ、情報社会がコンピュータ等の情報技術によって支えられていることなどに気付くことができるようにするとともに、コンピュータ等を上手に活用して身近な問題を解決したり、よりよい社会を築いたりしようとする態度を育むこと、③各教科等の内容を指導する中で実施する場合には、各教科等での学びをより確実なものとすることの三つと言うことができます。プログラミングに取り組むことを通じて、児童がおのずとプログラミング言語を覚えたり、プログラミングの技能を習得したりするといったことは考えられますが、それ自体をねらいとしているのではないということを、まずは押さえておいてください。

特にポイントとなるのが①の「プログラミング的思考」をどう育むのかです。

手引きによれば、実際にプログラムを書くわけではなく、下図のようなことをしたいそうです。

プログラミングというよりはアルゴリズムですね。

論理的思考を身に着けるという観点ではいいかもしれません。

ただ、うまく言語化できませんが、これがわかることとプログラミングを理解すること、興味を持つことがそこまでリンクしないような気がします。

やはりこの図と実際のプログラムとには乖離があるといいますか・・・
もう一段階先があるような気がします。

ともあれ、この教育における最大の成功は、(直接の狙いではないにせよ)子供たちがプログラミングに興味を持つことでしょう。

しかし手引きで言うほど現実は甘くなく、子供が "おのずと" = 誰の力も借りずひとりでにググって、学習しだすわけなんてないんですから。

となると親(となる我々世代)は、いつ聞かれてもいいようにプログラミングぐらいできなきゃというのが本日の趣旨です。

どうでもいいですがこの図おそらく正三角形じゃないよね。。。

プログラミングの基本

さて、プログラミングを始めるというとまずは”Hello world!"からというのが一般的ですが、私あれ嫌いなのでやりません。

とりあえずプログラミング言語どうこうは置いといて、まずは共通の基本概念から抑えていきましょう。

アウトプットがある

何当たり前のこと言ってんだとなるかもしれませんが、ここはしっかりと認識しておいてほしいところです。

プログラムには必ずアウトプットがあります。というよりアウトプットのないプログラムは作る意味がないんです。

だって我々は何かをしてほしくてプログラムをかくわけですから。

それがテキストなのか画像なのか音を鳴らすといった動作なのかはわかりませんが、必ず何かしらの結果が得られるようにする必要があります。

そして、その得られる結果というものは当然人間が手でやるよりも優れていなければ意味がありません

私が"Hello world"が嫌いな理由はここにあります。

"Hello world"とは文字通り、"Hello world"と出力するだけのプログラムなのですが、こんなことプログラムにやらせる必要なんてないんですよ。

だって"Hello world"って打てばいいんだから。

なんで"Hello world"って表示するためだけに

#include <stdio.h>
int main(){
    printf("Hello world");
    return 0;
}

なんて書かなきゃならんのだって感じじゃないですか(c言語)。これ書く間にHello worldって十回かけるわ!

「プログラミング的思考」において割と重要なのは費用対効果を考える力ではないかと思います。きっと授業ではやらないけどね。

何でもかんでもプログラムつくりゃいいってわけじゃないんです。人間の手でやれば10分で済む一回こっきりしかやらない処理を20分かけて開発したって意味がないんです。

毎日繰り返し行う処理、もしくは人間の処理能力では到底不可能な処理を対象にしてこそ、真のプログラミングというものです。

例えば一年に一回しか使わないようなものは果たしてプログラミングするべきなのかどうか、よく吟味する必要があると思います(ブーメラン)。

上から下に一行ずつ処理されていく

これも端折られがちですが、重要な概念です。

プログラムはテキストファイルの先頭行から一行ずつ処理されていきます。

処理の結果として違う行に移動したりすることはありますが、コンピュータがひとりでに行をさかのぼって読んだりしません。

コンピュータちゃん従順!

変数という箱がある

プログラムをしていると値を保存しておく”箱”が欲しくなります。

そういった箱のことを変数と呼びます。

まあ意味としては数学の変数と同じです。

変数には以下の例外を除いて任意の名前を付けて定義することができます。

数字から始まる文字列

inovative4はOKですが、4inovativeはだめです。

演算子が入る文字列

演算子とは+や-などのプログラミング上で意味のある記号のことです。

例えばcapashinkalionならOKですが、capa-shinkalionだとcapaという変数とshinkalionという変数の引き算として認識されてしまいます。

予約語

これは、演算子と似たような話ですが、プログラムの基礎機能としてすでに使われている単語はそちらが優先されるため変数名として使えません。

上のHello worldの例でいうと、printfreturnがこれにあたります。


それから、変数名はスペースを入れずにつながっている必要があります。

つまりcapa shinkalionといった変数を定義することはできません。

こういう場合、言語やプログラマーによっていろいろ流派がありますが、

  • capashinkalion
  • capaShinkalion
  • capa_shinkalion

のように付けるのが一般的ですかね(capashinkalionはあまりよくない例ですが)。

変数には型がある

あーなんか疲れてきたなあ。

変数は値を格納するための箱という話をしましたが、何を入れるための箱なのかをコンピュータに教えてあげる必要があります。

まあイメージでいうとあれですわ。「inovative_homeって箱用意しといて」って言われて、「え、どうしよ段ボールでいいんかな?」とおもってたら、「ほんじゃこいつ格納しといて」ってinovativeを持ってこられた日にゃー「いや~いっといてや~言ってくれたら家用意しといたのに~」ってなっちゃうって話です。

ですので、整数を格納する箱(int型といいます。integer: 整数)を作るなら、

int inovative_no_husaigaku

文字列を格納するなら、

string inovative_no_yomaigoto

inovativeを格納するなら、

ori inovative_home

みたいに型とともに変数名を申告する必要があります。

=(イコール)は代入

ようやくここまで来ました。

じゃあどうやって用意した箱に値を入れるかというと、=(イコール)記号でいれます。

例えば整数型の変数inovative_no_husaigakuに100000を入れるには、

int inovative_no_husaigaku
inovative_no_husaigaku = 100000

のように書けばいいということです。

ただここで注意してほしいのが、=は数学的な等号ではなく、右辺を左辺に格納するという意味であるということです。

例えば数学的には

100000 = inovative_no_husaigaku

でも等号は成り立ちますがプログラム的にはinovative_no_husaigakuの中身を100000という変数に格納するという処理になってしまいます(そして数字から始まる変数は禁止ですのでエラーになります)。

また、”格納”を意味するので、このように

inovative_no_husaigaku = 100000
inovative_no_husaigaku = 150000

プログラムが進むにつれて値を更新することもできます。

さて、ここまでの話をまとめてみると、こんな書き方もできるわけです。

inovative_no_husaigaku = inobative_no_husaigaku + 50000

もし=が数学的な等号を意味していたら絶対に成り立ちませんね。

これは、いままで150000だったinovative_no_husaigakuがまた負けて50000増えて200000になったみたいな処理になるわけです。

どーてきかたづけげんご

さて型の話に戻りますが、わざわざ

int inovative_no_husaigaku  // <- 整数型の箱つくる!
inovative_no_husaigaku = 100000 // <-負債額は100000円!

なんてしなくても、

inovative_no_husaigaku = 100000 // <-ん、どうやら整数が入ってくるみたいやな。じゃあ整数型でinovative_no_husaigakuって名前で変数作って100000を格納しとくか

まで察せよと思う人がいるかもしれません(いないか)。

このように空気が読める言語のことを動的型付け言語と呼びます。

皆さんがこれからやっていくpythonという言語も動的型付け言語です。

ですので、型についてはそこまで気を使う必要はありませんが、頭の片隅に残しておいてください。

CHIKARATSUKITA

予定していた内容の3割くらいしかきていませんが、思いのほか長くなったので今回はここまでにしたいと思います。

次回は、基本的なfor文、if文と手引きにあった正多角形の問題の実装とinovativeの答え合わせをしたいと思います。(が、また長くなって分けそうだなぁ。。。)

PS: inovativeさん

大体こんなコードだろうという予想の元答え合わせをする予定でしたが、もしよろしければコードを提供してください。

おまけ

とてもlatestな話題の記事を見つけたので追記します。

というか半分前回の訂正です。

パスワードが8文字になると52年かかるので理にかなっているみたいな話をしましたが、あれはあくまでも標準的なスペックのパソコン工夫せず実施した場合です。

この総当たり計算は並列化とものすごく相性がいいんです。

1個のメッセ物品に10人分書くのと、10個のメッセ物品に10人で書くのどっちが早く終わるかっていったら後者ですよね?

それと同じで探索範囲をCPUの脳みその単位(コアといいます)ごとに分割してやればそれだけ速くすることができます。

標準的なPCでは2~4コアあるので数倍、私が仕事で使っているPCは12コア、計算サーバーは36コアあるので、探索時間はこれだけで約1/50になります(約5年)。

しかしながら世の中の並列化情勢はいまやCPUよりもGPUを活用したものに移行しています。CUDAプログラミングってやつですね。

GPUは画面の描画をつかさどっているパーツなのですが、実はこの中には一個一個の能力が低いものの、ものすごい数のコアが入っています。

一度CUDAに手を出したことがあるのですが、私の仕事用PCのそこまで高くないグラフィックボードにも675個ものコアが搭載されていた記憶があります。

これだけで処理時間は数百分の一ですね。

さて、ようやく記事の紹介です。

なんと、最新のグラフィックボードGeForce RTX 2080 Tiを使えば、8文字のパスワードは2時間半で総当たりできちゃうそうです。

news.livedoor.com

GeForce RTX 2080 Tiに含まれるコア数は驚異の4352コア!

お値段は約17万円。もちろん高いですが決して一般人が買えない値段ではないことを考えると世の中恐ろしいですね。

皆さん8文字のパスワード、安全ではないですよ!

ちなみにこのGeForce RTX 2080 Tiをもってしても30文字の総当たりにかかる予想時間は7727溝年(溝=1032)です。

文字数は正義ですね。