Check our Terms and Privacy Policy.

低学年児童のためのプログラム教育教材の作成とそのための実践:第一版 (2nd)

プログラミングという概念は、手続きを書くことと同義ではありません。 プログラムそのものの概念の把握から、プログラミングの考え方の多様性を理解できる教材を目指します。 主に小道具を使うアンプラグドな環境においてパズルやゲームを題材としたものを想定しています。

現在の支援総額

4,000

0%

目標金額は2,080,000円

支援者数

1

募集終了まで残り

終了

このプロジェクトは、2017/08/02に募集を開始し、 2017/08/30に募集を終了しました

このプロジェクトを見た人はこちらもチェックしています

低学年児童のためのプログラム教育教材の作成とそのための実践:第一版 (2nd)

現在の支援総額

4,000

0%達成

終了

目標金額2,080,000

支援者数1

このプロジェクトは、2017/08/02に募集を開始し、 2017/08/30に募集を終了しました

プログラミングという概念は、手続きを書くことと同義ではありません。 プログラムそのものの概念の把握から、プログラミングの考え方の多様性を理解できる教材を目指します。 主に小道具を使うアンプラグドな環境においてパズルやゲームを題材としたものを想定しています。

このプロジェクトを見た人はこちらもチェックしています

ネタ本を新たに発掘しました。『マイコンとパズルの世界 BASICプログラミング頭の体操』〔小谷 善行, 産報出版, 1981.〕。 プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。 また、私個人についてはこちらをご覧ください。 では本題、前回の続きです。 先の符号ビット表示のみを取り出し、そのまま並べてみます:符号ビット表示1111110 111111011111110 1111111100 100 10110 1110110 111011110 11111011110 1111101111111110 11111111110111110 111101110 1101110 1101110 11010 010 010 0 さらに、これを8ビットずつの並びにしてみます:2進表示1111 1101   1111 1011   1111 10111111 1100   1001 0110   1110 11011101 1110   1111 1011   1101 11110111 1111   1101 1111   1111 10111110 1111   0111 0110   1110 11011101 1010   0100 1001(最後に1ビット、1を付け加えています。) 16進表示FD FB FBFC 95 EDDE FB DF7F DF FBEF 76 EDDA 49 この場合、元の32バイトが、17バイトに収まっています。もっとも、これはデータの部分だけですが。 なお、今回は、圧縮の対象のデータを8bit固定長としましたが、可変長でも構わないことに注意してください。 さて、この16進表示だけでは、元に戻せないので、戻すための辞書も作りましょう。前回の投稿分の、「ここで、これらに次のようにbit単位の符号を割り当てたとします」にこのようなデータがありました:値  回数  ビット列00 2   111111001 1   1111111080 1   11111111002 5   040 5   1004 5   11020 5   111008 3   1111010 3   1111101F 1   1111111110F8 1   11111111110 ここで「回数」は必要ないので削除します。ついでに「ビット列」と「値」も入れ替えてみましょう:ビット列        値  1111110     0011111110    01 111111110   80 0           0210          40110         041110        2011110       08111110      101111111110  1F 11111111110 F8  これを、ビット列の長さで並べ替えます:ビット列        値  0           0210          40110         041110        2011110       08111110      101111110     0011111110    01 111111110   80 1111111110  1F 11111111110 F8  続いて「値」もビット列に直しましょう:ビット列        値   値のビット列  0           02  0000 001010          40  0100 0000110         04  0000 01001110        20  0010 000011110       08  0000 1000111110      10  0001 00001111110     00  0000 000011111110    01  0000 0001111111110   80  1000 00001111111110  1F  0001 111111111111110 F8  1111 1000 さて、次にこの「ビット列」と「値のビット列」をくっつけます。この場合、「可変長 + 8ビット」という形式に決まっており、かつ「可変長」つまり「ビット列」の部分は “0” で終っていることに注意しましょう:全体のビット列0 0000 001010 0100 0000110 0000 01001110 0010 000011110 0000 1000111110 0001 00001111110  0000 000011111110 0000 0001111111110 1000 00001111111110 0001 111111111111110 1111 1000 では、これを8ビットずつにくっつけたり分割したりします:全体のビット列 2進表示0000 0001  0100 1000  0001 10000001 0011  1000 1000  0011 11000001 0001  1111 0000  1000 01111110 0000  0000 1111  1110 00000001 1111  1111 0100  0000 01111111 1100  0011 1111  1111 11111011 1110  0011 1111(最後に1を6こ付け加えました。) これにより辞書の部分は20バイトとなります。 では、これからもとの「辞書」を再現できるかやってみましょう。まず、1ビットめは「0」ですから、符号は「0」のみで、以下の8ビットは元の値です。その8ビットは「0000 0010」とわかります。その次のビット列は「10」で、それに続く8ビットは「0100 0000」だとわかります。さらにその次のビット列は「110」で、それに続く8ビットは「0000 0100」だとわかります。以下略。 このようにすると、先のデータに対して辞書を加えて、17バイト + 20バイト = 37バイトとなりました。前回の投稿の「最後に8ビットごとの “□” と “■” の並びをそのままバイトに置き換えるとします」の箇所では32バイトでしたので、嬉しい結果ではありませんが、もとのバイト数が少なかったからというところでしょう。辞書は必要ですが、ここではデータ本体が32バイトに対して17バイトになったことでよしとしましょう。 これらの例は、すこしばかり不自然な面もありますが、データ表現やデータ圧縮の入口のネタには使えるのではないかと思います。もうすこし工夫が必要ですが。文字、それもアルファベットのようなシンプルなものではなく、絵や漢字にすると、面白さとしては違ってくるかと思います。 興味を持たれましたら、ぜひご支援や、コメントを頂ければと思います。


プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。 また、私個人についてはこちらをご覧ください。 では本題です。 別の課題として、データ圧縮を取り上げることも可能かと思います。白黒のドットのまとまりを対象にすれば、ラン・レングスなどの簡単なデータ圧縮方法もあるかと思います。『コンピュータ使わない情報教育 アンプラグドコンピュータサイエンス』では、微妙に変形したラン・レングスを題材にしていました。あるいは、『コンピュータ使わない情報教育 アンプラグドコンピュータサイエンス』で同じく扱かっていますが、例文によっては文字や単語などの頻度からデータ圧縮を課題にすることも可能でしょう。 16 x 16ドットの簡単な画像を例にしてみましょう。まず、この例では、ビット表示の1ビットを送る、あるいは記録するのに1バイトを用いるものとします (ちょっと不自然ですが):ビット・マップ          ビット表示(実際にはバイト)□□□□□□□□□□□□□□□□ 0000000000000000□□□□□□□■■□□□□□□□ 0000000110000000□□□□□□■□□■□□□□□□ 0000001001000000□□□□□□■□□■□□□□□□ 0000001001000000□□□□□■□□□□■□□□□□ 0000010000100000□□□□□■□□□□■□□□□□ 0000010000100000□□□□■□□□□□□■□□□□ 0000100000010000□□□□■□□□□□□■□□□□ 0000100000010000□□□■■■■■■■■■■□□□ 0001111111111000□□□■□□□□□□□□■□□□ 0001000000001000□□■□□□□□□□□□□■□□ 0010000000000100□□■□□□□□□□□□□■□□ 0010000000000100□□■□□□□□□□□□□■□□ 0010000000000100□■□□□□□□□□□□□□■□ 0100000000000010□■□□□□□□□□□□□□■□ 0100000000000010□■□□□□□□□□□□□□■□ 0100000000000010 この方法だと、16 x 16 = 256バイトが必要になります。 このビット・マップは、“□” と “■” で構成されています。これに注目した方法はなにかないでしょうか。横方向に “□” が何個並んでいるかを数えるというような方法はどうでしょう。ラン・レングスと呼ばれるものの一種です。 ここで、変則的かもしれませんが1バイトを4ビットずつに分け、各4ビットの一番上位のビットが “0” であれば「□」であることを示し、 “1” であれば「■」であることを現わすものとします。「□」、「■」の並びの数は、残りの3ビットを使い、 “0” から “7” までを数えられるものとします。これで試してみましょう:ビット・マップ           4ビット-1バイト表示□□□□□□□□□□□□□□□□ 0:7-0:7 0:2-0:0□□□□□□□■■□□□□□□□ 0:7-1:2 0:7-0:0□□□□□□■□□■□□□□□□ 0:6-1:1 0:2-1:1 0:6-0:0□□□□□□■□□■□□□□□□ 0:6-1:1 0:2-1:1 0:6-0:0□□□□□■□□□□■□□□□□ 0:5-1:1 0:4-1:1 0:5-0:0□□□□□■□□□□■□□□□□ 0:5-1:1 0:4-1:1 0:5-0:0□□□□■□□□□□□■□□□□ 0:4-1:1 0:6-1:1 0:4-0:0□□□□■□□□□□□■□□□□ 0:4-1:1 0:6-1:1 0:4-0:0□□□■■■■■■■■■■□□□ 0:3-1:7 1:3-0:3□□□■□□□□□□□□■□□□ 0:3-1:1 0:7-0:1 1:1-0:3□□■□□□□□□□□□□■□□ 0:2-1:1 0:7-0:3 1:1-0:2□□■□□□□□□□□□□■□□ 0:2-1:1 0:7-0:3 1:1-0:2□□■□□□□□□□□□□■□□ 0:2-1:1 0:7-0:3 1:1-0:2□■□□□□□□□□□□□□■□ 0:1-1:1 0:7-0:5 1:1-0:1□■□□□□□□□□□□□□■□ 0:1-1:1 0:7-0:5 1:1-0:1□■□□□□□□□□□□□□■□ 0:1-1:1 0:7-0:5 1:1-0:1 この「4ビット-1バイト表示」のバイト数を数えてみると、45バイトになります。 最後に8ビットごとの “□” と “■” の並びをそのままバイトに置き換えるとします。“□” は0に、 “■” は1とします。ビット・マップ          バイト表示□□□□□□□□□□□□□□□□ 00 00□□□□□□□■■□□□□□□□ 01 80□□□□□□■□□■□□□□□□ 02 40□□□□□□■□□■□□□□□□ 02 40□□□□□■□□□□■□□□□□ 04 20□□□□□■□□□□■□□□□□ 04 20□□□□■□□□□□□■□□□□ 08 10□□□□■□□□□□□■□□□□ 08 10□□□■■■■■■■■■■□□□ 1F F8□□□■□□□□□□□□■□□□ 10 08□□■□□□□□□□□□□■□□ 20 04□□■□□□□□□□□□□■□□ 20 04□□■□□□□□□□□□□■□□ 20 04□■□□□□□□□□□□□□■□ 40 02□■□□□□□□□□□□□□■□ 40 02□■□□□□□□□□□□□□■□ 40 02 このサイズの、2値のビットマップは、右にあるように 2 x 16 = 32バイトを必ず必要とします。 ここまででも課題とてしては十分なのでしょうが、企画の課題とは別に、どうせなので技術としてのデータ圧縮も眺めてみましょう。題材は3つめのものを使います。3つめのもののバイトの出現頻度は次のようになります:値  回数00 201 1 80 102 540 504 5 20 508 310 31F 1F8 1 ここで、これらに頻度に応じて次のようにbit単位の符号を割り当てたとします:値  回数  ビット列00 2   111111001 1   1111111080 1   11111111002 5   040 5   1004 5   11020 5   111008 3   1111010 3   1111101F 1   1111111110F8 1   11111111110 これを上の図のバイト列に当てはめていきます:バイト表示  符号ビット表示00 00  1111110 111111001 80  11111110 11111111002 40  0 1002 40  0 1004 20  110 111004 20  110 111008 10  11110 11111008 10  11110 1111101F F8  1111111110 1111111111010 08  111110 1111020 04  1110 11020 04  1110 11020 04  1110 11040 02  10 040 02  10 040 02  10 0 長くなったので、続きは次回にいたします。 興味を持たれましたら、ぜひご支援や、コメントを頂ければと思います。  


プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。 また、私個人についてはこちらをご覧ください。 では本題です。 他の課題としては、データベースというものも考えられます。たとえば、「名前」と「電話番号」の並びからなるデータベースにおいて、目的とする「名前」と「電話番号」にどのように到達するか、またどうやって平均として速く到達できるかというような課題もあるかと思います。配列や木構造、ハッシュなど、先に挙げたものの延長線上の例題にはなるものの、見た目が違うという点では、候補の一つです。 迷路というのも、題材とてしては悪くないものではないと思います。木構造を使うにせよ、グラフを使うにせよ、探索が必要になるため、講習で扱うとしても後の方になるのではないかと思いますが。あるいは、探索はどっちにしろ必要になりますが、迷路をそのまま配列で表現するという方法もあるでしょう。 また、実質的に迷路とほぼ同じなのですが、地図の上の場所Aから場所Bに到達できるのかという課題もありえるでしょう。ただ、最小距離でという条件を付けると、難易度が上がりすぎるかもしれません。これをすこし面倒にしたものとして、地図の上の点を全て結ぶにはどうしたらいいかという課題もあるでしょう。 あるいは、ハノイの塔も同じく木構造と探索の例になるでしょう。 あるいは、児童・生徒には高度な課題になるかもしれませんが、オセロの対局ソフトというのも課題になるでしょう。オセロではなくチェッカー (あるいはドラフツ) の対局ソフトも、検討ないし視野に入って来ます。これらも木構造と探索が必要になる例題です。 オセロ、あるいはチェッカーと、迷路、そしてハノイの塔のどれを採用するかはわかりませんが、これらはどれであってもおそらく児童・生徒にとっては高度なものになると思います。対戦ではない分、オセロやチェッカーよりも、ハノイの塔や迷路の方が扱いやすいかなとは思いますが。なんにせよ、なにか別のものに落し込む必要があるかもしれないと思います。 オセロやチェッカーについては、改めて紹介したいと思います。 なお、「普通のパズルではない「正規表現クロスワード」がBBCラジオに登場」というようなものを除いて、クロスワード・パズルはコンピュータにとっては難易度が高いものの一例です。これの場合、辞書があればなんとかなりますが、一般のクロスワード・パズルは意味処理が必要になる場合が多いためです。その部分は、人工知能という言葉が一般によく使われるようになった今でもコンピュータにとって苦手な部分です。 これらは、単純に思いつく題材ですが、いずれも低学年児童向けに、どのような課題に落とし込むかという問題があるでしょう。興味を持たれましたら、ぜひご支援や、コメントを頂ければと思います。 次は2回に分けて、データ圧縮の話です。


繰り返しになりますが。プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。 また、私個人についてはこちらをご覧ください。 では本題です。 本文に紹介した『コンピュータ使わない情報教育 アンプラグドコンピュータサイエンス』には、数当てゲームが課題として挙げてあります。具体的には、実際の形は違いますが、海戦ゲームの見た目というか、それに似た形を取っています。 『コンピュータ使わない情報教育 アンプラグドコンピュータサイエンス』では、数を当てるのに、当てにくい方法と当てやすい方法を紹介し、採用しています。たとえば、数がソートして並べていられれば、当てる側がそれを知っていれば平均して当てやすくなります。これは、当てる際に木構造によって数の並びを想定しやすいからです。また、特定の数ではなくいくつかの数の集まりを当てるという例もあり、これはハッシュを用いた例題になっており、これも平均して当てやすくなります。どのようにハッシュを求めているのかがわかれば、一回で当てられます。これらはどちらも当てやすい方法です。 対して、数がランダムに並べられていれば、平均して当てにくなります。 これをそのまま使うのは憚られますが、課題としてはシンプルなものであり、配列、木構造、ハッシュを一纏めに扱えるという利点はあります。 というのも、この課題の一部にはソートされた並びが使われていますし、ハッシュも用いられています。これは、自分自身の数の並び (たとえばトランプのAからK) を、自分自身でソートしたりハッシュを求めて並べたりし、それを相手に宣言するという方法もありますし−−『コンピュータ使わない情報教育 アンプラグドコンピュータサイエンス』ではその方法です−−、相手に自分自身の方法で並べさせ、その上で数を当てるという方法にも発展できるでしょう。 なお、ソートについて既に触れた記事としては「普通のバブルソートと普通ではないバブルソート」ではバブルソートが、「課題においてデータ構造やアルゴリズムを指定するか」では選択ソートが、「ガジェット・コンピューティング」ではスパゲッティ・アナログ・ガジェット (スパゲッティ・ソート)があります。 それはともかく、上のように言葉だけではわかりにくいかもしれないので、すこしばかり例を挙げましょう。 まず、ソートされている例です。とりあえず、トランプを使うとしての場合です。 “❺” が、児童Bが当たりと決めたカードとします。そして「小さい順にソートされている」とは宣言しますが、 “❺” を選んだことは隠されています。その上でこのようなやりとりがされるかもしれません:児童Bのカード0: ①②③④❺⑥⑦⑧⑨⑩⑪⑫⑬児童A: 7児童B: それより小さい1: ①②③④❺⑥   ⑦⑧⑨⑩⑪⑫⑬児童A: 4児童B: それより大きい2: ①②③④  ❺⑥   ⑦⑧⑨⑩⑪⑫⑬児童A: 5児童B: 当り!3: ①②③④  ❺  ⑥   ⑦⑧⑨⑩⑪⑫⑬ この当り外れの部分のみを取り出して、データ構造として書いてみましょう:0: ①②③④❺⑥⑦⑧⑨⑩⑪⑫⑬      ↙      ↘1: ①②③④❺⑥  ⑦⑧⑨⑩⑪⑫⑬     ↙  ↘       ↘2: ①②③④  ❺⑥  ⑧⑨⑩⑪⑫⑬     ↓   ↓ ↘     ↘3: ①②③④  ❺  ⑥   ⑧⑨⑩⑪⑫⑬ 簡単な探索の例ですが、木構造になっていることがわかるかと思います。 児童・生徒のやりとりとして:児童A: 7児童B: それより小さい児童A: 4児童B: それより大きい児童A: 5児童B: 当り! というやりとりだけを見ると、このような木構造での探索をしているということは意識しにくいかもしれません。ですので、ここで書いたような図を児童・生徒に一回のやりとりごとに書いてもらうという方法になると思います。 また、児童Aと児童Bが交互に数字を言うことで、ゲーム性もとりあえず維持できるかもしれません。さらには、どのような並べ方をしたかを宣言する必要はあるでしょうが、ソートした場合とランダムに並べた場合、あるいはハッシュにして並べた場合なども選択できることで、当てられにくい並べ方をするというような戦術的な(?)部分も組み入れられるかと思います。このあたりは、何回かゲームを繰り返すことで、発見的・体験的に学ぶ方向に持って行きたいと考えています。 ただ、ハッシュの場合の扱いに、難点があるとは言えるでしょう。『コンピュータ使わない情報教育 アンプラグドコンピュータサイエンス』でも同じですが、ハッシュだと他の場合とすこしルールが違っていたりします。例えばですが:1と倍数でないもの: 1, 7, 11, 132と2の倍数: 23と3の倍数: 3, 6, 94と4の倍数: 4, 8, 125と5の倍数: 5, 10 このようにあったとします(「Xの倍数」は、Xが大きい方に入れています。その他、あくまで例なので、細かいところは無視してください)。『コンピュータ使わない情報教育 アンプラグドコンピュータサイエンス』の場合、ハッシュ値に対応する数については、どのようにハッシュを求めるかは決まっており、その戦艦(?)に対応する数字を宣言します。その上で、ハッシュ値を当てればいいという形になっています。この方法だと、一回で当たります。 この例の場合だと、「この方法を取っている」と宣言し、かつ「6」と宣言します。すると相手は「3と3の倍数」と宣言すればいいというわけです。 これを「海戦ゲーム」風の解釈をするなら(海戦ゲームにこのようなルールはあったか不明ですが)、ハッシュ値に対応した数の集りは、いわば密集した艦隊を形成していて、その艦隊を当てればいいという解釈だとも言えるかもしれません。ですが、正直、多少思うことがないわけでもありません。このあたりをうまく扱かえる方法があればいいのですが。 いずれにせよ、このような題材のままというわけではないとしても、題材や、それをどう落とし込むかを検討したいと考えています。興味を持たれましたら、ぜひご支援や、コメントを頂ければと思います。


ちょっと思いつき
2017/08/15 23:04

教材、資料に、ご支援いただいた皆さんのお名前を記載するというのを、思いつきました。 これをリターンに加えると、現在承認されているリターンの内容の変更となり、再度申請を行なう必要が出てくるような気がします。 悩ましいところではありますが、そういうことを思いついたということだけを。