メインコンテンツまでスキップ

イースト辞書Webサービスを利用したC#(with .Net)クライアントプログラミング

· 約5分
Yu Sasaki
Enterprise Security Manager / Advisor

C#からWebサービスを扱う練習をしてみました。例として、イースト辞書Webサービスを利用しようと思い宇宙仮面の C# プログラミングこちらのページのソースコードを参考にしました(謝々)。 SOAP版APIの最新バージョンがv10になり、仕様が変更になったので以下にそれに対応したソースコードを示します。

実行結果

C#でWeb辞書サービス

ソースコード

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using netdictist.jp.co.est.btonic; // Webサービスの名前空間を追加
namespace netdictist
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private NetDicV10 netDicV10 = null; // Web Service インスタンス格納用変数
private DicInfo[] dicInfoList = null; // 辞書情報の配列(出力)
private DicInfo currentDict = null; // 辞書
private DicItem[] itemList = null; // 辞書項目の配列(出力)
private void Form1_Load(object sender, EventArgs e)
{
#region ComboBox に辞書リストを設定する。
// Web辞書検索サービスのインスタンスを作成する。
this.netDicV10 = new NetDicV10();
// 辞書のリストを取得する。
dicInfoList = netDicV10.GetDicList("");
foreach (DicInfo dicInfo in dicInfoList)
{
// comboBox1に項目を追加
int index = this.comboBox1.Items.Add(dicInfo.FullName);
if (index == 2) break;
}
this.comboBox1.SelectedIndex = 0;
#endregion
}
// 辞書が変更になった。
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.currentDict = this.dicInfoList[this.comboBox1.SelectedIndex];
}
private void button1_Click(object sender, EventArgs e)
{
DicInfo d = this.currentDict; // 選択された辞書
uint reqItemIndex = 0; // 取得する辞書項目の開始インデックス
uint reqItemTitleCount = 10; // 取得する辞書項目の数
uint reqItemContentCount = 10; // 内容も同時に取得する辞書項目の数
uint itemCountTotal; // 見つかった辞書項目数(出力)
Cursor cursor = this.Cursor;
this.Cursor = Cursors.WaitCursor; // Wait Cursor にする。
Query[] qw = new Query[1]; // クエリ構造体
qw[0] = new Query();
qw[0].Words = this.tbSearchText.Text;
qw[0].ScopeID = d.ScopeList[0].ID;
//グローバル一意識別子(GUID)の作成
Guid[] dicGuid = new Guid[1];
dicGuid[0] = System.Guid.NewGuid();
dicGuid[0] = d.DicID;
ContentProfile cp = new ContentProfile();
cp.CharsetOption = CharsetOption.UNICODE; // 使用文字セット指定
cp.FormatType = "XHTML";
cp.ResourceOption = ResourceOption.URI;
itemCountTotal = netDicV10.SearchDicItem(
"", // 認証チケット文字列
dicGuid, // 辞書ID
qw, // 検索語(クエリ構造体)
cp, // ContentProfile構造体
"", // ソート用(使用しない)
reqItemIndex, // 取得する辞書項目の開始インデックス
reqItemTitleCount, // 取得する辞書項目の数
reqItemContentCount, // 内容も同時に取得する辞書項目の数
out itemList // 辞書項目の配列(出力)
);
this.Cursor = cursor; // Cursor を元に戻す。
this.labelMessage.Text =
itemCountTotal.ToString() +
"件みつかりました。最大10件まで表示します。";
this.listBox1.Items.Clear();
foreach (DicItem dicItem in itemList)
{
this.listBox1.Items.Add(dicItem.Title.InnerText);
}
}
// 検索結果のリストをセレクトしたので、詳細を表示する。
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string dictext =
this.itemList[this.listBox1.SelectedIndex].Body.InnerText;
this.richTextBox1.Text = dictext;
}
}
}

Form1.Designer.cs

namespace netdictist
{
partial class Form1
{
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
/// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows フォーム デザイナで生成されたコード
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.tbSearchText = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
this.labelMessage = new System.Windows.Forms.Label();
this.listBox1 = new System.Windows.Forms.ListBox();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.SuspendLayout();
//
// comboBox1
//
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Location = new System.Drawing.Point(14, 12);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(204, 20);
this.comboBox1.TabIndex = 0;
this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
//
// tbSearchText
//
this.tbSearchText.Location = new System.Drawing.Point(14, 51);
this.tbSearchText.Name = "tbSearchText";
this.tbSearchText.Size = new System.Drawing.Size(204, 19);
this.tbSearchText.TabIndex = 1;
//
// button1
//
this.button1.Location = new System.Drawing.Point(14, 87);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(204, 31);
this.button1.TabIndex = 2;
this.button1.Text = "検索";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// labelMessage
//
this.labelMessage.AutoSize = true;
this.labelMessage.Location = new System.Drawing.Point(12, 136);
this.labelMessage.Name = "labelMessage";
this.labelMessage.Size = new System.Drawing.Size(136, 12);
this.labelMessage.TabIndex = 3;
this.labelMessage.Text = "最大10件まで表示します。";
//
// listBox1
//
this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.listBox1.FormattingEnabled = true;
this.listBox1.ItemHeight = 12;
this.listBox1.Location = new System.Drawing.Point(235, 12);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(160, 136);
this.listBox1.TabIndex = 4;
this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged);
//
// richTextBox1
//
this.richTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.richTextBox1.Location = new System.Drawing.Point(14, 169);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(381, 241);
this.richTextBox1.TabIndex = 5;
this.richTextBox1.Text = "";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(407, 422);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.labelMessage);
this.Controls.Add(this.button1);
this.Controls.Add(this.tbSearchText);
this.Controls.Add(this.comboBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ComboBox comboBox1;
private System.Windows.Forms.TextBox tbSearchText;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label labelMessage;
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.RichTextBox richTextBox1;
}
}

とりあえずこれで一応の動作はしますが、XMLの扱いがずさんなので、これから学んでいく必要があります。
ともあれ、コーディング中感じたのは、Visual Studioのコード補正と宣言元へのジャンプ機能の強力さ。統合開発環境も使いこなしていきたいです。

C++でMIN以上MAX未満の乱数を生成

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

#include <ctime> // for time()
#include <cstdlib> // for srand(), rand()
#include <iostream>
using namespace std;
#define MIN 10
#define MAX 21
int main()
{
srand(time(NULL)); // 現在時刻を乱数の種の設定
int lucky = MIN + rand() % (MAX - MIN); // MIN以上MAX未満の乱数を生成
cout < < "生成した乱数は" << lucky << "です。n";
for (int i = 0; i< 100; i++) { // 100個生成
cout << MIN + rand() % (MAX - MIN) << " ";
}
return 0;
}

ユーザーに優しくないとね

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

先日、友人が「イメージって大事だよね」と。確か文脈はWebサービス[アプリ]のユーザーインターフェイスは大事ーだったと思う。

ソフ開終了

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

今日はソフトウェア開発技術者試験(SW)を受験してきた。

追記:合格しましたー(^^)b

今春受けた基本情報技術者試験(FE)より難度が高いのですが、先ほどの自己採では午前試験は合格ラインをパスできているようでした。午後Ⅰ、午後Ⅱの解答例の公開は遅いので、もうあとは12月の発表まで待とうかな。

個人的に今回の午後Ⅰは最近の過去問よりやさしかったように思えた(記述分量も少なかったし)。午後ⅡはB木のアルゴリズムだった。これは今週の実験ⅠのTAでもやる内容だったので、後一週間早ければもっと楽に解けたかも。

10月前半は就活、サークル、勉学と全て並行して行ってきたが、ここ3、4日は試験対策に専念した。1つのことに長時間集中するというのは、なんとも充実していていいものだなと久々に思った。ってうか贅沢な時間の使い方だよね。

同時に自分の知識、能力の浅さに気づかされた。学べば学ぶほど知らないことがでて、知りたくなることが増える。その分野の知識体系をまとめたくなる。バリバリの試験対策だったので知識確認に終始し、まとめる時間が取れなかったのはやっていて歯がゆかった。

最近は降ってわいてくるような突発的なタスクが多く、自分の進路を見直す機会があまり取れなかった。

実験のTA

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

情報科学実験の担当かつ私の所属ゼミの教授から、今日突然ソフトウェア実験のTAの依頼を受けた。昨年やった内容で部分々々がおぼろげであったが、得意分野であったのでなんとかこなせた。

学生が制作したソフトウェアの動作確認が主な仕事内容であるが、それ以外に適時質問を受ける。同じ課題を解いているのに、学生のソースコードは十人十色だ。使う関数に大差はなくとも、main 側での呼び出し方や、記憶域の取り方、条件・繰り返し処理の構造など、読んでいて興味深い。良い悪いは別として。

しかし、個別指導形式と異なり大人数を相手にする為、質問のさばき方にはとまどった。

プログラムのバグ修正に関する質問があるのだが、プログラムはほとんど完成した状態でコンパイルも通り、実行の段になって「セグメントエラー」が出るものが多かった。他人の書いたソースを読むのは結構ー力が必要なところがあり、質問者から普通のエディタで添削の申し出を受けた際は、地道にデバックプリントを書き入れバグの箇所を詰めていくのが結果的に効率がよかったりする。

TA初回であったからかもしれないが、1人の学生にどれだけの時間をかけるかの見極めが難しかった。また、授業終了後「あぁ、あの人に○○ってアドバイスしたけれど、△△と説明したほうがよかったかなぁ」など、少々悶々としていた次第であり、来週からはより良くできるよう今の問題点を改善しよう。

セミナーはきっかけ

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

先日はデジハリ秋葉原校の「Ajax体験セミナー」(¥500で2時間)に出席しました。講義形式は本による独学より五感の刺激が多い為、記憶に残りやすいです。また、作ったプログラムを動かしてみて、そこで生じた疑問点をその場で質問することですぐに解決できるのも利点でした。それに、AjaxというGoogle Map のスムーズな画面遷移(非同期通信)にも使われているユーザーインターフェースの構築技術は、兼ねてから興味のあったものなので、今回のセミナーは有意義でした。 内容は、前半がAjax 技術の概要で後半は実際に手を動かして簡単なAjax を用いたページ作成でした。

今日から後期開始

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

てなわけで、初っ端から実験で10時帰りでした。10月まで行うハードウェア実験ではソフトウェアのそれと比較して、「必ずしも書いたコードどおりに動くとは限らない」ってのがあるから(部品の接触不良とか)やり難い印象を受けたが、実験目的自体は興味深く、楽しめそうだった。 さて、レポートとかは早めに仕上げてしまおう。経験上後回しにして良い事など何一つないし。

鈴木 健さん著「究極の会議」

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

今春、情報科学の同好会を友人と立ち上げて以来、ミーティングを頻繁に行うようになってきた。最初のうちは我流で会議の進行などをカバーできていたが、複数のプロジェクトが進み、そして、それに関わる人数が多くなるにつれて、ミーティングで思うような成果が出にくくなっているように感じ始めた。

そこで、この度「Earth Coding-地球を実装せよ」に登壇した鈴木さんの著書「究極の会議」を読んでみた。この本の趣旨は明確で、たった一つである。

会議はその場で議事録を作る為にある

著者はこれを実現する方法を総称して、議事録ドリブンと呼んでおり、その為に 15 のプラクティスを提示している。そして、そのツールとして身近なソフトウェアである、Word, Excel , マインドマップソフトを用いての議事録の作成や、 Web ツール・サービスを用いた情報の共有に関しても具体的に説明されている。

また、この議事録ドリブンが一番向いている会議に「進捗会議」が挙げられている。本の内容を実践するのはこれからなので、今はその成果はわからないが、これまでのミーティングを分析し、問題点を浮き彫りにできたことは、大きな成果である。まぁ、その、その内容はここでは割愛させていただく。

たんぱく質うらない

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

http://u-maker.com/217999.htmlをやってみた。その結果は、

Yuさんはカルモジュリンです! ● カルモジュリンさんは、人懐っこく、敬愛する人にはどこまでもついていくタイプ。一度心を許すと、生涯に渡って変わらぬ友情や愛情を持ち続け、一方的に裏切ることはまずありません。直観力に優れ、聡明で正義感が強いのも特徴です。その分、ちょっぴり融通の効かない部分もありそう。特に周囲から反対されると、妙に頑なになり、内側に閉じこもってしまいがちなので、ある程度の柔軟性を身に付けたいところです。もともとの誠実な人柄に柔軟性が加われば、もっと大きな幸せに恵まれるでしょう。恋愛面ではややオクテですが、友情から次第に恋心を深め、好きな人と満ち足りた関係を築いていけるはず。相手もあなたの良さを理解し、温かく包み込んでくれるでしょう。 ● Yuさんはたんぽぽを育てると幸せになれるでしょう。

たんぽぽ......ねぇ。

Invest myself

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

I went to the bookstore and bought books relevant to investment, programming, and the reference of information technology.I often buy books. It is to say that I invest myself. So I choose them deliberately in order to recover capital.