現在はプログラミング教育もスタートしていますが、企業もプログラミング関連の教材の影響を行っているので、現在は色々な物を扱えるようになっています。
例えば、
のサイトでは、 【 ぷよぷよを作るコード 】 が公開されていますが、冊子と合わせてゲームがどのように動くのかをコードを追いながら学習することができます。
ちなみに、ゲームは結構短いコードでも書けるので、簡素なものだと嘘のように短いコードで作ることができます。
コードを書く際に文字数が増える条件としては、データの容量の増加がありますが、此のデータをテキストで再現するとコードを短くするKと尾ができます。
このように不要なものを削ぎ落として短いコードで複雑なものを再現するような分野に 【 コードゴルフ 】 というものがあります。
構造を異理解するとデータを削ぎ落としてコードを書くことが出来るようになっていますが、使用する@プログラミング言語が異なるものの、処理を実装するための最適化の方法などはある程度共通しているので、それを使用しているものでどのように実装すれば良いのかを考え得ていくことになります。
現在では色々な場所で見ることが出来るようになったプロジェクションマッピングですが、この技術についても現在は、エプソンがプロジェクターで使えるアプリケーションの新商品として、プログラミング的思考を育む知育アプリ『プログラマッピング』を開発しており、無情配布が行われています。
プログラミング自体は過去も現在も目的は同じですが、高水準言語ができて間もない時代の1970代と現在では、コンピューターで出来ることが違っているので、様々なことが行えるようになっていますが、現在の学校教育では、
■ PCのアプリケーション
■ ハードウェアの制御
を扱うことで、人が見て分かる 【 UI/UXの部分 】 の内容と、内部処理の 【 シーケンス部分 】 があり、それが異なるものであることを学習できるようになっています。
1980年代だと現在と同じ学習をしようと思うとトンDメオ内コストになっていたわけですが、現在は、ハードウェアの性能も高くなっているのと、レガシーな構造のデバイスが安価になっているので、特定の分野だと物理モデルを使った体験を通して知識を身につけることができるようになっています。
8bitパソコンの時代に現在のような
■ ハードウェアの制御
を行おうと思うと、マザーボードのようなサイズの拡張ボードを刺して、デバイスを繋いで動かすことになるので、物々しい構造のものを用意しなければなりませんし、そもそもブレッドボードすら存在しないので、ハンダごてを使って回路を組む必要があるので少し複雑な作業が生じてしまいます。
此のレベルの作業になると、中学校の技術辺りで扱うものになりますし、その時代にセンサー類は高くて学校教育で導入できるようなものではありませんから、現在だと極当たり前に行えている 【 教材 】 を用意してカリキュラムを組むことが難しい状態になっていました。
また、現在のようにMITで開発されたScratch
も存在しませんから、その時代だと入門用のプログラミング言語だと、BASICしか存在していませんでした、このBASICには方言があるので、
■ N88BASIC
■ HuBASIC
■ F-BASIC
■ Quick BASIC
■ MSX BASIC
のような8bitパソコン用のものでも違いますし、
■ Machintosh BASIC
■ AMIGA BASIC
のような16bit以上で動作するものとも異なります。その為同じBASICと言う言語ですが、移植しなければ動かないような仕様になっていました。また、メーカーが独自機能を実装しているので、その機能は対応した製品でしか使用できませんから、
【 音声合成で言葉の発音が出来る 】
■ PC6001 mkII/6601 mkII
【 スーパーインポーズ機能 】
■ X1シリーズ
【 PCG(文字をグラフィックに入れ替えて使う) 】
■ X1シリーズ
のような面白い機能も機種によっては存在していたわけですが、これらは専用のハードウェアレベルの処理をBASICで制御しているだけなので、ハードウェアレベルので処理ができない他の機種では実行できない賞になっていました。
とは言っても、1990年になる前に、MachintoshやAmigaは現在のコンピューターのようにOSを実装していてGUIで動いており、1990年代前半にはDCGツールも登場していますから、8bitパソコンとは全く違う構成のものも存在していました。
ただし、 【 ネットがないので情報格差がひどい時代 】 なので、こういった情報もその当時に入手できる地域というのはコンピューターを扱っているショップがある都市部に限定されており、それ以外の地域だと雑誌などの情報で対応するしかなく、周辺にコンピューターの知識がある人が居ない場合には、何も解らない状態になるので、世の中に当たり前に存在している商品情報程度のことも情報統制でもされているかのように全く入ってこない状態になっていました。
此の辺りも現在と過去で全く異なる部分になりますが、1980年代や1990年代だとOSの実装されたハードウェアが
■ 義務教育 : 基礎自治体の管轄
■ 公立高校 : 広域自治体の管轄
だと設備投資が追いつかないはず何度絵、結構古めなものしか導入できないはずなので、その時代でも少し古めな言語(と言っても、その時代だと ”普及している言語” という扱いになります。)を使用しているはずですが、此の時代のプログラミング言語は 【 コーディングが大前提 】 になっているので、タイピングを行う必要があり、コマンドと書式を墓得る必要があるので、Scratchと比較すると少し敷居が高いものになっています。
また、ハードウェアの制御はパソコン単体ではできないので拡張の必要もありBASICでも違う使い方を刷ることになるので、ソフトウェアを作るようなコードとは異なる記述を用いることになります。
現在は、こうした作業もライブラリの追加などで出来る仕様になっているので、理解がしやすくなっていますが、ほぼ情報がない成就帯で学ぶことになるので、
【 学んだは良いけれど、なぜ、そうなるのか? 】
問部分は解らずじまいになってしまう状態になります。
現在は、そうした状態ではないので、全く環境が異なるわけですが、 【 処理を作る 】 と言う部分から悪臭出来るサービスだと
もありますが、コレもブロックを使ったコードの学習が出来るようになっています。アップルの製品だと
がありますが、現在は、
のようにデバイスの挙動をブロクで実装して、その処理をシミュレーターで試せるようなサービスもあります。
つまり、
■ コーディング
■ シミュレーターでのテスト
■ HEXファイルの出力(ビルド+ファイル生成)
までができるので、その後、実機がある場合には実機のテストが行えるようになっています。
これがハードウェアレベルでの挙動の実装とテストになりますが、
は、PC上で動かせるアプリケーションを作れるようになっています。
3.0から素材制作が出来るので
■ ラスターグラフィク
■ ベクターグラフィック
を使ってScratch内で絵を作ってアニメーションお腹割のように連番を用意してそれをコードで制御することでアニメーションを付けることが出来るようになっていますが、最初からスプライトと背景の制御が出来るので、
■ アプリケーション内のオブジェクト
■ 背景素材
を組み合わせた制御が出来る仕組みになっています。
また、元から素材が用意されており、
■ 音楽
■ SE
があるので、アプリケーションのBGMやSEを実装した処理を実装できるようになっています。また、
のように素材を加工する機能も実装されているの簡易的な編集も出来る用になっています。Scratch 3.0ではmicro:bitと連携できるので、microbitをコントローラーのようにして操作を刷ることも出来るようになっています。
このように現在はブロックを使ってプログラミングが行えるものも色々なことが出来るようになっていますが、複雑なことを刷ると処理が重たくなりますが、ゲームを作ることも出来るようになっています。Scratchは、アプリケーションを作る際に必要になる
■ 素材制作
■ コーディング
が行えますが、シングルスレッドの処理になっているので、非同期処理やスレッドを使った処理などができません。
その為、処理の役割分担ができない仕様になていますが、処理の順番などを考えながら仕組みを作る方法を学習できるようになっています。
また、MAKECODEにはアーケードがありますが、コレは完全にゲームエンジンなので、複雑なものを作ると実機で動作しなくなりますが、オンラインだと作業中であれば、そのままゲームを動かすことができます。コードはGITHUBとの連携で保存できるようですが、MAKECODEだけだと保存できない仕様になっています。(HEXファイルの書き出しはできます。)
この辺りがScratchとは異なる点になりますが、ゲームエンジンで行う素材制作などの機能は揃っているのでどういったものなのかの体験を刷ることが出来るようになっています。
ゲーム制作を行うライブラリは色々なプログラミング言語で用意されていますが、Pythonで低負荷で動いてくれるものだと2D専用のレトロゲームのような仕様の物を作れる
などがあります。
プログラミング
プログラミング言語を使って動く小野を作る場合には、一般科目の学習と同様、基礎を学んで拡張していくほうが理解しやすいので、通常はそういった学習を子なうことになります。
動きの仕組みは論理回路のような二値で動くものを想定したほうがイメージしやすいのですが、基本となるのは、
■ 入力
■ 出力
の2つを用意してどう圧するものを作ることになります。最も簡素なものが小学校の理科のように電池と豆電球を繋いだものになりますが、小学校の理科では、電気の流れで動くものとして、 【 モーター 】 を使いますが、これが出力の変更になります。豆電球とモーターでは
■ 豆電球 : 光
■ モーター : 運動エネルギー
と言う違いがありますが、この2つは
■ 豆電球 : 表示機材
■ モーター : アクチュエーター
を簡素化したものになります。その為、考え方を変えると
■ 豆電球 : ディスプレイ
■ モーター : ロボット
のようなものになります。
これが、同じ入力でも出力が変わると挙動が変わるという事例になりますが、この2つでは、 【 目的 】 が異なるので、実装しているものも異なります。
この場合、
【 発光体の制御 】
■ 豆電球
【 回転運動の制御 】
■ モーター
になりますが、プログラミングを行う際にも、目的を明確にしておくことで用意スべき処理をイメージしやすくなります。
小学校の理科では、電気の発生源として電池を使用しますが、コレとは別に太陽電池も使用します。その為、
■ 一次電池
■ 太陽電池
のように
■ 電気が貯めてあるもの
■ 光で反応するもの
を使うことになります。電池は、 【 接続 】 によって制御できますが、太陽電池は 【 照度の変化 】 で発電しますかRあ、光の状態変化を変数として、特定の条件で電気が流れる仕組みになっています。
これは、
■ 接続の有無
■ 光の状態変化
と言う全く異なる入力で判定をコナ得ることを学習します。
小学校ではモーターを使用しますが、このパーツは
【 運動エネルギー ↔ 電気 】 の相互変換
ができるので、発電も行えるので、実質的には、
■ 一次電池
■ 太陽電池
■ モーター
と言う入力ん選択肢があることを体験を通して学習できるようになっています。
音も電磁石で発生っせているので、電磁力の仕組みを使うと発電ができますが、コレと別の方法雨だとコンデンサのように電位を貯める仕組みを作ると音を電気に変換できるので発電することができます。声を入力として使用しているのがマイクになります。
基本的に、電池を固定した状態だと判定は存在しないので、判定なしということになりますが、太陽電池とモーターについては 【 入力の有無 】 で動作する仕組みになります。その為、このパーツを使用すると、
【 判定で動作する仕組み 】
を作ることができます。電池の場合、動くと言う状態の維持ですから、メモリーのような小僧になっているわけですが、陛下リオにすると通電の維持をしてパーツが動く仕組みになります。
ここで判定を入れる場合には通電が切れる状態にしておいて、その切れた部分を接点で制御することになります。この状態にすると、通電オウムを制御できるので、スイッチ部分で判定を行えるようになります。電気工作のスイッチだと
■ タクトスイッチ
■ トグルスイッチ
がありますが、タクトスイッチのような挙動のものをレバーで制御できるのが上位スティックになります。現在のゲーム機のコントローラーにはアナログ入力のレバー実装されていますが、あのパーツがアナログNY有力で信号を得ることが出来るジョイスティックになります。
このパーツを使うとマイコン上でアナログの数値を取得できるようになっているので、その数値に対してアプリケーションが動くようにすれば、ジョイスティックでの操作が出来るようになっていますが、これもタクトスイッチのように入力時に通電して入力しない状態だと遮断できる仕組みになっています。
入力についても、 【 目的 】 によってパーツを選ぶことになりますから、何かを作る場合には、入出力の目的を明確にする必要があります。その為、物等来る際には
■ 〇〇のような動きになるもの(出力)
から考えることになりますが、その時に動作はどんな入力をした場合に生じるのかを考えることになります。
入力まで考えた場合、
■ 〇〇をすると、
■ 〇〇のような動きになる物
のように考えることになります。その後、その挙動が
■ 自動処理
■ 操作が必要なもの
のどちらなのかを決める必要がありますから、
【 自動処理 】
■ 通電をする(電気が流れる)と、
■ 〇〇のような動きになる物
【 操作が必要処理 】
■ センサーや接点で入力が生じると、
■ 〇〇のような動きになる物
に分けることができます。操作にセンサーを入れているのは、現在は傾きセンサーを使用できるので、接点以外の処理も存在するのでセンサー入力も操作に分類しています。
自動処理は通電後に常に動作しますが、センサーや接点縫う力の場合、 【 判定結果で通電の有無が変化する 】 ので、この場所には分岐の処理が存在していることになります。
このように入出力だけでも
■ 電源
■ 判定
■ 処理
が存在しているわけですが、小学校で登場するパーツは、入力部分に分岐の処理が用意されたパーツも使うことになります。
構造的には、閉回路なので、中学校二年生の電気のカリキュラムで登場する直列回路として使用することになりますが、この構造は順番に処理が実行されるのでプログラミング言語で処理を実装する時に使用する 【 順次 】 の構造になります。
このように小学校の理科では、条件で動作が変わるパーツが登場するので、実質的に 【 分岐 】 も扱っているので、
■ 順次
■ 分岐
の仕組みを実装できるパーツを扱います。処理を実装売る場合には、コレに繰り返しを行う 【 反復 】 を使用しますが、コレを算数に置きかえると、
■ 足し算 : 順次
■ 掛け算 : 反復
になりますが、電気工作のパーツだとタイマー回路が反復に該当するものになります。分岐については、並列回路にスイッチを入れたような構造になっていますから、少学区の理科だと直流と交流の出地の並びと豆電球の点灯の有無の関係性が分岐の判定の一つになります。この組み合わせが
■ 論理積(and)
■ 論理和(or)
になるので、閉回路で通電した状態でスイッチで電池の場所の通電の有無を制御すると論理ゲートを作ることができます。
処理については論理ゲートも含めて数学で示すことが出来るようになっていますが、分岐で使用するIFについては、数学で登場する 【 決定木 】 になりますから、高校でも登場しない処理になります。
その為、IFの仕組みについては、ブール代数と言うイメージがあるかもしれませんが、構造的には決定木と同じものになります。ただし、決定木と同じ構造で処理を作るとゲームエンジンで使用できる 【 ビヘイビアツリー 】 のような構造になりますから、複数の判定から選択できるような処理を実装する場合にはプログラミング言語で使用する
【 if 〜 elif 〜 else 〜 】
のようなものとは異なる構造になります。
プログラミング言語を学習する際には 【 順次 】の構造から始めることになりますが、これが、
【 直列回路にパーツを並べた構造 】
になります。コレを基準として、どのような動作になるのかを考えていくことになります。
最初の構造
プログラミング言語を使用した場合には、組み込み関数を使用しますが、この問に自動処理になるような構造から作ることになります。これは、順次の仕組みがそうなっているのためです。また、この構造にするとスイッチに該当する処理が入らないので、 【 直列回路の閉回路 】 と同じ構造として考える事が出来るので、流れを考えやすいので最初にkの構造から考えていくことになります。順次は順番ですから、処理を一つの値としてそれを並べていくような構図になります。構造的には、
【 処理1 + 処理2 + 処理3 + ... 】
のような流れになります。仕組みを考える場合、
【 〇〇をすれば、〇〇になる 】
で考えることになりますが、この時の 【 出力 】 に至るまでの仕組みがこの構造になります。
プログラミング言語でのコードの実行は通電の状態の維持と同じなので、その処理が行われた時に実行される処理の流れを考えることになります。
基本的に、処理は数式と同じですから処理の中で使用する値を用意することになります。この辺りは現実世界で何かを摺るのと同じで、
■ 材料
■ 処理方法
を用意しなければならないわけですが、この時の材料が変数やライブラリになり、処理方法が関数などになります。
処理の構造を用意する場合には、
■ ライブラリの読み込み
■ 変数の宣言
■ 処理の実装
と言う流れになります。これが関数やクラスを使わない状態での構造になりますが、 この時の処理の部分に工程を実装することになります。
最初に自動処理になるように、操作の入らないものを使用しますが、結果を見るために表示は必要になるので、Pythonの場合だと 【 print関数 】 を使用します。kの関数は引数で表示を行うことになりますから、 【 print(引数) 】 のような処理になりますが、変数を引数として使用できるので、
■ ライブラリの読み込み
■ 変数の宣言
■ print(引数)
のようになります。この時に、
■ 数 字 : 半角数字で入力
■ 文字列 : 【 " 】 や 【 " 】 で文字を囲む
ことになりますが、変数を使用する際には、
■ 変数名 = 39
■ 変数名 = 'Hello,Python!'
のようになります。Pythonは組み込み関数の場合にはライブラリの読み込みが費用なので、
a = 39
b = 'Hello,Python!'
print(a)
print(b)
のようにすると、
39
Hello,Python!
のような表示が行えます。このコードでは、
┃ a = 39
┃ b = 'Hello,Python!'
┃ print(a)
┃ print(b)
▼
のような流れで処理が行われていますが、これが順次になります。この作りは、
【 変数の初期化 】
a = 39
b = 'Hello,Python!'
【 変数の初期化 】
print(a)
print(b)
になりますが、この時に変数同士の演算もできるので、
■ a+b
■ a-b
■ a*b
■ a/b
などの処理を追加して計算を行うことができます。こうした変数と数値の処理ですが、中学校の数学の項のカリキュラムで登場する定数項と変数項と同じ仕様になりますが、コレを用いることで、計算を行うことが出来るようになっています。
この状態だと、算数では、a+a+a+aをa*5のように繰り返しの数で考えることが出来ますが、プログラミング言語では同じような処理をループ処理で実装できます。この処理はタイマー回路の処理と同じになりますが、
■ for : 等差数列
■ while : 条件分岐
で実装できるようになています。その為、
【 forの場合 】
for 変数名 in range(初項, 末項, 交差):
処理
【 whikeの場合 】
while 判定:
処理
のようになります。この判定を入れると、条件に合った処理を実装できますが、
■ for : 回数指定型ループ
■ while : 条件での判定
の違いがあります。例えば、
【 while 変数名 > 5: 】
のような判定を入れると5になると止まるので4まで繰り返すことになります。
操作の追加
コンソールアプリでも文字入力で変数を作ることが可能で、Pythonでは、 【 input関数 】 を使用することになります。これは、変数に代入して使用するので、
【 変数名 = input(引数) 】
のような表記になります。この時の引数はprint関数のように表示で使用されるので、通常は、
【 変数名 = input('文字列') 】
のように使用します。その為、
a=input(文字を入力してください_)
print(a)
のように組み合わせて使用することになります。計算でし揺するときには方の変更が必要なので、
a=input(文字を入力してください_)
a1=int(a)
print(a+a)
print(a*5)
print(a1+a1)
print(a*5)
の用に使うことができます。ちなみに、input関数だと入力との値はstr型なので、a+aは文字列の結合になるので1を入力した場合には11が表示されます。a+aは整数型なので2が表示されます。同夜に文字列型で*5をすると5作り返すのでa*5を実行すると11111になり、数値型で*5を行うと5倍になるので5になります。
分岐
分岐は、決定僕なので、2tに枝分かれしていますからこれはトランジスタと同じ構造と考えることができます。トランジスタも決定木んに近い構造になっていますが、基本的には、 【 判定で回路を切り替える仕組み 】 と考えることが出います。このスイッチに相当するのが、ifで、
if 条件:
処理
のような構造にすることで条件と一致した際に判定が実行されそうでない場合には無視して準じが実行される仕組みになります。その為、
【 ifの処理 】
〜
〜
■
┃ y
◆━━━■
n ┃ ┃
■ ┃
┃ ┃
┃◀━━┛
┃
■
┃
〜
〜
のように分岐の判定で処理が変わります。Elseが入る場合だと、【 ifの条件以外の廃帝をelseで指定する 】ことになります。判定が増える場合には、このifとelseの間にelifを挟んで、フィルターを掛けていくことになります。ifについては、
■ if 〜
■ if 〜 Else 〜
■ if 〜 elif 〜 else
の三種類があります。判定の数が多くなる場合だと、服すに分けるか、もしくは、elifの数を増やすことになります。
判定の場合、変数を扱うことになるので、
a=input(文字を入力してください_)
b=int(a)
if b==1:
print('aは'+a+'です。')
else
print('aは1ではありません。')
のような処理を実装することができます。また、
a=input(文字を入力してください_)
b=int(a)
c=1
if b>c:
print('aは1を超えています。')
elif b<c
print('aは1ではありません。')
else
print('aは1です。')
のようなこともできます。ちなみに
のようにすると、ループ内に処理を包含しているので、
のように実装した処理を5回繰り返すことができます。
ループは掛け算なので、処理単体を繰り返すこともできますが、大きなループでを用意してその中に工程そのものを包含することもできます。
ループの考え方は、
■ ループに工程を包含する
■ 処理をループに包含する
の2つがありますが、前者が閉回路そのものをクロック周波数を用意して処理を行う回路の仕組みで、後者が、部分的にクロック周波数を用意して処理を繰り返すような構造になります。
処理を考える場合
処理を考える場合には、直列回路を基本にして考えるので、最初に行うこととしては、 【 目的の動作になる工程を考える 】 ことになります。いきなり複数の処理を同時進行したり、タスクの管理をするするのは難しいので、最初は、直列回路の中の電流のな彼の順番のように処理を用意して実行する順番を決める作業から行うことになります。
最初は、コード内に記述した値を使用して流れを作ることになりますが、それが出来るようになったら、入力を行うようにします。
これで、入力した値をそのまま使用できるようになりますが、数値にする場合は、型の変換が必要になるので、int型に変更することになります。この型の変換が使えるようになると
■ 文字列
■ 数字
が使用できるようになるのえ、入力した値を使って計算できるようになったり、今回作ったコードのように数値を入力して数値と比較することも出来るようになります。
数値の入力を刷ると分岐を入れない場合だと計算しかできませんが、ループを使った場合には、ループ回数などのように数値で指定できる部分の値をinput関数で制御できるようになります。今回のようにifを使うと、数値同士の判定が出来ますが、この判定は、【 定数同士の判定 】なので、この値を
■ 問題の解
■ 回答の解
と言う定数化した値で比較をして合否の処理を行うこともできます。
まず、順番を作ることから始めることになるので、文字列を文レベルで分けて表示するようなものを作ってみて、その後に計算を行う物を扱うことになります。print関数で目に見える形で結果を見る方法になりますが、計算結果や文面として表示を刷るのに必要なものになります。
その後、表示を刷る内容を連続して行う場合に、ループを実装することになりますが、これに分岐をく見合わせると判定を実装することができます。
処理をコードに置き換えると、コンソールアプリの場合
■ 入力 : データ
■ 判定 : 処理
■ 出力 : 表示
になるので、プログラミング言語を使って作れるものは表示を基準に考えることになります。その時の表示の内容が処理によって変化するので、
■ データを使って
■ 処理の結果を表示する
ことになるので、この時の結果に至るようにデータに変化を与えるためにはどのような判定や処理が必要なのかを考えていくことになります。
表示だけのコードを書く場合、コンソールアプリだと
【 レイアウトやアスキーアート 】
を使うことになりますが、文字数を位置の制御をする目盛りと考えて、文字数で位置を制御する方法を学習することになります。この時にグラフィック的なレイアウトでない場合だと、
■ タブ
■ スペース
■ 改行
などを用いて記述を刷ることになります。この時に 【 等幅フォント 】 を使用するとレイアウトが崩れなくなります。
コンソールアプリに限定すると、特殊な記述をしない限りはイベントハンドラが使用できないので、input関数のように
■ 文字列の入力
■ バッファに記録
■ Enterキーで確定
■ 指定したメモリーアドレスにデータの記録
のような流れにものしか使えません。その為、組み込み関数だけでアプリケーションを作る場合には、この入力で対処できる仕組みを考えることになります。
そうなると、 【 メニューで選択できるような仕組み 】 になりますから、
■ メニュー部分
■ 操作部
をどのように作るのかを考えることになります。また、イベントハンドラではないということは、リアルタイム処理ではなく、入力からのラグが合っても大丈夫な構造のものに限定されますから、どういったものであれば対応できるのかを考えることになります。これは制約による条件の絞り込みになりますが、こうした条件お絞り込みはハードウェアの処理能力の上限を基準とした処理の方法を考える場合にも発生します。
その為、 【 作りたいもの 】 がある場合、先に構造を考えることになりますが、イベントハンドラや入力と判定までのラグのないものを作る場合、それが可能な環境を最初に用意することになります。