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

InfoPath & SQL Server !

Archive for the ‘プログラミング’ Category

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」フォルダを一緒に配布すればいい。

Orange Pi Zero を買った

leave a comment »

先日買った Orange Pi One が気に入ったので、次に Orange Pi Zero を買ってみた。

P1470922_mid_640_480

パッケージは Orange Pi One のときのものと同じ。パッケージを開けると、Orange Pi One と同じように、Orange Pi Zero 本体と簡潔な一枚のプリントが入っている。

P1470776_mid_640_480

P1470926_mid_640_480

実に小さな筐体にぎっしりと機能が集積されているという感じだ。機能美を感じる。スペックは次の通り。

CPU H2 Quad-core Cortex-A7 H.265/HEVC 1080P
GPU Mali400MP2 GPU @600MHz Supports OpenGL ES 2.0
Memory (SDRAM) 256MB/512MB DDR3 SDRAM(Share with GPU)(256MB version is Standard version)
Onboard Storage TF card (Max. 64GB)/ NOR Flash(2MB Default not posted)
Onboard Network 10/100M Ethernet RJ45 POE is default off
Onboard WIFI XR819, IEEE 802.11 b/g/n
Audio Input MIC
Video Outputs Supports external board via 13pins
Power Source USB OTG can supply power
USB 2.0 Ports Only One USB 2.0 HOST, one USB 2.0 OTG
Buttons Power Button
Low-level peripherals 26 Pins Header, compatible with Raspberry Pi B+ ,13 Pins Header
LED Power led & Status led
Supported OS Android, Lubuntu, Debian, Raspbian
Product size 48 mm × 46mm
Weight 26g

オンボードにイーサネットのコネクタがあり、かつ、Wi-Fi モジュールも装備している。だが HDMI コネクタはなく、画面出力をするには拡張ボードが必要だ。電源は micro USB コネクタから給電できる。このスペックからすると、ネットワーク接続に最適化された軽量の IoT モジュール、という位置づけになるだろう。

Orange Pi は中国の Shenzhen Xunlong Software CO., Limited の製品だ。

Written by Yoshio Matsumoto

2017年4月8日 at 9:47 PM

Orange Pi One を買った

leave a comment »

マイコンボードの世界が熱い。とりわけ現在のトレンドは、Raspberry Pi をモデルにしたものだろう。そのうち、最も面白そうなものは、この Orange Pi だ。

P1470774_mid_640_480

パッケージは簡素だが品のあるものだ。パッケージの中には Orange Pi One 本体と簡潔な一枚のプリントが入っている。

P1470776_mid_640_480

P1470791_edit_mid_640_480

この小さなサイズで、スペックは次の通り。

CPU H3 Quad-core Cortex-A7 H.265/HEVC 4K
GPU Mali400MP2 GPU @600MHz Supports OpenGL ES 2.0
Memory (SDRAM) 512MB DDR3 (shared with GPU)
Onboard Storage TF card (Max. 64GB) / MMC card slot
Onboard Network 10/100M Ethernet RJ45
Video Input A CSI input connector Camera
Video Outputs Supports HDMI output with HDCP
Power Source DC input can supply power, but USB OTG input don’t supply power
USB 2.0 Ports Only One USB 2.0 HOST, one USB 2.0 OTG
Buttons Power Button(SW4)
Low-level peripherals 40 Pins Header,compatible with Raspberry Pi B+
LED Power led & Status led
Supported OS Android Ubuntu, Debian, Rasberry Pi Image
Product size 69 mm × 48mm
Weight 36g

オンボードでイーサネットのネットワークコネクタを装備し、HDMI 出力インタフェースもある。

Orange Pi は中国の Shenzhen Xunlong Software CO., Limited の製品だ。

Written by Yoshio Matsumoto

2017年4月8日 at 9:22 PM

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 クラスは多言語の特性に対応しており、日本語特有の評価を行うことができる。