ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Archive for the ‘アルゴリズム’ Category

10分でわかる – Visual Studio と C# で理解するオブジェクト指向プログラミング

leave a comment »

オブジェクト指向は現代プログラミングにおいては強力な手法だが、高度に抽象化された概念を伴うため理解するには適切な学習と訓練が必要である。そこで Visual Studio 2017 を使った C# プログラミングにより、具体的な例をあげて、オブジェクト指向を説明してみよう。

たとえばフォーム上にボタンがあり、ボタンの大きさをスライダの操作によって変化させるようなプログラムを考えよう。Visual Studio ならツールボックスにボタンコントロールとトラックバーが用意されているので、マウス操作だけでフォーム上に配置することができる。

OOP_001

OOP_002

トラックバーで変化させる値の範囲を、0から300にしよう。それには作成した trackBar1 のプロパティをプロパティウィンドウで変更する。Minimum の値は 0 のまま、Maximum の値を 300 に変更する。

OOP_003

次にトラックバーをマウスでダブルクリックし、トラックバーのスクロールイベントを作成する。ここに次のコードを書こう。これはオブジェクト指向ではないプログラミングの例だ。

————————————————————————————–

button1.Height = trackBar1.Value;
button1.Width = trackBar1.Value;

————————————————————————————–

OOP_004

ビルドして実行する。すると、スクロールバーを動かすことでボタンの高さの値と幅の値がスクロールバーの値になるので、大きさが変化する。ちゃんと動くプログラムができる。

OOP_005

OOP_006

OOP_007

フォームの大きさに対して 300 というボタンのサイズは大きすぎるので、スライダを右端によせればボタンがフォームからはみ出すようになる。

では、ここからだ。

スライダの値範囲は 0 ~ 300 のままとし、スライダを操作してもボタンのサイズが 100 ~ 200 の範囲に留まるようにプログラムを書き換えよう。if 文を知っていれば、たいてい次のようにコードを書くだろう。

————————————————————————————–

if (trackBar1.Value > 100 && trackBar1.Value < 200)
{
button1.Height = trackBar1.Value;
button1.Width = trackBar1.Value;
}

————————————————————————————–

OOP_008

もちろん、これで求める動作をするアプリケーションが得られる。しかし、オブジェクト指向では、こう考える。ボタンのサイズが 100 から 200 の範囲に留まるのは操作をする側で調節するのではなく、ボタン自体の性質にするべきだと考える。サイズを 100 以下にする指示や 200 以上にする指示を無視するように実装するのだ。

ではオブジェクト指向でやってみよう。

それにはもともと用意されたボタンオブジェクトに変更を加える必要がある。そこでオブジェクト指向の「継承」という概念を用いる。「継承」は、あるオブジェクトの性質を引き継ぐ別のオブジェクトを作る方法である。次のコードでは「継承」を利用して custumButton のオブジェクトを作っている。

————————————————————————————–

class CustomButton : Button
{

}

————————————————————————————–

そして Form1 クラスに myCustomButton の名前で CustomButton オブジェクトを作り、フォームの Load イベントで myCustomButton のインスタンスを生成してフォームに表示する。

————————————————————————————–

CustomButton myCustomButton;

————————————————————————————–

myCustomButton = new CustomButton();
this.Controls.Add(myCustomButton);

————————————————————————————–

OOP_009

この状態でビルドすると、フォームの左上にボタンができているが、これは Button オブジェクトを継承して作った CustomButton である。ただ、この CustomButton には何もコードを付け加えていないので、このままでは単なるボタンと同じである。

OOP_010

次に、この CustomButton に自分のサイズを変更するメソッドを定義する。こんなかんじだ。

————————————————————————————–

public void changeSize(int x)
{
this.Height = x;
this.Width = x;
}

————————————————————————————–

これにより CustomButton オブジェクトは changeSize メソッドを持つことになり、myCustomButton.changeSize(100) のようにしてサイズを変更できるようになる。

ここでさらに、ボタンのサイズを 100 ~ 200 に限定するため、次のようにコードを書き加える。

————————————————————————————–

public void changeSize(int x)
{
if (x > 100 && x < 200)
{
this.Height = x;
this.Width = x;
}
}

————————————————————————————–

このことにより、ボタン自身がサイズの変更を 100 ~ 200 の場合のみ受け付けるようになる。トラックバーのスクロールイベントには次のようなコードを書く。

————————————————————————————–

myCustomButton.changeSize(trackBar1.Value);

————————————————————————————–

OOP_011

OOP_012

OOP_013

OOP_014

これにより、ボタンのサイズを変更するプログラムは、全体のコードでは changeSize メソッドを利用して「大きさ変われ」と指示を出し、それを受けたカスタムボタンオブジェクト自身が指示通り動くかどうかを判断して動くようになる。カスタムボタンは 100 ~ 200 の値しか受け付けないので、それ以外の指示を出しても無視する挙動をする。オブジェクトにふるまいを実装することで、値の指示範囲を主プログラム側で気にする必要がなくなるのだ。

さらに CustomButton クラスの記述を分離コードの Form1.Designer.cs に移動すると、プログラム全体はより見やすくなる。

OOP_015

OOP_016

さらに c# には、オーバーロードという概念があり、同じ名前のメソッドでも引数の型が異なれば重複して実装することができる。たとえばこのカスタムボタンに、サイズが 150 × 150 の決まった「mid」サイズの定義があるとして、それを次のように定義することができる。

————————————————————————————–

public void changeSize(string x)
{
this.Height = 150;
this.Width = 150;
}

————————————————————————————–

OOP_017

全体のコードでは、数値で大きさを変える changeSize メソッドと同じ名前でカスタムボタンに「ミッドサイズになれ」と指示を出すことができる。

————————————————————————————–

myCustomButton.changeSize(“mid”);

————————————————————————————–

新しくフォームに作ったボタンをクリックして「ミッドサイズ」にするコードは次の通りだ。

————————————————————————————–

OOP_018

このようにオブジェクト指向プログラミングでは「ふるまい」をオブジェクトの側に実装し、全体のプログラムからは

180 × 180 の大きさになれ

myCustomButton.changeSize(180);

ミッドサイズの大きさになれ

myCustomButton.changeSize(“mid”);

といった指示を出すように書くことができるようになる。このことでオブジェクトのふるまいがオブジェクト自身に記述され、プログラム全体が見やすく、また合理的にコントロールできるようになる。

2018年3月8日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞し、現在3回目の連続受賞。

広告

小学校の先生はオブジェクト指向を知らなくてよいか – 高度な領域を知ることで教え方も変わる

leave a comment »

プログラミング教育において「オブジェクト指向」を学ぶことは重要だが、もちろん小学生にオブジェクト指向を教えろと言っているのではない。もちろん将来的に小学校のプログラミング教育にオブジェクト指向が取り入れられることになれば、それは歓迎すべきことだが、今すぐそうはならないだろう。また近い将来にオブジェクト指向ではない別のアプローチがプログラミングの主流になるかもしれない。ただ、現代プログラミングにおいてはオブジェクト指向は強力な手法であり、およそ個人レベルで使われるアプリケーションのほとんどがオブジェクト指向によって作られているといえる。このことから高等学校レベルではオブジェクト指向を身につけることをプログラミング教育の目標のひとつにしたい。

発達段階に応じたプログラミング教育を考えたとき、小学校では手続き型のプログラミングに留めるべきだろう。またキーボードから文字入力をするコーディングではなく、ブロックを視覚的に組み合わせてプログラムを作る、いわゆる「ブロック型」の開発環境が望ましいだろう。そして構造化プログラミングとしてまとめられる「順次構造、繰り返し構造、条件分岐」を理解しプログラミングができること、センサやアクチュエータをマイコンボードやロボットで制御し、入出力を体験的に理解し活用できること、などが目標になるだろう。では小学校の先生はオブジェクト指向を知らなくてよいのかといえば、そうではない。小学校の先生もオブジェクト指向を理解するべきである。

オブジェクト指向は高度に抽象化されたプログラミング手法である。中学校、高等学校と発達段階がすすむにつれ、どこかの段階で身につけさせたい概念である。小学校の授業では教えなくても、これを知っているのと知らないのとでは教材の作り方や教え方が違ってくるだろう。

たとえば数学なら、中学校では連立方程式を学習する。よくある問題として「予算が290円あります。鉛筆は1本30円、消しゴムは1個50円です。予算を全部使って7人に渡すには、鉛筆と消しゴムをそれぞれ何個ずつ買えるでしょう。」がある。中学校の数学では、鉛筆を x 本、消しゴムを y 個として連立方程式を作って求めるだろう。小学生にとって連立方程式は抽象化度が高いので学ばないが、小学校6年生では「文字と式」の単元で数字を○や□にあてはめた計算方法を学習する。また「鉛筆を1本だけ買った場合、2本買った場合、3本買った場合・・・」と実際の数をあてはめながら答えを求めることもさせる。そしてこれは、中学校で連立方程式を学ぶ前段階として位置づけられている。もちろん教師は中学校では連立方程式を学習することを知っており、それを前提に授業を組み立てる。学問は系統だっており、学習も発達段階に応じて系統的に組み立てられるからだ。

したがって小学校の先生がプログラミング教育を行う時も、学習の先にオブジェクト指向があることを知っているのと知らないのとでは授業のアプローチも違うはずだ。その意味でも、小学校の先生もオブジェクト指向を理解しておくべきだ。オブジェクト指向は難しいと言われるが、すぐれた教材と学習メソッドがあれば理解できる。小学校からプログラミング教育を、と言われて奮闘する小学校の先生には頭が下がる思いであり、先駆的な実践を始めている先生方は子どもたちの未来を切り開く希望の星だと言えるが、そこを、あえて、さらに質の高いプログラミング教育を実現するために、オブジェクト指向を学んでいただきたいと望んでいる。

2018年3月8日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞し、現在3回目の連続受賞。

オブジェクト指向は宗教ではない。プログラミングを合理的にする重要な手法のひとつである。 – オブジェクト指向は難しくない。ただ、よき学びの環境がないだけだ。

leave a comment »

オブジェクト指向が語られるとき、ときに「宗教論争になる」と言われることがあるが、そうではない。宗教論争においては他の宗教を認めず自分の宗教の正しさのみ主張し、相手の宗教を否定する。しかしオブジェクト指向は他のプログラミング手法を否定するものではなく、ただ単にプログラミングを合理的にする手法のひとつである。そしてそれは現代プログラミングにおいては重要であり、かつ広く実際に利用されている。そして一般的なパソコンユーザーが利用するアプリケーションのほとんどがオブジェクト指向によって作られている。

すべてのプログラミングをオブジェクト指向によって作る必要はない。またオブジェクト指向ではないプログラミング言語もあり、それらも当然意味がある。またオブジェクト指向プログラミングにおいても手続き型の考え方が不要なわけではない。ただ、プログラミングを合理的にするためにオブジェクト指向は極めて有効である。

オブジェクト指向を説明するときに、動物や物に例えられることがある。だが、たいていの場合それは、なんとなく説明になっているようでなっていない。それはオブジェクト指向というものが、そもそも現実世界をプログラミングに持ち込むために考えられたのではなく、プログラミングという抽象的な世界で効果的に機能するために考え出されたものだからだ。オブジェクト指向は抽象的なプログラミングの世界をさらに高度に抽象化したものといえる。

したがって現代プログラミングにおいてオブジェクト指向を知らないことは損である。知っていて使わないことと知らないから使えないことは意味が違う。オブジェクト指向を用いると圧倒的に合理的にできるプログラミングが、知らなければその恩恵にあずかることはできない。そもそも言語体系がオブジェクト指向を前提としているにもかかわらず、それができないことは圧倒的に不利であると同時に、言語の持っている潜在能力を生かせないことになる。

言語仕様がオブジェクト指向であるとき、プログラミングではオブジェクトを操作することになる。しかし、ただ単にオブジェクトを操作するだけでは、たとえ動くコードを書けたとしても、それはオブジェクト指向のプログラミングではない。求める機能を実装したオブジェクトを設計し、全体のコードの中で効果的に使うことができてはじめてオブジェクト指向プログラミングをしたといえる。

オブジェクト指向は難しいと言われる。確かに筆者もオブジェクト指向を理解し、自然に使えるようになるには時間がかかった。またプログラマーを自任している人でも、実際のところオブジェクト指向を理解し、使いこなしている人がどれだけいるか、いささか疑問に感じることも多い。というのも、世にあふれる初心者向けのプログラミング解説書を読んだとき、どうやらオブジェクト指向を理解していないのではないかとおもわれるふしが多々あるのだ。

だがオブジェクト指向は難しくない。ただよき学習の機会が少ないからだ。それは書籍でもWebの記事でもそうである。クラスやインスタンスを説明しても、なぜ、そうするのか、どこがオブジェクト指向なのかが説明されていない。オブジェクト指向でプログラミングした場合と、そうでない場合とを比較し、だからオブジェクト指向でやるのだ、というような明確な解説が少ない。オブジェクト指向を理解することは、例えば自転車に乗る、跳び箱を飛ぶ、鉄棒で逆上がりをするといったようなものだ。こつがわからなければ何度やってもうまくいかない。いくら練習しても一生できないのではないか、と子どもなら思うところだが、一度できれば忘れない。

子どもは、自転車に乗る、跳び箱を飛ぶ、鉄棒で逆上がりをする、といった体験をしながら達成感を得て成長する。すぐれた教育者は、どの子も自転車に乗れ、跳び箱を飛べ、鉄棒で逆上がりができるようなメソッドを身につけて指導する。オブジェクト指向も高度に抽象化されたプログラミング手法であるが、高校生レベルなら身につくはずである。教科「情報」の教員なら、まず自らオブジェクト指向を身につけ、すぐれた教育メソッドを開発すべきである。

2018年3月8日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞し、現在3回目の連続受賞。

Minecraft Education 版の新機能(3) – ミュートボタン

leave a comment »

教育版マインクラフトの機能拡張がすすんでいる。新しいバージョンではミュートボタンが搭載された。このミュート機能は、コマンドを使ったときのレスポンス表示をミュートする機能だ。サウンドのミュートではない。マインクラフトではコマンド入力によって世界を操作すると、画面に実行した操作のレスポンスが表示される。たとえば /weather thunder コマンドで天候を雷雨に変更すると、画面にレスポンスが表示される。

MinecraftEducation_007_mid_640

コマンド入力モードでは実行したコマンドの結果が履歴で表示されている。

MinecraftEducation_008_mid_640

コマンド入力モードで右上にある「ミュート」スライダを右にして「オン」にすると、コマンド実行の結果を画面に表示しなくなる。雷雨になったマインクラフトの世界を /weather clear コマンドで晴れにしてみよう。

MinecraftEducation_009_mid_640

コマンドを実行して天気が晴れになろうとしている。しかし実行結果は画面に表示されていない。

MinecraftEducation_010_mid_640

コマンド入力を多用したとき、画面が実行レスポンスの履歴で邪魔になることがある。「ミュート」機能をオンにすると、レスポンスが表示されないので操作の邪魔にならずにすむだろう。

Minecraft Education 版の新機能(2) – コマンド入力ボタン

leave a comment »

マインクラフトにはコマンド入力モードがあり、教育版でなくてもコマンドを使ってマインクラフトの世界をコントロールすることができる。プログラミングの基本はコマンド入力だといってもいいが、小学生にとってはキーボードからのコマンド入力は敷居が高い。そこで基本的ないくつかのコマンドをマウスでクリックして実行できるボタンが搭載された。

MinecraftEducation_004_mid_640

画面の下にあるコマンド入力テキストボックスの左にスラッシュ「/」のボタンがある。このボタンをクリックすると「世界のスポー地点を設定する」、「テレポート」、「時間」、「天候」のメニューが表示され、これら基本的なコマンドをマウスクリックだけで実行できる。

MinecraftEducation_005_mid_640

たとえば「天候」のボタンをクリックすると、コマンドラインに「/weather」のコマンドが自動的に書かれ、次のメニュー「晴れ」、「雨」、「雷雨」を選ぶことができる。

MinecraftEducation_006_mid_640

限られたコマンドだが、このボタンを使うことによってコマンドの使い方や記述方法を学ぶことができる。子供たちにはボタンがあることさえ伝えておけば、あとは自分でやってみて身に着けることができるだろう。まさに、体験的学習を明確に意識した実装だ。

Minecraft Education 版の新機能(1) – 座標を画面に表示する

leave a comment »

マインクラフトは小学生を中心に大人気のゲームアプリだが、共同学習とプログラミング学習の機能を加えた学校教育向けのエデュケーション版「Minecraft Education」がある。このエデュケーション版は実際に授業で活用した教員のフィードバックにより改良がすすんでおり、ますます使いやすくなっている。その一つが画面に座標を表示する機能だ。

ゲームとして遊ぶには座標を特別意識する必要はない。しかしプログラミングをしてエージェントを動かし、ブロックを配置するなどの場合には座標の概念が欠かせない。マインクラフトの世界で自分がどこにいて、どこに何をしたいのかを座標で与えなければならないからだ。

MinecraftEducation_001_mid_640

Minecraft Education を起動したら「遊ぶ」のボタンをクリックして「世界」のタブで新しい世界を作ろう。新しい世界を作りときに「ゲーム設定」をするが、ここにある「チート」と「常に昼間」などのスライドボタンに加えて、新しいボタン「座標を表示」と「教室の設定を表示」のボタンがある。

MinecraftEducation_002_mid_640

このスライドスイッチは「チートの実行」と「常に昼間」を右にスライドしてオンにしておくことがプログラミングなどの実習時には望ましい。さらにここで新しくできた「座標を表示」のスライドを右にしてオンにしてみよう。

MinecraftEducation_003_mid_640

「座標を表示」にしたプレイ画面がこれだ。画面の左上に自分の座標が表示されていることがわかるだろう。これで自分の位置を確かめながらマインクラフトの世界を歩くことができる。プログラミング時に座標を使う場合もこれでわかりやすい。座標がわからなければ、コードによってブロックを配置しても、いったいどこに出現したか探し回らなければならないこともあったが、これでわかりやすくなった。

IoT 開発における Arduino ファミリーの優位性 – nodeMCU を使う理由

leave a comment »

IoT 開発のために主として Arduino ファミリーと呼ぶことができるマイコンボードを使っている。ここで「Arduino ファミリー」と言っているのは、オフィシャルな Arduino 開発環境である Arduino IDE を使って開発でき、物理的な仕様もほぼ Arduino に準じているものを指している。