物事を学習する際には基礎からスタートするので段階的に覚えていくことになりますが、そうした基礎知識の拡張によって出来ることが増えていきます。これは、どの分野にも当てはまりますが、 ■ 処理が複雑 ■ 使用する変数が多い ■ 構図が複雑 である場合、知識、経験、能力がない場合には対応できません。その為、全く理解できない状態に陥ってしまうので、初期段階では、こうした分野の基礎を個別に理解していく事になります。 プログラミング言語も同様に 【 簡素なことからスタートする 】 ことになりますが、現在は最初からタイピングを用いるコーディングではなく、ブロックを使ったノンコードの物も存在しています。 とは言っても、 【 処理の実装をしないと動かない 】 という至極当然な内容は存在しているので、処理の実装をする際に、コードによる記述で挙動を指定するのではなく、ブロックやノードで指定できるものが用意されています。 その代表例として、 ■ Scratch がありますが、これが、コンピューター上で動作するアプリケーションを作れるものになっています。 と言っても、Scratch 3.0では、 ■ グラフィックエディタ ■ 簡易版のオーディオエディタ が用意されているので、グラフィックでは ■ ベクターグラフィック ■ ラスターグラフィック を使用できるようになっており、これを使ってスプライト内に格納できるコスチュームを作成できるようになっています。また、オーディオではオーディオのトリミングや簡素なフィルター処理が出来るので、音の加工の初歩的なことは出来るようになっています。 その為、Scratchを使うと ■ スプライトの管理 ■ 音の管理 ■ 制御用のプログラミング が出来るのですが、この構造は、 【 ゲームエンジンと同じ 】 なので、素材を作って動かすまでの事が一つのアプリケーションで出来るようになっています。 こうしたツールを使うと、 【 アプリケーションの基本的な作り方 】 を学習できるのですが、Scratchで複雑なことを行おうとすると 【 処理が重たくなる 】 ので、 【 実行可能な最適化 】 を模索することになります。これは、PC環境でも 【 構成ごとに上限が異なる 】 ので処理の最適化が必要になりますが、ゲーム機のように 【 仕様が決まっている物 】 だとそのハードウェアの処理能力を基準として出来ることを模索したり 【 処理能力に合わせた最適化を行う 】 必要が出てくるわけです。 その為、 【 何を使うにしても最適化は必要になる 】 わけですが、これをScratchで行える範囲で試すことが出来ます。 Scratchの場合、アプリケーションはウインドウ上で動く仕様になっているので最初からGUIでのプログラミングが行えるようになっているのですが、ウィジェットを使うと、 ■ printなどによる文字列の表示 ■ inputによる入力待ち のようなもの存在しないのですが、他のプログラミング言語でウィジェット環境を用意してデスクトップアプリを作る際にも発生する 【 文字列の取り扱いをどうするのか 】 を考える必要が出てきます。 ScratchはScratch内で動作するデスクトップアプリを作るような仕様なので、 ■ 画像 ■ 音声 ■ イベントハンドラ を使用できるので、 ■ キーの判定 ■ マウス操作の判定 などを扱えるようになっています。通常のプログラミング言語はコンソールで動かして挙動を覚えてバックエンド側の処理の方法を覚えることを先に行うので、こうしたウィジェットを使ったものは 【 拡張機能扱い 】 なので、入出力の違いと変数のやり取りの方法を追加して対応することになりますが、基本的に ■ ウィジェット環境 ■ 画像 ■ 音声 については、標準ライブラリを使用することになります。Pythonの場合だと、標準ライブラリよりも多機能なものがあるので、外部ライブラリをインストールして使用することになりますが、標準的な構成で運用したい場合には、venvを使って仮想化環境を作ってそこでどうさするようにしておくと、外部ライブラリの入っていないプレーンな環境(venvは追加しますが...。)とコードを書くのに必要なものをインストールした個別の環境を扱うことが出来るようになっています。この場合、マシンスペックを高めにしておいたほうが作業がしやすくなりますが、現在は 【 作業に必要なライブラリの構成を個別の環境で用意してコーディングできる 】 ようになっているので、画像処理系のアプリを作るためのものと全く関係ない数値的なAIを使用したアプリを作る環境を分けてみたり、この2つとは異なる3DCGを使ったゲーム開発の環境もライブラリが混在しないように作業環境を分けることが出来るようになっています。とは言ってもvenvはPython 3.3から存在しているので、2012年には実装されていたものになりますが、現在ではごく当たり前に使用できるものになっています。 Pythonでも ■ 画像 : tkinterやturtle ■ 音声 : オーディオのライブラリ を使うことになりますが、WINDOWSの場合だと、WINDOWS用のライブラリが存在しているので、オーディオではWIDOWSの機能を使用できます。MACやLinuxでは異なるライブラリを使用しますが、同じプログラミング言語でもOS独自の機能が用意されています。 Scratchの場合だと、このウィジェット環境をBASICインタプリタのようにライブラリの読み込みなしに使用できるのですが、外部ライブラリを称する際にもインポートをすれば使用可能なので昨日の拡張は出来ますが、他のプログラミング言語のように使用する際に呼び出す処理の実装が不要になっています。その為、追加をした倍にはそのままブロックを使用できる仕様になっています。
OSの有無
20世紀のプログラミング言語と言うと機械語からスタートして、十六進数だけでは解らないので、これを少し人類よりにして、機械ごと1:1でやり取りできるアセンブリ言語が登場します。これも、見ただけでは何をしているのか解りにくいので 【 習得難易度と対象年齢が高すぎる 】 のでもう少しわかり易くした言語が登場します。それがFortrunになります。これが最初の高水準言語になりますが、アセンブリ言語が機械に近いので低水準言語と呼ばれており、人の言語に近く解りやすい記述のものが高水準言語と言う区分けになっています。プログラムのハイレベルとローレベルについても 【 処理の階層で区分けしたもの 】 なので、低レベルレイヤーが機械に近い場所で、高レベルレイヤーはOSよりも上の層で動いているものになります。 コンピューターでは ■ 物理 ■ ネットワーク ■ アプリケーション で階層が全く異なるので、処理の内容によってコードの書き方も変わってきます。と言っても、組み込み関数や標準ライブラリで実装されているものだと、 ■ 標準入力 ■ 標準出力 ■ 標準エラー出力 と言う基本となる入出力から処理を構築していくよりも簡素な記述で処理ができるようになっていますが、 ■ 操作 ■ 表示 にはハードウェアの制御が必要になるので、通常はマイコンのようにライブラリを作ってソレを制御するような仕組みになっています。PCのようにOSが実装された環境では、こうしたハードウェアの制御などもOSとドライバーで対応しているので、制御自体はOSで認識をするのにドライバーが必要になります。 とは言っても、周辺機器がUSB接続になりプラグアンドプレイに対応し始めるとドライバーなしでも自動認識できる機器が増えたので、現在だと ■ USBマスストレージクラス ■ USBビデオクラス ■ USBオーディオクラス などのデバイスクラスが用意されていて、その危機を自動認識できるような仕様になっていますから、現在ではUSB接続の ■ ストレージデバイス ■ WEBカム ■ オーディオ を繋ぐと自動認識できるようになっています。これは、Linuxでも同じなので、OSが実装されている環境だとこの辺りは特に珍しいことではありません。ただし、ポインティングデバイスの場合だと、手書き入力デバイスのように 【 座標の取得とボタンの検知だけでは対応できないもの 】 もあるので、そういった製品だと別途ドライバーとユーティリティーを追加する必要があります。 デバイスについてはOSの実装されている製品だと認識したあとの制御はOSが行っているので、 ■ 表示 ■ 入力 はごく当たり前に行えるようになっています。これをOSではなく特定の操作で使用するアプリケーションで使用する際にプログラミング言語を用いることになりますが、ブロック型言語だとこの処理をタイピングの量を少なくした状態で行えるようになっています。
OSの有無
ブロックを使ったコーディング環境は色々ありますが、 ■ Scratch ■ MakeCode のように方向性の異なるものがあります。前者は、PC上のアプリケーションの製作で、後者は、デバイス上で動くものになっています。MakeCodeにはArcadeが用意されているので、ゲームエンジンを使って動くものを作れるようになっていますが、基本的にはデバイスの制御をメインとしたものになっています。 Scratch 3.0はシェーダーのバージョンが古すぎると1.x系しか動かないのですが、Raspberry PIや現在のx86アーキテクチャのCPU(Celeron/Pentium/Intel N100も含む)のIGPでも動作するので、その環境よりも高速なcorei 3やRyzen 3以上のIGPだと動作します。GPU依存度が高い処理をしない場合だと問題がないのですが、IGPを使う場合だとメモリー搭載量を多くしておく必要がありますが、プロセッサの性能などで速度差は出るもののほとんどの環境でScratchやMakeCodeは動作します。 このように現在では、 ■ GUIで動作するアプリ ■ マイコンの挙動 をコードを書いて実際に動かしながら理解を深めることが出来るようになっています。
処理と挙動を考える
プログラミング言語はコンピューターに処理をしてもらうための書面のようなものなのですが、これを書くことで書面を最初に作ります。高水準言語の場合、コンピューターには何が書かれているのか解りませんから、これをわかる形にして実行する必要があります。この際に、翻訳をする必要があるので、コンパイラーを使うことになります。この時の翻訳を行うのがコンパイラーになります。このコンパイルだけだと他のファイルを組み合わせて一つの実行ファイルにすることが出来ないので、通常は、リンカーなどを使ってリンクさせて実行ファイルを生成することになります。この処理が 【 ビルド 】 になりますが、こうしたコンパイルの処理が生じるプログラミング言語のことを 【 コンパイル型言語 】 といいます。 ブロックを使ったプログラミング言語では、この作業が発生しないのですが、実行時には翻訳が行われているので作成したプログラムが動作するようになっています。 プログラミングを行う際には、動作する状態を作る必要があるので、挙動を実装したコードを書く必要がありますが、この場合、
■ 処理の実装の仕方
■ 動きを考える方法
を学習する必要があります。前者が、プログラミング言語の仕様で、後者は数学になりますが、流石に小学校だと数学が難しいので、処理の流れを考える場合には、【 変数校と定数項を使った加算の形になった式 】 ではなく、物を動かしながら工程を考える方法を用いることになります。 この仕様は1980年代の8bitパソコンでも用意されていたわけですが、
【 処理の実装方法 】
■ BASICコマンドの学習
【 動きを考える方法 】
■ LOGOを使った処理の学習
で対応できるようになっていました。コマンドは処理の実装方法でしかないので、 【 どうすれば意図した挙動になるのか? 】 を考えるものではありませんから、 【 実装のための手段 】 でしかありません。つまりそういった部品として用意されているだけですから、 【 実装するものを考えるのは別の方法で学習する必要がある 】 わけです。 この時に 【 動き 】 という簡素なものを扱うとイメージしやすいので、挙動と数学を関連付けて学習し、数学からスタートすると難しくなるアルゴリズム部分を簡素にしたものがLOGOになります。 Scratchの場合、ペンを追加して使用するとLOGOと全く同じことが出来ますが、MakeCodeのmicro:bitではスプライトを使うと同じような処理を実装できます。実機のマイコンだと、最新のArduinoの上位機種がドットマトリックスLEDを実装しているので二次元配列の整数の座標を使って位置情報をコントロールすることが出来るようになっています。 その為、ブロックを使用したプログラミング言語でも
■ 処理の実装の方法の理解
■ 挙動を思考する方法の模索と実装
を行えるようになっています。
動きを考える
動きを実装する場合、グララフィックの挙動で考えるほうが解りやすいのですが、LOGOでは線で図形を描くように制御をしますが、これは、 【 座標の変化を実装したもの 】 になります。その為、LOGOでは、カメの座標の変化と線分による軌跡の描画が行えるようになっていますが、ゲームではこのカメの部分の挙動の制御を行っていることになります。 Scratchでは、スプライトを配置し得アプリケーションを作ることが出来るのですが、絵を描く機能は自作しないと存在しないので、ペンを追加することでこの作業が行えるようになります。 アプリケーション内でスプライトを動かす場合には、
■ イベントハンドラによる処理
■ 自動処理
が発生しますが、プレイヤーの操作はイベントハンドラによる処理になります。その為、キーやマウスの挙動に対して座標制御を実装るだけですが、ゲーム内のMOBについては、アルゴリズムを用意して動かす必要があります。これは、検知をして動くような仕組みになりますが、
■ 見えているオブジェクト
■ 判定用のオブジェクト
を用意して、処理自体は判定用の物を使用して、見た目の状態は見えているオブジェクトを動かすような構造になっています。当然、これは連動して動作しているので、そういった座標の制御が行われているわけですが、LOGOを使うと座標制御による動きの実装が出来るので、画像の生成だけでなく 【 どのようにすれば、ライン状を移動するような挙動になるのか? 】 を考えながら実装する方法を実践しながら覚えることが出来ます。
(t)動きの実装
LOGOなどで動きの実装をする場合、 ■ カメの向き ■ 移動距離 を指定することになりますが、これは 【 幾何ベクトル 】 そのものですから、最初に発生地点を指定してから、移動の情報を追加することで線を描くことが出来るようになっています。絵の場合だと、線の始点となる部分が変わっていくので、新しい座標を用意してそこから終点に向かって移動していくことになります。この時の座標の変化は0に対して距離の情報を足していった物と同じになるので、基本的に処理の構造は加算で実装することが出来ます。 グラフィックの場合、 ■ グローバル座標 ■ ロカール座標 というものがあり、グラフの座標のように原点(0,0)から見た時の座標のことをグラフィックではグローバル座標といいます。マイクラでクリエイティブモードでコマンドを使う際にワールド座標もこれと同じですが、これは 【 定数として存在している状態の距離 】 を示す時に使用します。 これを使うと座標の制御が出来ますが、 【 オブジェクトを右に1つ動かしたい 】 と言う状態だと、その都度元のグローバル座標を参照しなければなりません。流石に、これだと座標が変わる度に変数を変更する必要があるので使いにくいため、 【 オブジェクトを基準とした座標 】 で考えることになります。 この座標がローカル座標になりますが、この構造は小学校一年生の算数の 【 足し算 】 のカリキュラムで登場しています。 小学校一年生の算数では、 ■ 数字 ■ 足し算 が登場しますが、これらを 【 かずのせん 】 に配置して考えると 【 数字 】 ■ 0からの距離 【 足し算 】 ■ 元の数値に別の数値を追加したもの になります。数値自体は 【 0からの距離 】 ですからこれはグローバル座標で指定した値ということになります。定数で表記できる物はアラビア数字での表記ができますが、この時の値は原点0からの距離になるので、具象表現を行って図示できる状態にした場合には常に原点0から始まる状態になります。 物理のベクトルは位置情報を持った状態でその場所で生じた力の状態を表記するので原点とは異なる場所にベクトルが存在しますが、数学で登場する幾何ベクトルは常に原点0からスタートしています。これは、ベクトルを合成して状態を作るためですが、この時の合成した結果は演算処理の結果なので 【 定数の解 】 が発生します。その為、グローバル座標で表記する構造になっているので、幾何ベクトルに置き換えてみたときには、グローバル座標を指定した距離を示した一つのベクトルになっているので、原点(0,0)からスタートする仕様になっています。 計算とは、 【 状態変化 】 なので、抽象表現の値の状態で存在しているものではなく、ベクトルで示した場合には物理と同じように座標を持っっています。足し算については、一次元のデータの追加になりますから、直線上の位置データを追加することになります。足し算の式を見ると 1+2 のような形になっていますが、それぞれの座標を見ると ■ 最初の数値 : 0からの距離 ■ 次の数値 : 最初の数値からの距離 になっています。その為、この2つは ■ 最初の数値 : グローバル座標 ■ 次の数値 : ローカル座標 によって制御されていることになります。小学校一年生の算数では、 1+2+3+4 のように複数の数を追加する方法も扱いますが、この場合、 【 順番に追加する 】 ことで答えを出すことになります。ただし、計算にはコツがあって、 ■ 5の塊で考える ■ 10の塊で考える と言う方法があるので、先程の計算だと、 【 1+2+3+4 】 =(1+4)+(2+3) =10 のように処理をする方法があります。繰り上がりの場合は10を基準にしたほうがいいので、【 足して10以上になる組み合わせを作って分けて考える 】 と言う方法があります。例えば、 1+2+3+4+5+6+7+8+9 の場合、 ■ 1+9 ■ 2+8 ■ 3+7 ■ 4+6 ■ 5 となるので、 ■ 10+10+10+10+5 になるので、45を導き出すことが出来ます。これを見ると ■ 1+9 ■ 2+8 ■ 3+7 ■ 4+6 ■ 2.5+2.5 でも同じになりますが、これを1〜10にすると ■ 1+10 ■ 2+9 ■ 3+8 ■ 4+7 ■ 5+6 のように分割できます。これを見ると10この数を真ん中で分けて両端を足しているので、 ■ 最初の数値と最後の数値を足す ■ 数値の数を2で割った数をかけ合わせる ことでも同じ状態になります。実際に行ってみると、 ■ 1+10=11 ■ 10÷2=5 ■ 11×5=55 になります。この処理を少し変形して ■ 1+10=11 ■ 11÷2=5.5 ■ 11×10=55 とすることも出来ます。この状態にすると数の総数が奇数になる場合にも対応できるので、 ■ 1+9=19 ■ 10÷2=5 ■ 11×9=45 のように1以上の数値が最大値まで順番に並んだ 【 数列の総和 】 を出すことが出来るようになっています。(この場合は交差は1になります。) このような数値の並びも処理自体は 【 順番に行うもの 】 になりますが、定数の解を導き出すときには、式を変形して計算しやすい状態にして扱うことがあります。これは、あくまでもベクトルの合成と同じようなものなので、処理そのものとは異なります。その為、 ■ 数式 : 法則性 ■ 解 : 結果(定数) なので ■ 数式 : ローカル座標 ■ 解 : グローバル座標 を使用した構造になっています。 絵を描く場合だと、線分の ■ 長さ ■ 傾き を使用するものになっていますから、これをローカル座標同士で繋いでいくことで外形線を作ることが出来るようになっています。 動きの場合、この線分をトレースしたものになりますから、このラインの制御の方法を考えることで確定した挙動をオブジェクトに対して実装することが出来ます。 基本となるのは、この幾何ベクトルを使った方法になりますが、これは、座標の集合で線を作る作業ですから、 【 関数でも同じことが出来る 】 ので、確定した挙動を実装するだけだとこの方法をもいいることになります。その為、 【 動きの制御をするために数学が必要になる 】 わけですが、その前の段階の動きの実装方法をLOGOで学習できます。 現在だと、これがScratchのペンツールやPythonのturtleで行えるようになっていますが、これが自動で動く物をアプリケーションの中に実装する際に必要となる時に必要になる思考を行う上で必要になる能力を養うためのツールになります。 Scratchの場合だと、この時の 【 座標の制御の方法をスプライトに適応する 】 と同じ動きを実装できるので、アプリケーション内で自動で動くオブジェクトの制御をすることが出来ます。 これは、【 移動のみ 】 の状態になりますから、アプリケーション内で実装する 【 判定部分 】 をプログラミングをしながら覚えていくことになります。
(t)コードを書く場合
コードを書く場合、LOGOの描画だと最初に ■ 順番に行う と言う方法を用いることになりますが、この仕様は前述のように 【 足し算 】 になります。その為、1の集合を追加するような処理になりますが、集合を1つの構造物としてそれを複数個用意するような処理の場合、通常の足し算で行うと数式が複雑になるので、 【 掛け算 】 を使います。これと同様にプログラミング言語で同じ処理を連続して行う場合には 【 ループ処理 】 を実装することになります。これが ■ 繰り返して同じ処理をする というものになります。これが数詞kぢ絵も表示できる藻になりますが、プログラミング言語でハッ判定を用意することになります。これは、 【 複数の中から一つを選ぶ 】 処理なので、最小単位は二者択一です。 これと同じ構造物がスイッチやリレーになります。これを使用すると2つの条件から一つを選ぶような処理を制御できますが、電気工作だと 【 手動操作 】 ■ タクトスイッチ ■ トグルスイッチ 【 回路内の処理 】 ■ トランジスタ(FET) を使用することになります。こうした分岐をプログラミング言語でも実装できるので、特定の条件で動くような処理を実装することができます。これは条件で判定を行って分岐しているので 【 条件分岐 】 とも言いますが、一般的には 【 分岐 】 として扱われています。電気工作だと並列回路の中にリレーが含まれている構造になりますから、基本構造は中学校の物理で登場する 【 並列回路 】 がベースになっています。 順番に処理をする場合ものを 【 順次 】 といいますが、これは直列回路の構造ですから、直列回路を用意して電流の流れに沿って順番に装置を並べたものと同じ構造になっています。その為、プログラミング言語では、直列カリオの構造の 【 順次 】 を使用して工程表のようなものを作って処理の流れを考えることになりますが、この時に掛け算のような構造の部分が出てくるので、これを、ループ処理を使用して簡素な構造にして実装することになります。これは 【 反復 】 といいますが、電気工作だとタイマー回路に相当するものになります。 マインクラフトのレッドストーン回路も二値論理で動作しているので、電気工作の論理ゲートを使った処理が出来るのですが、判定の部分を論理ゲートで行う(ブール代数を機械に適応する時に使用するもの。ド・モルガンの法則から、機械の判定でもブール代数と同じことが出来るので、0と1しかない世界でも分岐や計算ができるようになっています。)ことができるようになっていますが、ループ処理はクロック回路で実装することになります。これは、電気工作のタイマー回路と同じ挙動のものになります。 これを座標制御に使用すると、 ■ 範囲指定 ■ 移動のための条件の指定 などで実装できるので、プレイヤーの挙動と連動させたり、フラグで動くものを作ることも出来る王になります。つまり、こうした動きは確定した値で動いているのではなく、 【 センサーで検知して動くもの 】 と考えることが出来るので、 【 センサーで検知した変数の取得をしてソレを元に動かす 】 ような仕組みになっています。
動きについて
Scratchでスプライトを動かす場合には、
■ 手動操作 ■ 自動処理 がありますが、手動だと
のような感じになりますが、手動と自動で動くものに判定を入れると
のような挙動になります。ちなみに、ランダムは 【 乱数で用意した物を選ぶだけ 】 なので、選択する対象を用意する必要があります。ゲームエンジンで乱数を使って挙動を選択して動いてもらうと のようになるので、乱数だけでループさせるだけで意図した結果になるわけではありません。
基本となるのは単一のオブジェクトになりますが、こうした処理を組み合わせると、
のようになります。