プログラミング講座 (202) 1次元セルオートマトン

以前、Facebook の Small Basic グループに公開した1次元セルオートマトンのプログラムがあったので、これを Small Basic オンライン用に改造しました。

1dca_18

プログラムはこちらに公開しました。描画が終わるまで多少の時間がかかります。上図はルール18の1次元セルオートマトンについて y 方向に各世代を並べたものです。ルール18を含むいくつかのルールでは上図のようなシェルピンスキーのギャスケットと呼ばれるフラクタル図形を生成します。

関連項目

プログラミング講座 (201) パラメーター

数学のパラメーター

最近の連載で、直線の方程式をパラメーター k で表したり、スーパー楕円をパラメーター θ で表したりしました。このパラメーターは数学用語で媒介変数(ばいかいへんすう)とも言います。確率統計の母数(ぼすう)も英語では parameter です。

y = f(x) において、x を独立変数 (independent variable)、y を従属変数 (dependent variable) と言います。y を x の関数で表せればいいのですが、例えば円の方程式 x2 + y2 = r2 のように y = f(x) で表しずらいとき、媒介変数を使って x = g(θ), y = h(θ) のように従属変数を独立変数の関数で表せると計算がしやすくなったりします。

プログラミングのパラメーター

一方で、プログラミングでは仮引数(かりひきすう)が英語で (formal) parameter です。Small Basic では例えばヘルプ画面に出てくる GraphicsWindow.DrawRectangle(x, y, width, height) の x、y、width、height は仮引数です。これに対して実際に与える値を実引数(じつひきすう)と言い、英語では actual parameter と言います。例えば GraphicsWindow.DrawRectangle(150, 100, 400, 300) の 150、100、400、300 は実引数です。

引数を使うことで、その部分は外から変えられるのでより一般化されることになります。例えば3次関数の y = x3 を計算する関数より y = ax3 + bx2 + cx + d を計算するほうがより一般的な解が得られます。

プログラミングの引数にはもう一つメリットがあります。仮引数がローカル変数として扱われる点です。コピーしたものを変数として使うので、中身を上書きしても実引数は壊れません。

Small Basic では関数の定義ができず、全ての変数がグローバル変数なので、サブルーチンに変数を渡す場合、壊さないようにしたり、事前にコピーするようにするなどの工夫が必要です。また、何を外から渡しているかは、コメントなどで明示したほうが読みやすくなります。

GitHub Gist に Small Basic のサブルーチン群をスニペット (snippet) として公開しています。ここでは疑似的な引数については、

‘ param x, y – Cartesian coordinate

のように記述しています。この param はもちろん parameter の略ですが、伝統的なドキュメント形式として、JavaDoc、JSDoc 3、Doxigen などの(ソースコードからドキュメントを出力する)ツールで @param 仮引数名 と書いているものを真似ました。 ちなみに C# や VB でも <param id=”仮引数名”></param> という記法が使われています。

なお、Gist に上げているサブルーチン群は今のところ Small Basic デスクトップ用なので、Small Basic オンラインでは動かないものもあります。

関連項目

プログラミング講座 (200) 3次ベジエ曲線

2次ベジエ曲線は n = 0.5 のスーパー楕円や放物線が描けることが判りました。3次ベジエ曲線は両端と2つの制御点で描く曲線ですが、どんな曲線が描けるのでしょうか。

3次ベジエ曲線で描ける曲線

まず y = x3 – x が描けるかやってみました。

Cubicbezier_20200913235701

プログラムはこちらに公開しました。y = ax3 + bx2 + cx + d という形の3次曲線は描けそうです。その他に3次曲線の仲間がいろいろあるのですが、試してみたところ |x/a|1/3 + |y/b|1/3 = 1 という式のスーパー楕円、y2 = ax3 という式の半3次放物線、y2 = x3 +3x2 という式のチルンハウス3次曲線は描けることが判りました。

3次ベジエ曲線は2次ベジエ曲線を含む

なお、3次ベジエ曲線は2次ベジエ曲線を含んでいるので、制御点をうまく配置すれば2次ベジエ曲線と同じ曲線が描けます。

3次ベジエ曲線で描けない曲線

こちらも色々試しました。n = 1, n = 1/2, n = 1/3 以外のスーパー楕円は描けません。n = 2 のとき楕円(円)も近似するしかありません。双曲線 y = x-1 も描けません。デカルトの葉曲線 (folium of Descartes) x3 + y3 = 3axy も描けません。サイクロイド (cycloid) x = a(θ – sinθ), y = a(1 – cosθ) も描けませんでした。

あと、試していないのですが、描けなさそうなのが、シッソイド (cissoid of Diocles) (x2 + y2)x = 2ay2 や アーネシの曲線 (witch of Agnesi) (x2 +c2)y – c3 = 0 です。xy の項があると双曲線 (xy = 1) と同様描けないんだと思います。

関連項目

プログラミング講座 (199) スーパー三角関数?

円を一般化したのが楕円、楕円を一般化したのがスーパー楕円なので、円もスーパー楕円の一種です。半径1の円をパラメーターθで表した式が、

x = cos θ

y = sin θ

です。三角関数のコサインとサインです。スーパー楕円をパラメーターθで表した式、

x = sgn(cos θ) a |cos θ|2/n

y = sgn(sin θ) b |sin θ|2/n

はスーパー三角関数と呼んでもいいかもしれません。今回はこれをグラフにしてみましょう。当然ながら a = 1, b = 1, n = 2 のときは半径1の円と同じ式になります。a, b は振幅を表しているだけなので今回は 1 に固定して n を変化させながらグラフを描いていきます。スーパーコサイン (?) の n = 0.5 のときが下図。

Supercosine05

スーパーサイン (?) の n = 1.0 のときが下図になります。

Supersine10

プログラムはこちらに公開しました。

関連項目

プログラミング講座 (198) スーパー楕円

前回、2次ベジエ曲線はスーパー楕円の n = 0.5 のときの形という話をしました。今回はそのスーパー楕円を描くプログラムを作りました。プログラムはこちらです。下図は n = 0.5 のときのスーパー楕円で星形に凹んだ形になります。

Superellipse05

今回は DrawGrid を変更し、方眼線の座標系を数学でおなじみの原点が中心にあって、y 座標が上向きにしました。また、スーパー楕円が見やすいように方眼線の色も変更しました。

追記:n = 2/3 のときのスーパー楕円 x2/3 + y2/3 = 1 は星芒形 (astroid) と呼ばれています。ちなみに小惑星 (asteroid) とは綴りが違うそうです。また、芒(ぼう)はススキや草木のトゲを表す字で草かんむりの下は亡でなはく、左上が付き出ないようです。

関連項目

プログラミング講座 (197) 2次ベジエ曲線

今回は、前回の応用で2次ベジエ曲線を描いてみようと思います。意外と簡単です。前回のように直線を表す緑の点を両端とする中間の点を赤い点で表し、軌跡を赤い線で表しました。下図が2次ベジエ曲線です。

Beziercurve

プログラムと解説はこちら。この2次ベジエ曲線はどのような曲線なのか解説で述べていますが、スーパー楕円と呼ばれるものの一種と判りました。

追記:その後、3次ベジエ曲線について調べていたら、@HMMNRSTさんの「ベジェ曲線を用いて正確に描ける曲線」という投稿を見つけ、3次ベジエ曲線で3次曲線を表せることを知りました。ということは、2次ベジエ曲線で2次曲線も表せそうです。確かめてみたところ、v1=(0, 0)、v2=(0.5, 0)、v3=(1, 1) と置けば放物線 y = x2 が描けます。その後も x を 0.5 ずつ増やしながら y に適切な値を設定すれば放物線を伸ばしていけることも確認しました。つまり、2次ベジエ曲線は、制御点の置き方次第で一部のスーパー楕円や放物線も表せるというのが正確なところです。

追記その2:放物線 y = x2 の区間をいろいろ変えてみた結果、v1=(-0.5, 0.25), v2=(0, -0.25), v3=(0.5, 0.25)のときにスーパー楕円と同じ曲線が描けることが判りました。一部のスーパー楕円が描けると思っていたのは、それ自身が放物線だったからのようです。したがって、2次ベジエ曲線で描けるのは放物線のより一般的な形(たとえば y2 = x や45°回転したスーパー楕円などを含む)ということらしいです。

関連項目

プログラミング講座 (196) 直線の方程式

Small Basic オンラインでのプログラミングで絵を動かすところまで進みました。今回からは、プログラミングと数学の関係を探っていきたいと思います。

今回は直線の方程式で直線上の点を計算します。方程式はベクトルを使って2点を通る式を立てます。2点 v1v2 を通る直線を v で表し、

v = (1 – k) v1 + k v2

とします。k はパラメーターで変化します。例として、v1 = (100, 100)、v2 = (500, 300) としてプログラムを作成しました。

Lineanime

プログラムはこちらに公開しました。この式はプログラミングでよく使う式だと思います。このプログラムのように図形を直線上に移動させるときにはもちろん、2色 v1v2 のグラデーション v を計算するときも同じ式が使えます。これも r, g, b を軸とするカラーキューブの中の直線上の色を取り出していることになるわけです。また、ベジエ曲線の計算にも応用できます。

一つの式をいろいろ応用することで何か本質的なイメージがつかめるようになるのではないかと思います。抽象的な数式をプログラミングによってさまざまな具体的な例としてシミュレーションができることはコンピューターの重要な機能といえそうです。

関連項目

プログラミング講座(186) アフィン変換

Anime の作成からちょっと脱線します。Shapes の移動・回転・拡大/縮小には Move, Rotate, Zoom といった操作が用意されていますが、自前で計算するにはアフィン変換という行列の掛け算が便利です。Small Basic には行列を扱うライブラリがないので、自分で作り始めました。

行列(matrix)を表現するのに Small Basic のジャグ配列(配列の配列)を利用しました。行列演算のサブルーチンに行列の名前を渡せるように以下のような構造にしました。

matrix[名前][“cols”]
matrix[名前][“rows”]
matrix[名前][“values”][行番号][列番号]

プログラム NGR465 で行列の足し算と掛け算を作りました。これをベースに3次元の回転を計算させたのがプログラム JXK757 です。

Ethanol

エタノールの分子をY軸回りに回転させています。このプログラムではベクトルもスカラもそれぞれ1列、1行1列の matrix として表すことで、同じ Matrix_Mul という掛け算のサブルーチンを使っています。計算できるのは、行列×行列、行列×ベクトルとベクトル×スカラです。順番が違うとエラーになります。(スカラ×スカラもやろうと思えばできます。)

関連項目

漢数字の不規則性

アラビア数字を入力し漢数字を出力するプログラムを作成中です。プログラムID NBS194で公開しました。
「一」の扱いがまだうまくいっていません。「一百」「一十」は使わないですよね。
「一千」はあまり使わないのに「千万」は使わず「一千万」を使う。この辺を改良する必要があります。中国語でも同じなのか気になります。

これからの情報教育に関するまとめ

迷路

これまでの日本での情報教育は情報活用に重点を置かれていましたが、各国では単なるICTリテラシー教育から脱却する動きがあります。特に米国で「計算論的思考 (Computational Thinking)」を教えようという動きがあり、そこで何を教えるべきなのか、その方向性を示す情報を集めてみました。


情報教育の方向性に関する情報をまとめてみました。単にPCの使い方でもプログラミングでもない、読み書きソロバンの次に必要な「計算論的思考」とは何なのかに迫りたいと思います。

計算論的思考とは

計算論的思考 (computational thinking) は、カーネギーメロン大学のジャネット・ウィング教授の提唱した言葉で、以下のリンクに原文とその訳があります。一言でいうと「コンピュータ科学者のように考える方法」という意味とのことで、なんとなく分かるのですが、専門用語が多く、本質的なところがはっきりしないと思いました。今年から始まった文部科学省の「プログラミング的思考」もここが源流だと思うのですが、やはりしっくり来ないと思っていました。今、1980年に出版されたシーモア・パパート教授の「マインドストーム」を読んで、ようやく何を目指しているのかが見えてきました。

何を学ぶのか

「計算論的思考」「プログラミング的思考」で何を学ぶのか、ということについて私なりにまとめてみました。

・コンピュータを通して、数学、物理、言語などの仮想的な世界を体験すること。
・学び手が自分の意志でコンピュータに命令を与え、何が起こるのか試行錯誤すること。
・自分なりの手順を考えて体験すること。
・複雑さの構造を分析すること。
・問題を発見すること。誤りの真の原因を探ること。
・思考そのもの、学習そのものについて体験しながら学ぶこと。
・何のために学んでいるのか自分で納得すること。

アンプラグドや「ルビィのぼうけん」のようにコンピュータを使わないでも学べますが、プログラミングを一度体験してみることをお奨めしたいです。子どもが遊びに夢中になって、工夫したり、新しい遊びを考えたりする状況を、科学・言葉・思考などを学ぶ現場で再現しようということであり、これは壮大な実験なのではないかと思います。

2020年について

2020年から小学校でもプログラミング教育が必修となりました。これまで段階的に情報教育が進められてきましたが、ようやく本格的な取り組みが開始されることになります。先生方の負担が大きくなるということは容易に想像でき、私のようなIT業界のOBが相当数いるはずなので、うまく活用されるといいなぁと思っています。

それから、日本のプログラミング教育は新たな教科を設けるのではなく、従来の教科の中に組み入れることになったようです。そういう意味では「情報教育」というより「教育」全体の取り組みと理解したほうがいいのかもしれません。

2021年について

2021年からGIGAスクール構想が前倒しとなり、小学校に1人1台のデバイス(iPad や Chromebook)が配布されたところも多いと思います。私は東京都のTEPRO(ティープロ)にボランティアとして登録し、小学校のお手伝いをすることになりました。

情報教育に関するリンク

Computational Thinking – 計算論的思考
Jeannette M. Wing(Microsoft Research and Carnegie Mellon University)著、中島秀之(公立はこだて未来大学)訳

Center for Computational Thinking, Carnegie Mellon
カーネギーメロン大学のコンピューテーショナル・シンキング(計算論的思考)センターの論文等(英語)

マインドストーム―子供、コンピューター、そして強力なアイデア | シーモア パパート, Papert, Seymour, 貴世子, 奥村 |本 | 通販 | Amazon
この本が出版される1980年までにプログラミング言語 LOGO を使って子どもたちと接したことが書かれていて、今まさにプログラミング的思考の学習方法をどうすべきかという示唆に富んだ本だと思います。

テキシコー [総合 小学校3・4・5・6年生、中・高]|NHK for School
プログラミング的思考を育むNHK総合の番組。Eテレじゃないんだ。

文部科学省作成「小学校プログラミング教育に関する研修教材」について | 小学校を中心としたプログラミング教育ポータル
小学校プログラミング教育の概要や Scratch や Viscuit の教材(ビデオ)を見ることができます。

数学ガールの秘密ノート/ビットとバイナリー | 結城 浩 |本 | 通販 | Amazon
結城先生の数学ガールシリーズの中でもコンピュータの基礎と数学を橋渡ししてくれるおすすめの一冊です。

小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ):文部科学省
小学校段階における論理的思考力や創造性、問題解決能力等の育成とプログラミング教育に関する有識者会議(長っ)の議論取りまとめ。この中では「プログラミング的思考」という言葉が使われています。

CANVASのとりくみ | CANVAS | 遊びと学びのヒミツ基地
NPO法人 CANVAS のとりくみ。また直接リンクできないのですが「CANVAS について」の「趣旨と背景」のページには CANVAS のビジョンが語られています。

プログラミング教育Blog
一般社団法人みんなのコードの代表 利根川裕太さんによるプログラミング教育に関するブログです。

ルビィのぼうけん こんにちは! プログラミング | リンダ・リウカス, 鳥井 雪 | 本 | Amazon.co.jp
子どもたちがプログラミング言語を用いずに「プログラマー的思考法」の基礎を学べる絵本。鳥井雪さんの訳では Computational Thinking は「プログラマー的思考法」と訳されています。

コンピュータサイエンスアンプラグド
ニュージーランドで開発されたコンピュータを使わずに情報科学を教えるための学習法。情報論的思考を学ぶにはむしろ実際のモノやデキゴトの体験が重要かもしれません。

情報処理 2016年04月号 | 本 | Amazon.co.jp
情報処理学会誌「情報処理」2016年4月号:特集 プログラミング入門をどうするか

教育ビジョン2011「誰もが情報技術に主体的に向き合う社会の実現をめざして」 -情報処理学会
2011年の情報処理学会の教育ビジョン

情報教育リンク集 – 情報教育Wiki
三重大学の教育情報に関するリンク集。大学に閉じたWikiなのかもしれないが、開かれたWikiであることを期待して。

Amazon.co.jp: パターン、Wiki、XP ~時を超えた創造の原則 (WEB+DB PRESS plusシリーズ): 江渡 浩一郎: 本
Wiki の歴史について書かれた本です。コンピューティングの歴史とも言えるかもしれません。

神奈川の支援教育関連資料 – 神奈川県ホームページ
神奈川県の支援教育関連資料。支援を必要とする子どもたちへの細やかな教育をすべての子どもたちへ展開していくという神奈川県の「支援教育」の視点は、情報教育にも欠かせないのではないか。