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

InfoPath & SQL Server !

Archive for the ‘C#’ Category

C# – 教科「情報」の授業で使うタイピングトレーニングのソフトを作っています。その 3。河端さんとのコラボレーション。Microsoft Flow と Microsoft Power BI で何ができるか。

leave a comment »

教科「情報」の授業で使うタイピングトレーニングのソフトを作っており、Microsoft SQL Server の大家であり Microsoft MVP でもあった河端さんと一緒に考えている。私は Visual Studio でクライアントの開発をし、河端さんにクラウドのアプリケーションを作ってもらっている。クライアントは Windows デスクトップアプリで、開発言語はもちろん C# だ。

河端さんには、クライアントアプリケーションから POST データを受け取るサービスを、Microsoft Flow で作ってもらった。Microsoft Flow で受け取ったメッセージを電子メールで通知する、といったシステムを、お互い離れた拠点でメッセージをやりとりしながら、およそ 30 分で作ることができた。これが現代的な開発スタイルだといえよう。

そして河端さんには、Power BI の分析ページを作ってもらった。こんなかんじだ。

文字入力トレーニングアプリ_003_PowerBI_1_mid_640

文字入力トレーニングアプリ_004_PowerBI_2_mid_640

文字入力トレーニングアプリ_005_PowerBI_3_mid_640

河端さんは、私がクライアントの Windows フォームアプリケーションを調整している間に、Microsoft Flow に送られたデータをこのように分析する Microsoft Power BI のフォームを作られていた。これらのビューを作るには、およそ 15分もあればよいそうだ。

このように、Microsoft Flow と Microsoft Power BI を使うとアイデアさえまとまればアプリケーションを作る手間は革命的に小さくなった。重厚長大のシステム開発の時代は終わったのだ。

C# – 教科「情報」の授業で使うタイピングトレーニングのソフトを作っています。その 2。河端さんとのコラボレーション。

leave a comment »

先日、SQL Server のスペシャリストで Microsoft MVP でもあった河端善博さんと久しぶりにお会いし、Microsoft Flow や Power BI の話をうかがった。実に興味深く、私がやっている IoT や情報教育で使う場面がないか考えた。そこで、まず今作り始めている文字入力トレーニングソフトのデータを Microsoft Flow で処理し、Power BI で分析することをやってみることにした。

まず、実習結果を自分で見るだけなら時間を計り正しく入力できたかどうかを判定できればよい。しかしデータを集約するなら、誰の実習結果かという ID が必要になる。そこで ID をどうするかを含めて、通信データのフォーマットを決めることにした。河端さんから提示されたのは次の項目だ。

"生徒識別子"
"経過秒数"
"スコア"

生徒識別子は文字列型とし、経過秒数やスコアのデータ型をどうするか相談をしたが、型がそろった方がアプリケーション側で作りやすいので文字列型にしてもらった。これに加えて次の項目を付け加えた。

手本文字数"

「スコア」は何文字まで間違いなく入力できたかの文字数を評価することにしているが、もともとの手本の文字数が何文字かがあった方が良いと考えたので、それを加えることにしたのだ。これらの集めるデータは今後どんどん変わっていく可能性があるが、とりあえずこの 4つの項目にすると決めた。データの送信は Web サービスの POST メソッドとし、渡すデータは json で記述することにした。こんなかんじになる。

{
"生徒識別子": "A0000",
"経過秒数": "10",
"スコア": "89",
"手本文字数": "100"
}

すでに作っているアプリケーションに「生徒識別子」のテキストボックスを追加し、Web サービスに POST するコードを書いた。

文字入力トレーニングアプリ_001_mid_640

その他の変更点は、入力するための原稿をテキストファイルにして保存し、アプリケーションの起動時に読み込む形にした。また入力原稿は教科書の本文とすることとし、入力分のはじめとおわりを表示して、教科書のどこの文を入力するのかを間違わないようにした。

私がアプリケーションを調整している間に、河端さんに Microsoft Flow で Web サービスを作っていただいた。河端さんに作っていただいた Microsoft Flow は次のようなものだ。Web サービスへの POST の結果を知りたかったので、電子メールで送信してもらうようにお願いした。次の画面は河端さんからもらったものだ。

18109673_10155304824759394_589213491_n_mid_640

何度か試験を繰り返し、正しくデータが送られることを確認した。データの送信確認は電子メールが送られてくることでわかる。

文字入力トレーニングアプリ_002_mid_640

このように、私が Visual Studio 2017 でアプリケーションを作り、河端さんが Microsoft Flow でクラウド側のシステムを作る。このコラボレーションが、実質 30 分ほどで動くシステムができあがった。

たとえば生徒の家庭学習などを IT でサポートする場面で、このように簡単にアプリを作ってクラウドの共有フォルダなどで配布し、練習結果を Microsoft Flow で受け取って集計する、Power BI で分析する、といったことが簡単にできる。何年か前なら、なんらかの学習システムみたいなものを作ったものだが、今やこのような時代だ。

C# プログラミング – Visual Studio 2017 で作る Windows Form アプリケーションで起動時にテキストファイルを読み込む。

leave a comment »

教科「情報」の「情報の科学」の授業で、定期的に文字入力のトレーニングをするための簡単なプログラムを作っている。あらかじめ登録されたテキストと同じテキストをテキストボックスに入力し、正しく入力できたか、何文字入力したか、入力にかかった時間は何分何秒か、を記録するトレーニングツールだ。

文字入力トレーニングソフトの画面_mid_640

フォームのイメージはこんなかんじ。テキストボックスは「開始」のボタンが押されるまでは使えないようにしておき、「開始」で時間を計測する。「終了」で時間の計測を終え、入力できた文字列を評価する。

このプログラムを生徒に配布するのだが、入力原稿に相当するテキストを、その都度プログラム内に保存しなければならない。このとき、原稿テキストをテキストファイルにしておき、プログラムを起動するときに読み込むようにした。テキストファイルはプログラムと同じフォルダに置いてもいいが、ファイルが丸見えでは触られてしまう可能性が高いので「settings」フォルダの下に入れることとした。

文字入力トレーニングソフトの画面_002_mid_640_480

プログラムでテキストファイルを読み込むコードは次のとおりだ。

—————————————————————————-

myFileName = @"settings\inputtext.txt"; //テキストファイルの場所を示す
enc = System.Text.Encoding.GetEncoding("shift_jis"); //エンコーディングを指定

//テキストファイルの読み込み
try
{
    myInputTextString = System.IO.File.ReadAllText(myFileName, enc);
}
catch
{
    MessageBox.Show("テキストファイルがありません");
}

—————————————————————————-

これで、生徒にプログラム本体とテキストファイルが入った「settings」フォルダを一緒に配布すればいい。

C# – 文字列を比較するアルゴリズムについて考える(1) – 2つの文字列を前から順に比較し、違いがあった位置を見つけるアルゴリズム

leave a comment »

学校の授業で文字入力のトレーニングをするために、効果的なアプリケーションを作っている。ここで必要な実装として文字列比較がある。

仕様、というか、個人で作るアプリケーションなので厳密な仕様は決めないが、イメージ的にはこうだ。入力トレーニングの元になる文がある。この文は、フォントやポイント、文字飾りなどは無視し、単にテキスト文字列だけのものとする。つまり単なるテキスト文とする。この文と同じ文をキーボードから入力するトレーニングとし、入力にかかった時間と入力できた文字数をカウントしてスコアとする。このとき、入力を間違ったことを評価に加えたい、というものだ。

すぐに思いつくのは、文字列を前から順番に比較し、違いがあったら位置を見つけ出すアルゴリズムだ。2つの文字列が myStr1 と myStr2 に入っており、2つの文字列の長さが同じだとする。

——————————————————————

for (int i = 0; i < myStr1.Length; i++)
{
    if (myStr1[i] != myStr2[i])
    {
        myStrDiff = i;
        break;
    }
}

——————————————————————

前から順に比較し、違いがあった文字でループを抜ける。前から何文字目であったかが myStrDiff に数字として入る。この数字は 0 から始まるので、実際は +1 文字目に違いがあった、となる。これだと、たとえば次のようになるだろう。

myStr1 = "あいうえおかきくけこ";
myStr2 = "あいうえおまきくけこ";

このとき、myStrDiff の値は 5となる。前から 6文字目に違いがあるからだ。しかし、「か」を「ま」と間違えてはいるが、そのあとはちゃんと入力できている。つまり「5文字目までしか間違いなく入力できなかった」のではなく「6文字目だけ間違えたが、それ以外はちゃんと入力できた」はずだ。つまり、このように評価すべきだろう。

入力すべき文字列 ・・・ あいうえおかきくけこ
実際の入力1 ・・・・・ あいうえおかきくけこ (評価10点:満点)
実際の入力2 ・・・・・ あいうえおまきくけこ (評価9点:1文字だけ間違った)
実際の入力3 ・・・・・ あいうえおまみむめも (評価5点:5文字間違った)

つまり、間違った文字以降をどう再判定するか、を考えなければならない。このアルゴリズムについて引き続き考えていきたい。

C# – 文字列を比較する(5)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreSymbols オプションで $%&!#'()*?<>^~-+ の特殊記号やスペースを無視して評価する。

leave a comment »

System.Globalization.CompareOptions には IgnoreSymbols オプションがある。このオプションを使うと、$ や %、# などの特殊記号やスペースを無視して文字列を評価できる。まず IgnoreSymbols オプションを使わない例だ。次の例では文字列に特殊記号やスペースが入っているので「違う」と評価する。

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

string a = "あいうえお";
string b = "あ$い%う&え  お!#'()*?<>^~-+";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

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

しかし次のように System.Globalization.CompareOptions の IgnoreSymbols オプションを使うと、同じと評価する。

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

string a = "あいうえお";
string b = "あ$い%う&え  お!#'()*?<>^~-+";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b, System.Globalization.CompareOptions.IgnoreSymbols) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

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

C# – 文字列を比較する(4)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreKanaType オプションでカタカナとひらがなを同じに評価する。

leave a comment »

System.Globalization.CompareOptions には IgnoreKanaType オプションがある。このオプションを使うと、カタカナとひらがなを同じとして評価できる。まず IgnoreKanaType オプションを使わない例だ。次の例ではカタカナとひらがなを「違う」と評価する。

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

string a = "アイウエオ";
string b = "あいうえお";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

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

次に IgnoreKanaType オプションを使った例を示す。この例ではカタカナとひらがなを「同じ」と評価する。

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

string a = "アイウエオ";
string b = "あいうえお";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b, System.Globalization.CompareOptions.IgnoreKanaType) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

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

C# – 文字列を比較する(3)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreWidth オプションでカタカナの全角と半角を同じに評価する。

leave a comment »

文字列を比較するとき、System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスを使うと日本語固有の評価を変えることができる。たとえば System.Globalization.CompareOptions の IgnoreWidth オプションを使うと、カタカナの全角と半角を同じに評価することができる。

まず、IgnoreWidth オプションを使わない評価をする。System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスが返す値は int 型で、文字列が同じときは「0」、異なるときは「-1」を返す。次の例では「違う」という評価がされる。

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

string a = "アイウエオ";
string b = "アイウエオ";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b)==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

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

次に System.Globalization.CompareOptions の IgnoreWidth オプションを使ったコードを示す。こちらでは「同じ」という評価を得る。

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

string a = "アイウエオ";
string b = "アイウエオ";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b,System.Globalization.CompareOptions.IgnoreWidth)==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

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

このように System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスは多言語の特性に対応しており、日本語特有の評価を行うことができる。