現在はプログラミング教育が始まっていますが、高校でも情報Iが4月から高校1年生のカリキュラムで必修科目となりました。

 

 前年までのカリキュラムと異なり、選択教科の再編まで行われているので、普通科だとどれを専攻するのかも内容を見て判断しなければならないので、教育制度改革区でのカリキュラムの変更前の判断基準が使えなく泣ている訳ですが、日本史のカリキュラムが大々的に削減されているので、日本史については自習で学習しないと解らない状態になっているので注意が必要です。

 

 プログラミングについてですが、オートメーションを行う時の工程の実装をする際にも使用しますから、目的とする物があり、その結果に行きつくためにはどう言った工程を踏んでどう言った処理を実装すればいいのか?を考えることになりますが、この時の工程や処理を複雑な論理演算や判定やループ処理などを含めて行う為の物はプログラミングになります。

 

 また、構造物の動作も 【 処理の流れ 】 で成立していますから 【 カラクリ 】 や 【 オートマター 】 なども工程によって動く物ですし、オルゴールも音階を1bitのデータで制御している物になります。また、手回しオルガンや自動演奏が出来るパイプオルガンなどもそう言った仕様になっていますが、手回しオルガンの譜面はピアノロールに似ています。ピアノロールについては、

 

 

 

のような構造になっていて、縦軸が音階で、横軸が音価になっています。ここに整数処理の定数のY軸の値を用意して、X軸分の長さを与えると、その時の

 

    音階(音の高さ)

    音価(音の長さ)

 

を適応する事ができます。波形変種ソフトの場合だと、この2つが

 

    Y軸 : 音 圧(音が大きさの変化)

    X軸 : 周波数(音の高さ)

 

になっていますから、構造が異なる訳ですが、床関数のグラフのように定数部分が整数として 【 区間 】 を持って生成されているのがMIDIになります。考え方を変えると、ローカル変数ベースで傾きを持たない正の方向に進んでいる幾何ベクトルをY切片で制御しているようなイメージの構造物がMIDIのピアノロールになりますが、

 

 

 

のような感じで音価と音階を指定する事で譜面を作る事ができます。この時に配置しているものが 【 ノート 】 と言いますが、このノートの配置によって五線譜の中の音符に該当する物を配置する事が出来るようになっています。

 

 ちなみに、下にあるのがベロシティで、フィジカルコントローラーを使って入力した時にフォルテやピアノなどの表現を反映させることができます。また、フィジカルコントローラーにするとレガート奏法を行うとそのまま反映されるので、なめらかに繋がるような状態にできますし、スタッカートなども反映されます。

 

 また、オニオンスキンを使うと、

 

 

のように別のパートの表示が出来るので、コードと主旋律を並べて打ち込んだり、複製して配置したボーカルパートの作成を行う事もできます。

 

 画像の下部にあるのがCCでニュアンスや音の定位などを行う時位使用できる項目になります。音の定位ですが、MIDIだとラウドネスなどは追加できませんから、位置の固定を行っておいて、後でDAWで調整するかDAWだとCCで調整するかミキサーで調整してVST PLUGINや実装されているエフェクトトで音を調整する事になりますが、CCを使うと、MIDIの音色を変更できます。このCCにはパンポットとボリュームがあるので、左右の位置と奥行きを指定できるようになっていますが、ドラムパートではなく、個別のパーカッションとしてパートを用意して打ち込みをすると、パート単位で定位が出来るので、シンバルンやタムなどの位置を個別に指定できるようになります。DOMINOの場合、

 

 

 

のように10番でドラムが打ち込めるのですが、

 

 

 

のように一つのパートになっているので、ドラムセットの位置として扱うような仕様になっています。これを、楽器別に定位させる場合にはパートで分けて処理をする事になります。

 

 ちなみに、ピッチベンドを使うと音階をCで変更できるので、時間軸の間に直線や曲線補間を行って音の変化を追加する事ができます。DOMINOでは、そのままだとGS音源しか使えませんが、GS音源に対してCCを適応すると、

 

■ ピッチベンドによる音の変化       

 

のように音階を変更したり、CCで音を揺らして音自体を変更することもできます。

 

 個別の楽器で処理をする場合だと、音価と音階で制御する事になりますが、DAWの場合だと、VSTiや実装機能のサンプラーを使ってPCMファイルの楽器の音を読み込んで譜面を作る事ができますが、この方法を使うと、シンバルンやタムの音の高さも変更する事ができますし、DAWだとウェット成分の指定ができますから楽器の音を変更する子tもできます。

 

 また、音も録音以外だとシンセサイザーで音自体を作れますから、DAWのシンセ音源で音を自由に製作できます。この時に波形の調整した物を3つの和音で鳴らしているのですが、考え方を変えると、【 波形編集 】 ですから、トラック数の制約のない波形編集ソフトを使うとより自由度の高い音の作成が行えます。実際に行ってみると、

 

■ Audacityでの音の変化          

 

のような音の違いを作れますし、

 

■ 録音した音の加工              

 

の動画内で行っているように音の調整だけでなく、別の音にする事もできます。

 

 基本的に、音の状態変化は中学校の物理で学数する内容そのものですから、波形の変化で振幅と時間の情報を音圧と周波数に変換する訳ですが、周波数が増えると音は高くなるので、音の変化として、波の間隔が狭くなると音は高くなり、波の感覚が広くなると音は低くなります。この時の波の1つの塊を周期と言いますが、周期が短くなると音が高くなり、周期が長くなると音は低くなります。

 

 これが、オシロスコープなどで発生させる個tが出来るサインカーブになりますが、音の合成は

 

【 三角関数を項として用意した関数 】

 

なので、その組み合わせで和音を作る事が出来ます。中学校の物理では、オシロスコープの波形として数学の授業では見かけない物が登場すると思います。これが高校の数学で登場する三角関数のグラフとして登場するサインカーブになりますが、係数を持つxを項として持つ三角関数同士を加算すると、関数の形は

 

 

のようになりますが、これが音楽で登場する和音と同じ構造になります。この辺りの合成と分解はフーリエ級数を使いますが、自然界の音でノイズがないサインカーブだけで音を構成した場場合、周期の違う波形の合成で音が成立するので、和音にすると色々な音を作る事ができます。自然界の場合、これにノイズなども含めた状態で音が生成されますが、その発生した和音に対して空間内での残響音なども含まれるので複雑な波の状態になって耳に届いています。この時の残響音は高校の物理で登場する波動の中で登場する波の反射と影響と同じなので、その状態で複雑な形の波が生成されることになります。学校のカリキュラムでは、部品の知識を身に着けることで一般教養を高めることが重視しているので、あくまでも学校で学んでいる物は、思考や判断を行う上の材料や構造物を作るための部品でしかありません。その為、三角関数と言う部品を使って関数を構築すると、

 

 

 

 

 

のような面白い法則性を作る事ができます。波形については、数式で作る事ができますが、音の基本的な考え方はサインカーブなのですが、音階の場合特定の周波数なので、音階には周波数があります。オシロスコープを使って周波数を合わせてみると指定した音が鳴ります。この周波数に係数をかけ合わせることで音階を作れるわけですが、楽器によって同じCの音でも波形が異なるので集まっている成分が違っています。

 

 このように音は二次元の座標の集合で制御できるのですが、この時の波形も関数の集合体ですから、法則性を用意するとその状態を作れるので、処理の工程として存在している関数を用意するとその状態を実行できるようになります。

 

 音の場合、量子化によって音圧の階調を量子化ビット数で用意して、サンプリングの回数を増やす事でサインカーブの座標の取得回数を増やす事でサインカーブの精度を上げているのですが、この二軸を用意する事で、時間と振幅と言うデータと音圧と音階に変換しています。音の場合、プロッタを通すと地震計のように時間軸と振幅として波を表現できるようになりますが、この変換を量子化によって行っています。この時に任意の形式でオンする事になりますが、この時の処理が符号化であり、エンコード処理になります。

 

 地震計の場合、揺れと言う波を座標平面上の座標の推移として表現している訳ですが、デジタルでもこの座標平面上の座標の集合で構成されたグラフをコントロールする仕様になっています。

 

 音の場合、この座標の変化で波が成立しているのですが、前述のように音と言う部品とその変化や組み合わせによって単一の楽器のパートが成立しています。つまり、譜面もプログラムの一種なんですが、営巣する時には工程が必要ですから、この時の楽器の操作をする為にはアルゴリズムが必要になります。

 

 基礎学習の段階は、【 知識と言う部品の理解 】 を行う事になりますが、部品単体では使えないという事は、小学校3年生の理科で学習します。小学校3年生の理科では、電池と電球と配線を使って豆電球の点灯と消灯を学習し、それを踏まえて、直流と交流を隔週誌ますが、この構造を見ても

 

【 実験機っとには複数のパーツが必要 】

 

であり、それが揃わないと結果に至らない事を体験していると思います。また、欠損するだけでも動作しないという条件は、電球と電池のいずれかで発生する内容ですが、電球が装着されている条件でも電池がなければ動作せず、直流の場合だと、片方の電池が欠損するだけでも動作しなくなることを学習します。この楮を見ると、電池一つの構造は直流と同じなので電池が欠損するだけで豆電球が点灯しなくなるわけですが、構造物は然るべき状態が成立している状態でのみ動作するという内容もこの段階で学習する事になります。

 

 算数は 【 定数項 】 と言う部品を使って、演算処理と言う処理を行う事で 【 実行結果 】 を得る為の方法を学習しますが、これも【 等式の構造 】が成立していないと成立しませんし、小学校では定数項での処理ですから等式の構造は確定した数値と言う部品がある状態でシステム学前れた状態でのシステムのアルゴリズムと実行結果が一致するという条件を等式の形で示したものになります。

 

 プログラミング言語だと == とか === で示した物と同じ状態になりますが、等式も式の一部が欠損すると違う式になりますから、システムに欠損があると成立しないわけですが、理科の電球を使った実験では、この条件を物理モデルを使って学習する事になります。

 

 小学校1年生の最初のカリキュラムでは、足し算を学習しますが、1bitの信号に桁数を持たせるためにパラレルにしてデータの量を増やして、その値に対して個別に二値論理で行うと数値のコントロールが出来るようになりますが、この二値論理の概念を使てド・モルガンの法則にもどついて、AND/OR/NOTの三つの論理演算回路を組み合わせてANDとXORを作って組みあわえた物が加算器になります。これで二進数の加算が出来るのですが、用意した複数の値の加算の結果を十進数のデコーダを通す事で二進数のオンとオフのデータを十進数にする事が出来ます。ちなみに電卓の場合、入力は0~9の数値のボタンと演算記号ですが、これは1つのシノン号でしかありませんから、4bitのデータの配列をこのボタンに対応させておいて、入力が行われた後にそのデータをラッチで固定して、次の桁の入力を行い、演算記号の入力で、桁の入力を終了させて、加算用の数値の入力をする事になります。入力後に=を押すと結果が出るわけですが、最初の段階で加算器を通さずにラッチに対して4bitの値を個別に格納してその値同士を=が押された時に個別に加算していき桁の変化を加算器で算出する事で計算結果を出すのが加算器になります。これを効率的に行う為に処理を行う回路の構造を作る事になりますが、n進数の変換を行う事で、日常で使用している十進数を小学校3年生で学習した豆電球のオンとオフの判定だけで行えるようになるわけですが、高校の数学のカリキュラムで登場するn進数も二進数と十進数の相互変換の方法を学習しますから、この時の処理の内容も数学の中で学習する部品を使った物になります。

 

 足し算については、計算の基本になりますが、これはロジック回路を使った計算でも同じで、電子回路を使った計算機だと、加算器の拡張で桁を持たせることになりますから通常の加算器のHA(半加算器)を用意してここに繰り上がりを用意し田物を作ります。この繰り上がりに対して入力Aと入力Bのいずれかが入ると、2になりますから、桁が繰り上がるので、上の桁になると、最初の構造ではなく、桁の繰り上がりであるキャリー(C)を用意する事になります。これを追加すると、

 

    入力A + キャリー

    入力A + キャリー

    入力A + 入力B

 

で桁が繰り上がるので、この中のいずれか1つのじょうけんでのみその数値を維持できる状態になります。これが一つの桁で発生する訳ですが、加算の場合、

 

    9+0 : 繰り上がりなし 

    9+1 : 繰り上がりあり、数値なし 

    9+2 : 繰り上がりあり、数値あり

 

のような状態が発生します。つまり、9+0よりも小さい場合だと9+0と同じ状態になり、9+2よりも大きい場合、9+2と同じ状態になりますから、この3つの状態を判定する必要があります。つまり、これも加算とキャリーの判断だけでできますが、この時に行うのが二進数の足し算になるので、最終的に1と1の加算を4ビットの各ビットで行った時の結果がその桁のなります。この時に、最大の桁(10進数だと4bitの最上位なので8)の場所でキャリーの発生の有無でこの三つの判定が出来ている訳ですが、こうした判定を前後の4bitで行う事によって桁の変化をコントロールできます。これが加算器ですが、補数を出して加算をする事で計算するのが減算になりますから、小学校1年生でで学数する加減算( 【 たしざん 】 と 【 ひきざん 】 )についても電気の信号で処理をする時には加算で処理を行っています。

 

 この加減算の拡張が乗除算になりますが、これを行う事で計算の基本となる四則演算が出来るようになりますが、双方向シフトレジスタ回路を実装する事で、ループ処理と判定による乗除算ではなく、ビット数の変化を使った乗除算を実装する事ができます。

 

 このように計算の基本は加算になりますが、その最初の学習を小学校1年生で学びますが、中学校になると違う形で同じような事を行います。小学校1年生では【 0以上の数 】を使った状態での数直線を使いますが、中学校1年生では、【 負の数 】 を使った数直線を使います。その為、小学校1年生のさんすうでは、 【 かずのせん 】 を使う事で、数値を一次元の幾何ベクトルで示す事で数値の大きさを示し、ベクトルの向きの変化を加えて、加減算の方法を学習します。これによって、長さの変化で増減の理解を深めることがイメージしやすくなっていますが、

中学校では、【 減るという現象を記号で示す 】 を学ぶので、 【 かずのせん 】 では存在しな方t 【 負の値 】を追加した物を使用します。その為、一次元の数直線は0よりも少ない数値が出てくるわけですが、ここで、0を基準とした時に同じ距離にある数値である 【 絶対値 】 が登場します。

 

 絶対値については、

 

 

のようになりますが、この状態だと、|x|の状態で解である変数がaの場合、【 |x|=  x 】 とすると負の城辺では成立しなくなります。高校の数学Iでも絶対値が登場しますが、この時の法則として、

 

    xが0超過するの時 : |x| = x

    xが0と一致する時 : |x| = 0

    xが0未満になる時 : |x| = -(x)

 

とすると、絶対値の条件を満たす事が出来ます。これを踏まえて、絶対に含まれた数式の解を出す事になります。単項式で考えると、変数xに値を入れた時に、値はどうなりますか?と言う事になりますが、この条件で、x=1だとxは1になり、X=-1だと符号が付いているので、0よりも小さいので、-1に符号をつけるので、1になります。0の場合は0ですから、それよりも大きな数値は、一次関数のy=ax+0と同じ状態になりますから、係数の増減で状態が変わるだけなので、これが多項式になっても成立する事になります。定数項の場合だと、負の数の場合だと符号が付き、正の数の場合だけ正になるので【 0からの距離と同じ 】訳ですが、これが多項式になっても、定数項の解が出る条件では、方程式の形になっているので、

 

|x+5|=6

 

のような条件だと、□+5=6の答えを出せば距離が解るので、この問題だと小学生の足し算の穴埋め問題と同じなので、答えは1と言う事が解ると思います。ただし、この場合、x+5=6と言う方程式を解いただけなので、原点からのプラス方向への距離しか出ていませんから、負の方向にもこの距離が発生するので、絶対値の解は±1となります。中学校1年生の数学では、

 

    負の数

    絶対値

 

が出てきますが、高校の数学Iでは、これを記号を使って示す方法が登場し、それを使った式を使えるようにするカリキュラムが用意されています。絶対値のグラフを見ると、

 

 

のような二次関数に似ていると感じるかもしれませんが、絶対値は、 【 原点0空の距離のグラフ 】なので、y=xの一次関数のグラフがV字になっている訳ですが、これは、現実世界には負の数がないので距離を示すと最小単位の数が0になるのでそう言ったグラフが生成されます。現実世界の挙動で考えると、状態変化ですから、増減が存在するので、±の変化が発生します。そうなると、ローカル座標ベースで見た時のベクトルの推移はY軸の上下方向に発生するので、値の変化はプラスとマイナスが発生します。そうなると、現状を原点として考えた時に傾きに係数を含まない純粋ない地位時間数であるy=xが存在した場合、そのグラフは常にプラス方向に増加する正比例ではなく、マイナス方向に推移する正比例も存在する事になります。グラフを推移でみた場合、X=0の地点がスタート地点になりますが、この時の初期値が 【 Y切片 】 で、小学校で出てきた正比例の場合、原点を通過しているので、この時の初期値は0ベースなので、Y切片は0と言う事になります。一次関数には傾きがありますが、この傾きの変化は、変数Xに対して付加されている変数aで推移しているので、この係数が【 傾き 】の変化に起用しています。そして、Y切片が存在すると、Y=0の地点は原点以外にできますが、この時の値が0になる場所が【X切片】になります。

 

    傾き  : 係数

    y切片 : スタート段階の値(x=0のyの値)

    x切片 : y=0の地点xの値

 

二次関数の場合だと、指数によって二乗されているので、符号が相殺されている為、プラス方向にしか値が出ない仕様になっています。

 

 一次関数を解く場合、穴埋め問題をアルファベットに置き換えた形で登場している一次方程式を学ぶことになりますが、この時に式の構造を理解する為の基礎知識として 【 項 】 を学習します。このカリキュラムで、数値で示す定数項とアルファベットで示す変数項を学習する事になりますが、方程式の構造は穴埋め問題なんですが、変数項が登場する条件で式を穴埋め問題のような構造にすると、公式の記述が

 

【 ☆ = ◯□ + △ 】

 

のように 【 見た段階で無理がある 】 状態になりますから、これをもう少し解りやすくアルファベットに置き換えた状態にして 【 y = ax + b 】 のようになっています。穴埋め問題は□と言うブラインドになっているだけのですが、先程の記号で示した場合、

 

【 ☆ = ◯□ + □÷△ + △ - ◯ 】

 

のような感じで、同じ変数を使う条件だと解りにくくなりますし、法則性の場合、現実世界のように幾何学に近い物を数式に当てはめると大変なので、簡素にする必要があるので、変数項を使う事にあんります。そして、変数項の場合、加算の式で構成されますから、全てを変数項にした場合、四則演算の減算、乗算、除算を項に付加した状態(実際には符号と係数と指数ですが...。)で制御して

 

【 今の状態に何かを行った結果を得る 】

 

という考え方の物に置き換えて処理をする事になります。これにより、係数や分母や符号が変数項についていても対応できるようになりますが、この構造にする事で、

 

【 処理を順番に行った結果、最終結果になる 】 

 

と言う 【 仕組み 】 を考えることが出来るようになります。

 

 項にまとめた場合、加算以外の処理を一つの変数項に実装できるので、 【 処理 】 と考えることが出来るわけですが、小学校低学年の四則演算で、【 演算記号が組み合わさった式 】 が登場しますが、これも 【 項 】 の構造を学習すると、順序が決まっているのも必然的な物だという事が確認できますし、【 処理の方向性 】 が決まっているので計算の順序が破綻しなくなります。

 

 構造物の挙動は最終的な結果がありますが、その結果になるような挙動の実装をする事になりますが、この時の内部処理も処理の連動によって成立しています。この時の初期の状態は静止していますから、グラフで考えると、【 原点 】の0の状態になります。こっから処理を行う事で、状態が変わりますから、次の処理は処理の結果を基準に処理を行う事になります。つまり、原点ベースではなく、処理後の結果を基準にしているので、計算結果を基準に次の処理を行う事になります。これが、加算が連続した状態の式のメリットになりますが、グラフィックで考えると、最初の値は原点ベースなので、これはワールド座標やグローバル座標で指定する状態であり、計算後の結果は、指定後の値を参照するので、ローカル座標と同じ状態になります。この辺りは代数学で考えると分かりにくいのですが、小学校や中学校の1年生の時に登場するかずのせんや数直線のような一次元の座標系に数値を落とし込んで考えてみると、初期値の指定がグローバル座標ベースで、演算記号の後の数値がローカル座標ベースで行われている事が解ります。この時に加算の式にまとめると、減算は符号として変数項に付加できるので、演算記号の【+】の後の処理が行われる時の座標は原点0に対してではなく、ローカル座標に対して行う事になります。

 

 この条件を見てみると、グローバル座標で指定した幾何ベクトルに対して、ベクトルを加算している状態と同じ状態になります。計算式は多項式ですが方程式の形で完結している物については、一つの解が出るようになっています。構造物を作る際に動きを考える場合、指定した挙動になるようにモジュールを用意して動きを制御しますが、このモジュールの動きによって発生した結果で採取的な買いに至るという状態は、項を使った加算の式と全く同じ構造になっています。その為、中学校1年生の数学では、処理を行う上で必要なモジュールの構造とその連動で歳出液な挙動に至るという仕組みを定数項と変数項を用いた構造で式に落とし込んだ形で学習します。

 

 中学校1年生の最初に出て来る、符号、絶対値、項の知識はその後に登場する方程式や関数では必須になりますが、基本的なシステムの流れをモジュールの動作の連動で制御して、その時のモジュールの組み合わせで結果が変わる事を 【 式 】 を用いて扱うカリキュラムが 【 項 】 なので、この構造と考え方は、構造物を考えたり、挙動を考える時に必要になる知識になります。数学は思考をする為の材料や部品になりますが、そもそも数式自体が 【 処理の方法を記号を使って示した物 】 なので、現実世界の幾何の挙動や変化の法則性を記号で示して簡略化し、イメージしやすくした物になります。その為、式自体には、

【 挙動の法則性 】 が示されているので、初期値に対して何が起きるのか?を指定した部分が式であり、その式と結果が一致している事を示しているのが 【 等式 】 になります。

 

 その為、一度だけ指定した動きをする構造物を考える場合、手続き型のプログラムで順次処理で挙動が流れていく物を考えることになりますが、この時の考え方が項の加算の式と全く同じものになりますが、タイムテーブルや行事予定表なども基本的に順次処理のような状態になっていますが、プログラミムの場合、実行時にミスがなく確実にその処理が実行され、記述されている処理の結果と意図した挙動が一致する状態にする必世湯がありますから、システムの動作による結果と意図した実行結果が等式として一致する必要があります。この条件で考えると、モジュール単位で動作する変数項が適正な解を出力し、連動して動作して順次処理で状態が変化して最終結果になった時に解に至る状態と項の加算の式の構造は同じと言えます。

 

 ただし、個数の指定を入れる場合には、カウンターを動かしたりと個数になった時に別の処理を行う事になりますから、ループ処理や条件分岐が入りますから、項の加算の式で動く部分は小さな部位ではそれだけで完結することがあっても、全体で見た場合には、条件分岐やループに包含された状態で構成されている事が多いです。構造物を考える場合に、停止するまで動くような構造物を考えると、処理を実行後に最初の状態からサイド始める必要がありますから、回路の場合だと、クロック回路を実装する事になりますし、プログラミング言語を使う場合だとforやwhileを使ったループ処理を実行する事になります。条件で判定をする場合には、パターンマッチのような一致の判定をしたり、ifでの分岐などを実装する事になりますが、個数の判定をする場合に、センサーでアイテムを検知した際の信号でカウンターを回して、その数が任意の数値になった時に違う処理を実行する場合、個数での判定を用意し、最終的に個数の数値の判定でカウンターのリセットやアイテムを底に並べる場合だと、集まったアイテムを移送する必要があります。これを電気工作で作ろうと思うと、シフトレジスターでカウンターを作って、カウンターの判定でアイテムのある場所の物を移動させるデバイスを動かして、アイテムを配置する物を新規に用意してそこにアイテムを配置するような構造を作る事になりますが、デバイスを動かして何かをする場合だとこうした考え方を行う事になります。この時の分岐は論理演算で行えるので、判定を含めた処理については、電気工作だけでも行えますし、仕組みを理解できると歯車でもそうした挙動を実装できます。ちなみに、マインクラフトでは、サバイバルでプレイしていても地下ほをったり交易をするとレッドストーンを入手できますが、これを使うと信号のオンとオフで動作する回路を作れます。この時の基準がオンとオフの二値なので、二値論理を使用できますからレッドストーン回路を作る際に電気工作の論理回路を使った構造を実装して動く物を作る事ができます。ちなみに、集合と論理のカリキュラムの中でベン図が登場しますが、この構造は二値論理と集合演算の双方で使用して理解を深めることになりますが、この二者には類似している点があるので同じようにベン図を用意すると同じ判定になる物が存在します。ただし、条件抽出と複数の結果の組み合わせの判定条件の構築と言う違いがあるので、集合と論理は同じようにベン図は使用できますが根本的な使途が異なります。

 

 先ほどの事例では【 個数による判定 】が発生していましたが、これが 【 結果に必要な定数 】 になりますから、この値は定数で指定します。例えば、アイテムが5個だったとした場合、Xと言うアイテムが5個なので 【 5X 】 と言うような形になります。この状態を見ると、アイテムが任意の物体なので変数項で、必要な個数は確定しているので定数項を用いることが出来るので、巣値で示す事が出来ます。これが、項で状態を示す方法になりますが、移送されてくるアイテムはカウンターで5まで数えることになるので、このカウンターの数値は0~5までの数値を持った物になります。この時に0は初期化で、1~5をカウンターとしてつかうことになりますから、二値でオンとオフを用意して、0~4の範囲の4bitのデータで処理をするのと同じ状態になります。その後、カウンターの数値=5Xの状態で別の処理をするので分岐を行う事になりますが、この時の移送するアイテムの数や判定時の数値を見ると 【 定数項 】 と 【 変数項 】 の組み合わせで動いている事が解ります。処理の中には、定数として確定した状態で判定をする物と、変化する物がありますが、フィードバック制御をする際に、状態の維持をする際の基準の状態を指定して変数に対して符号で制御して状態を維持しようと思った場合、基準値は変わってもらうと困るので、ここは定数項での指定をして、センサーからの値を取得する際には変化する数値を取得するので、変数項を使う事になります。この時の差を出す場合、定数から変数を引けばいいので、こう言った補正用の数値を出す場合にも変数と定数を用います。この時の変化ですが、直立の場合、重力と水平になるので、水平なテーブルの任意の場所から発生している法線方向の出ているベクトルを基準にして考えることになりますが、6DoFの自由度しかない物体が倒れる場合、このベクトルを基準とすると原点を基準としたこのベクトルの傾きが変化したことになります。その場合、その傾きを制御すれば補正が出来るので、その方向にかかる力を操作宇するだけの逆方向の力を加えると補正出来ることになります。この時に、

 

  検知の頻度を上げて、角度補正のエネルギーを減らす

  検知の頻度を下げて、角度補正のエネルギーを増やす

 

と言う2つのアプローチがありますが、この二者択一だけでなく、この比率を考えることで、バランスを取る事もできます。この条件で考えると、

 

【 実行頻度によって処理が異なる場合がある 】

 

事が解りますが、同じ処理を同じモジュールを使って実行する場合でも、アルゴリズムが異なれば制御方法まで変わる事が確認できると思います。基本的に、物を作る時には、作るもの自体が定数化していないので、最初に作る物と言う定数を用意する事になりますが、時間お推移で変化する物の場合、バーチャルなのか現実世界で体積と質量を持ち、運動エネルギーが時間で推移する物なのかで作り方が違ってきます。

 

 その為、前者の場合だと、【 法則性の実装 】 の為に色々な物を作る必要がありますが、存在しない外的要因の発生は存在しないので、【 既知の事実 】 だけが存在します。解いても、その中にハードウェアの温度の影響(サーマルスロットリング)とかも考える必要が出てきますが、実装した物が実装された状態で実行されるのがプログラミングによって作られたバーチャル空間での出来事になります。

 

 現実世界の出来事の場合、一番最初にカオス理論に基づく外的要因による結果の変化を想定して考える必要がりますが、バーチャル空間ではないので、環境による影響が常に発生し、これが翌年であっても解らないだけでなく、数日後であってもスーパーコンピューターを用いなければ予測できない物になっています。また、これを気象レベルで考えると、

 

【 天気予報ではゲリラ豪雨などは検知できない 】

 

ので、別の短期予測でなければその発生を織り込むことが出来ません。その為、【 直近の出来事ですら、定数化している事象は存在せず、少し先の未来ですら変数の集積であり予測できない物になっている 】 訳です。

 

 そうなると、この条件では出来なくなることの方が多いので、それを回避すると、環境による影響は出ない条件で運用する事になりますが、実際に運用する場所のデータがない事には設計する術がありません。  

 

 このように【 現実世界で実際に使う物 】を作る際にはエータを持ち合わせていないと何もできないわけですが、データ解析をしてある程度の条件を探さないと最適解を導き出す事すらできません。その為、データを用意してその解析を行う事になります。基本的に、現実世界で実際に動作する物を作る時には、置物を作る訳ではありませんから、【 まともに動くこと 】 が大前提になります。そうなると、運用できる状態も想定する事になりますから、外的要素による影響も織り込む必要があります。

 

 ここまで書くとお気づきかと思いますが、この要素を探す事が苦手な存在がAIに依存して必要な乗家を除去してAI依存で物を作ると欠陥品を量産する事になる訳です。

 

 学習の本来の目的が、

 

【 計算機(AI含む) 】 のような不道具を使った際に正しい解に至り、高性能な機材が手作業よりも確実に意味がある状態で使えるようにするための必要な能力の構築 

 

ですから、機材に依存し失敗を繰り返すだけの存在にならない為の処方箋や予防療法と言えます。あと、あまり語られませんが、無知の憶測と言うのは、存在しないデータのパターンからの選出ですから 【 乱数と大差がない 】 ので、条件の判定の基準が乱数になっています。これだと、人類の最頻値に該当する人が間違いようのない条件ですら、間違う事になりますから、道具で補正出来るようなレベルの話ではなくなります。また、カオス理論を前提に考えるという事は、【 未だした結果は、後の結果に影響をお呼びし、それが、時間の推移で影響を及ぼすものであれば、時間の推移した分だけ大きな誤差として生じる 】 と言う物になります。カオス理論の解りやすい事例にタンカーでの長旅が出されますが、タンカーで長期に移動している際に方角に微妙な誤差があった状態でそのまま進んで、陸地にたどり着くと全く違う場所になっている訳ですが、これは、初期における誤差の発生と言う至極当然な影響に追って結果が異なる事例になります。

 

 これについては、小学校の算数の幾何学での三角形の特性を知ると、

 

【 原点から伸びる線分の角度が異なると、終点が異なる 】

 

と言う至極当然な結果を図形を元に学習しているはずですから、イメージしやすいと思いますが、現実の場合、個人がから見たら乱数に見える定数やアルゴリズムを実行する際に考えると変数としか思えない外的要因が常に存在しているので、設計段階で問題を抱えていると外的要因が発生しなくても破綻しますから素した問題を回避する必要があります。

 

 基本的にプログラミングは処理の指定によって構造物の構築や挙動の制御や管理など様々な事が出来るようになっていますが、この作業も大昔には水路で行われていたり、歯車やリレーで行われていたわけですが、コンピューターに近い電気工作やロジックICでも制御系の物を作る結構な規模になってしまいます。この集積回路も高校の物理で学習する半導体で構成されているのですが、ラッチやフリップフロップもNAND半導体なので、高校で学ぶ二値論理と物理の半導体の知識で理解を進めるような物になりますが、スイッチとして機能するトランジスタの誕生によって複雑な処理ができるようになりました。トランジスタを使うと論理ゲートを作れますが、これを集積化した物がロジックICになりますが、これを多機能化した物が計算機などで使用されている集積で、CPUはもっと複雑化した物になります。現在のプロセッサはヘテロジニアス化しているので色々な物が実装されていますが、AMDの製品のようにMCMによってコア数やL3キャッシュが増えている製品もあります。今後はZEN4やRDNA3でこうした機能が実装されますが、現在のCPUやGPUは複雑な項尾増になっているので、処理に応じてコアを使い分けたりコアの管理なども行う事が出来るようになっています。集積度が高く多機能な物を使えるのが現在のコンピューターですが、Geforce RTX 3090に実装されているトランジスタの数が283億個ですから、相当膨大な数のトランジスタが乗っていますが、CPUだと、ZEN3アーキテクチャだと41億個でAlderlakeでも数十億個ですから、CPUの構造もかなり複雑になっています。ちなみに、M1 Proが337億個で、M1 MAXはその3.56倍になっています。(注:M1の場合はSoCなのでGPU部分なども含みます)

 

 基本的にコンピューターは二値のバイナリで動作しているのでこの数の複雑怪奇な経路を二値のスイッチのオントオフで制御するわけにはいきませんから、これを簡素に動作させえる為に人間お言葉で理解しやすい言語で作った文字列で制御を行っているのが 【 プログラミング言語 】 になります。

 

 その為、制御などの 【 目的 】 を実行する際に、どう言った挙動で実装すれば最適に動作するのかを指定する際に、その仕組みを考えることになりますが、この仕組みがプログラムで、その仕組みをローレベルのように十六進数の羅列で打ち込むのでははなく、人間の使う言語に近く、処理の内容をイメージしやすい物で記述する仕様の物がプログラミング言語になります。

 

 その為、プログラミング言語は手段でしかないので、挙動の実装などの 【 目的 】 を実行するための手段でしかないので、プログラミング言語を使えるようにするのは、学校で学習する知識の拡張と言う 【 道具や部品の理解 】 と変わりませんが、プログラミング言語は使う事で正解と不正解(まともに動くか否か)を判断するので、実際に知識が形になって動くという体験が付いてきます。その為、理科の実験に近い状態で、レスポンスが結果として帰ってくるカリキュラムになります。

 

 コンピューター自体が数学の知識の延長線上の物であり、挙動を実装しようと思った場合にも数式での制御をするので、数学や物理方程式を実装するとその結果を使用できますが、プログラミング言語では、【 用意された式を使うとその結果になる 】 ので、プログラミング言語の仕様に合わせた式の記述にすると意図した結果になります。計算での注意点については、以前、

 

 ■ 文字列の取り扱い(2) 【 Python 3.10.1 】

の中で触れていますが、プログラミング言語には計算の優先度というのがあり、演算は、演算記号の抽出を行って、その優先順位を基準に計算が行われています。その為、1+2*3が9になるような事はありませんが、BMIの事例のように式の記述が適正でない場合には、おかしな結果になります。

 

 また、基本的な計算が二進数なので、そこから小数点数の計算をすると値が狂う事がありますが、丸め誤差のように意図しない値が出る場合もあります。その為、動作確認をして結果の整合性が取れているのかを判断する必要がありますから、算数が出来なくてもコンピュターがあれば問題がないというのは間違いですし、数値の記憶を順番に行って、演算記号で次の数値の記憶や現在までの演算結果を出してしまうような構造の機材だと、先程の1+2*3の答えが9になるので、訳も分からずに計算機で式を打ち込んで買いが出たと錯覚すると相当おかしな答えに行きつくことになります。これが、業務で使う数式だとすると相当致命的な話になりますが、基礎知識がなくても機材があれば大丈夫と言うのは、かなり酷い間違いなのでそう言った妄言は真に受けない方がいいです。また、コーディングを行う場合、適正な動作をするのかデバッグを行いながら確認する事になりますが、簡単な数式の処理をするプログラムを書いた場合の確認方法を考えても、解の整合性は計算して答えがあっているのかを行う事になりますから、数値の状態で確定しているものですらそうした処理が発生します。プログラミングも 【 構造物の構築の作業 】 であり、 【 構築のための道具 】 を使っているだけですから、知識は必要になります。また、現実世界で何かを作るのと同じで、 【 知識の総数が選択肢の総数と比例する 】 ので、プログラミングの場合だと、【 効率化の選択肢と知識の総数が比例する 】 仕様になっています。高校1年生だと、中学校までの知識を使えるはずですから、 

 

【 知識を部品として使った場合、その部品の

組み合わせで何が出来るのか? 】 

 

を考えてみると、色々なアルゴリズムが出て来ると思います。これが、現在の知識で構築できそうな物だったり、モジュールになりますが、これをコンピューターで使用する際に、コンピューターにわかるように作業内容を伝える必要があります。この時に、コンピューターに処理の内容を伝えて適正に動いてもらうためのコンピューターとのコミニュケーションツールがプログラミング言語になります。その為、語学の学習ようにプログラミング言語を覚えると、最適なアルゴリズムを作った場合、その通りの木挙動が実行されるようになります。

 

 高校の情報Iのカリキュラムだと、プログラミング言語を学習する事になりますが、現在のプログラミング言語はオブジェクト指向なので、クラスを使用します。クラスは変数と関数を格納した物で、クラス単体で複数の変数や関数を実装して、インスタンスと言う用意した複数の変数を格納したプリセットを作って、プリセットの呼び出しによって処理を実行できる仕様になっています。また、リレーショナルデータベースのように、基底クラスという小さなクラスを作ってそれを拡張したようなクラスを生成して運用できる継承と言う処理もできるようになっていますが、この時の 【 処理 】 を管理しているのが 【 関数 】 になります。

 

 関数も高校の数学Iでは、 【 f(x)=変数xの式 】 という形で登場しますが、プログラミング言語の関数もPyhhonの場合だと、

 

   def 関数名(引数):

        処理

        変数名 = 引数を含めた処理

 

      return 変数名

 

 

のような記述になります。戻り値がない条件だと、

 

   def 関数名(引数):

        処理

        変数名 = 引数を含めた処理

 

になりますし引数がない場合だと、

 

   def 関数名(引数):

        処理

 

のような記述ができます。1行で終わるような官署な処理の場合、無明関数を使う事になりますが、基本的な構造は、引数を元にした処理によって関数の結果が変わるという仕様なので、構造的には高校の数学Iで登場する関数の仕組みと似ています。その為、その構造をプログラミング言語の記述に拡張して使った物が関数になります。関数を使う際に変数を使用しますが、この時に引数と戻り値を使います。引数のイメージが関数で使用する変数xに該当するもので、この引数を使った時に関数内で処理をする際に新しい変数に式を代入する必要があります。そうすると、関数内に式が構築されますが、関数やクラスはブロックスコープがかかるので、関数外での変数の参照が出来ません。(Pythonの場合は、関数内の変数を参照する方法もあります。)

 

 その為、関数内の演算結果を参照する際には、returnで返す必要があります。この時の値の事を 【 戻り値 】 と言います。こうした構造を最初の全部入りの状態で覚えて、その後目的によって省略して使って行く事になりすが、先程の無明関数はラムダ式とも言いますが、

 

【 lambda 引数:処理 】

 

で書けるのでコードを簡素化できます。関数の場合、

 

 変数 = 関数名(引数)

 

で実行する事になりますが、

 

 変数 = lambda 引数 : 処理

 

で実行できるようになっています。中学校の数学では、項の中で変数項と定数項を学習し、その後変数項を使った式を扱う一次方程式学習した後に一次関数を学習しますが、プログラミング言語で処理を実装する際には、変数と定数で値を管理する事になりますが、手続き型のよう上から処理を順番に書いて行く方法もありますが、処理の構造別に分類して管理する事ができます。この関数をファイル内とファイル外で管理できるので、外部参照をして使用することもできます。HTMLがCSSやJavaScriptの外部参照が出来る仕様になっていますが、JavaScript自体も外部からのファイルの参照が行えるようになっています。

 

 また、クラスもそう言った仕様になっていますが、クラスにすると、関数内の変数をインスタンスで管理できるのですが、ガベージコレクションではなく、コンストラクタとデストラクタで

管理できます。関数で引数を受け取って処理をする場合、変数の宣言をしているので、メモリー内にデータが格納された状態が維持されます。これは、ガベージコレクションで開放しない限り維持されますが、メモリーの管理をする場合、初期化をして値を設定して、不要になったら削除が出来た方が都合が良かったりします。この処理を用意したプリセットを切り替えが出来る状態で行えるのがクラスの機能のコンストラクタとデストラクタになります。コンストラクタでインスタンスの初期化を行う事で使用する実態を用意して関数を実行し、使用しない時には、デストラクタでメモリーの解放をするという処理がクラス内だけで行えるのがこの機能になりますが、これはオブジェクト指向の言語の全般で行えるようになっています。近年のプログラミング言語ではガベージコレクションによるメモリーの解放が出来るので、メモリーに溜まっている変数などを消去する事ができますが、クラス内で使用しているインスタンスを対象に初期化とメモリーの解放が出来るのがコンストラクタとデストラクタになります。