« 2009年9月 | メイン | 2009年11月 »

2009年10月

2009年10月28日 (水)

サービス System.Windows.Forms.Design.IEventHandlerService は既にサービスコンテナに存在します。

<環境>Windows XP, C# 2008 Express Edition

以下のような警告エラーが出て、デザイン画面が表示できなくなった。

サービス System.Windows.Forms.Design.IEventHandlerService は既にサービスコンテナに存在します。パラメータ名: service Type

原因は、開けなくなったデザイン画面のソースコードに、他のクラスを継承するコードが含まれている辺りにあるらしい。今回の場合は、確かにTreeNodeを継承したクラスを書いていた後で発生した。

解決策としては、Visual C# 2008をいったん終了し、再起動。このエラーが出なくなったが、もしだめな場合は、objectおよびbinフォルダを削除してもう一度コンパイルしてみるとよい。

IEventHandlerService Already Exists in the Service Container にも同様の記載があるので、ご参考に。

2009年10月19日 (月)

c# 親子クラス間の変数の受け渡し

親クラス->子クラスの変数に値をセットする場合。

*オブジェクト生成したあとに、変数をセットすることに注意。

public partial class Papa : Form

{

  public Button1_Click(object sender, EventArgs e)

  {

    bool status = true;

    MyChild dlg = new MyChild(); ・・・子クラスの生成

    dlg.CompleteFlag = status;  ・・・子クラスの変数に値をセット

    // モーダル・ダイアログを表示

    DialogResult dlgRet = dlg.ShowDialog(this);

  }

子クラス側の変数はpublic宣言で、アクセスできるようにしておくこと。

public partial class MyChild : Form

{

  public bool CompleteFlag;

  :

}

子クラス->親子クラスの変数を参照する場合。

子クラスのLoad時に、親クラスの変数を参照して、子クラスの変数にコピーしている例。

private void MyChild_Load(object sender, EventArgs e)

{

double[] MyArray = new double[5];

  ((Papa)this.Owner).PapaArray.CopyTo(MyArray);

 :

}

親クラス側の変数はpublic宣言で、アクセスできるようにしておくこと。

public partial class Papa : Form

{

  public double[] PapaArray = new double[5];

}

クラスオブジェクトのインスタンス渡しで参照という手もあり。

2009年10月14日 (水)

WiresharkでIPv6パケットのキャプチャ

1台のPC上の、windows XPとVMware(CentOS 5インストール済み)の間で、IPv6のパケットキャプチャを行う方法。

実際には2台の別個のPCであってもよいが、リソースが取れないので仮想的に1台で環境を構築し確認。

1.windows IPv6インストール

windows XPはコマンドプロンプトから以下を実行し、IPv6が使えるようにしておく。

> ipv6 install

2.VMwareインストール

VMwareはインストール後、IPv6が使えるようにしておく。CentOSのサイトなどを参照。

VMwareインストール後、VMnet1, VMnet8の2つの仮想ネットワークが追加されるが、VMnet8(NAT用として必要)のみ使用。

3.Wiresharkインストール

IPv6対応パケットキャプチャリングソフトには、無料のWiresharkを使用。windows版は以下からインストーラーをダウンロードしてインストール。

http://www.wireshark.org/download.html

CentOS 5版は、yumでインストール

# yum install wireshark*

4.windows とVMware上のCentOS間疎通確認

それぞれのIPv6アドレスを確認

windows

> ipconfig

:

Ethernet adapter VMware Network Adapter VMnet8:

Connection-specific DNS Suffix . :

IP Address. . . . . . . . . . . . : 192.168.116.1

Subnet Mask . . . . . . . . . . . : 255.255.255.0

IP Address. . . . . . . . . . . . : fe80::AA:BB:CC:DD%4

Default Gateway . . . . . . . . . :

:

CentOS

$ /sbin/ifconfig

eth0 ・・・

inet addr:192.168.116.128 Bcast 192.168.116.255 Mask:255.255.255.0

inet6 addr: fe80::aa:bb:cc:dd/64 Scope:Link

:

windows -> CentOSへの疎通確認

>ping addr: fe80::aa:bb:cc:dd%4

CentOS -> windowsへの疎通確認

$ ping6 -c 3 -I eth0 fe80::AA:BB:CC:DD

*ここで、「fe80::AA:BB:CC:DD」はEthernet adapter VMware Network Adapter VMnet8が示すIP Address

5.Wireshark上でIPv6パケットキャプチャ

WiresharkでVMware Virtual Ethernet Adapter だけをキャプチャするために、フィルタを新規追加

Wiresharkのメニューから、Capture->Options->Capture Fileter: ボタンをクリック

Newボタンをクリックし、以下を追加してOK、Startでキャプチャ開始。同様にCentOS側のWiresharkもフィルタを追加しキャプチャ開始。

Filter name: IP address fe80::AA:BB:CC:DD

Filter string: host fe80::AA:BB:CC:DD

pingコマンドをたたいて、両方のWiresharkでキャプチャした結果が表示されればOK

どんなプロトコルがやり取りされているか知るのは、よい勉強になる。

2009年10月13日 (火)

VC#でTableLayoutPanelを使った動的テーブル生成

<環境>VC#2008 windows XP

Windows フォーム上に動的にテーブルを配置し、その中にラベルやテキストボックスを動的(ダイナミック)に配置して表示する方法。テーブルの下にOKボタンも追加する。

1.テーブルを表示する土台のフォームを作成

2.このフォームロード時に以下のようなコードを追記。

public addTable()

{

InitializeComponent();

// add table

TableLayoutPanel tblLayoutPanel = new TableLayoutPanel();

// set it to be resizable

tblLayoutPanel.AutoSize = true;

tblLayoutPanel.Location = new Point(10, 10);

// set borderstyle

tblLayoutPanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset;

Controls.Add(newtableLayoutPanel);

for(int i=0; i<3; i++){

Label newLabel = new Label();

newLabel.Text = i.ToString();

newLabel.Width = 20;

TextBox newTextB = new TextBox();

newTextB.Width = 150;

newTextB.Text = "item" + i.ToString();

tblLayoutPanel.Controls.Add(newLabel, 0, i);

tblLayoutPanel.Controls.Add(newTextB, 1, i);

}

Button OKButton = new Button();

OKButton.Text = "OK";

OKButton.Location = new Point(10, tblLayoutPanel.Location.Y + tblLayoutPanel.Height + 10);

// add click event

OKButton.Click += new System.EventHandler(this.OKButton_Click);

Controls.Add(OKButton);

:

}

private void OKButton_Click(object sender, EventArgs e)

{

// some procedure

:

this.Close();

}

静的(スタティック)に追加する場合は、

ツールボックス->コンテナからTableLayoutPanelをフォーム上にドラッグ

プロパティのAutoSizeをtrueにしておくこと。

チュートリアル : TableLayoutPanel を使用した Windows フォーム上のコントロールの配置

TableLayoutPanelメソッドについてはmsdn参照

2009年10月10日 (土)

PostgreSQL DB更新に伴う接続不可

<環境> CentOS5 + PostgreSQL 7.x

早朝からDBにつながらないと、監視メールが入ってきていた(トウゼン寝てた!)。

netstat -a やps auxで見るとpgsqlのプロセスはいる。

$ ps aux | grep postmaster

postgres 27778 0.0 0.1 20256 2100 pts/0 S 0x:xx x:xx /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data

/var/log/messages を見ると、以下のようなログが。

Oct 10 04:41:06 www yum: Updated: postgresql-libs.i386 7.4.26-1.el4_8.1

Oct 10 04:41:13 www yum: Updated: postgresql.i386 7.4.26-1.el4_8.1

Oct 10 04:41:17 www yum: Updated: postgresql-server.i386 7.4.26-1.el4_8.1

Oct 10 04:41:26 www postgresql: Starting postgresql service: succeeded

更新後、再起動は上手くいっているらしい。直接コンソールからコマンドつないでみる。

$ psql -U ユーザー名 -p ポート番号 -d DB名

プロセスはいるのにつながらない。

サービス起動プログラムの日付を見る。yum のアップデートに伴い、日付が更新されている。しかも、元のファイルが見当たらない。アップデート時にバックアップされなかったらしい。

# ll /etc/rc.d/init.d/postgresql*

-rwxr-xr-x 1 root root 6954 Oct 9 23:23 /etc/rc.d/init.d/postgresql

ファイルの中身を確認。セキュリティ対策でポート番号を変更していたことを思い出し、設定ファイル /etc/rc.d/init.d/postgresql の該当箇所を変更

# PGPORT=5432 ・・・コメントアウト

PGPORT=xxxx  ・・・DB接続用ポート番号

変更後、PostgreSQL再起動し、ps, netstat正常に起動したことを確認。DBに接続確認。

# service postgresql restart

yumのPostgreSQL 自動更新を止める。手っ取り早いのは/etc/yum.conf のexcludeに追記する方法。

exclude=kernel* postgresql*

yumの設定ファイルをリロードして完了。

# service yum reload

う~ん、しかしアップデートでバックアップを取らずトラブルというのは、bindのnamed.conf以来でした。

2009年10月 6日 (火)

VC++ファイルの再オープンが出来ない

ifstream でオープンしたストリーム(ファイル)をcloseメソッドで閉じたあと、再オープンするとエラーになる件

<環境>VC++2008 Express Edition, windows XP

例)

#include <fstream>

#include <iostream>

using namespace std;

int main(){

ifstream infile;

char statement[128];

infile.open( "C:\temp dir\sample.txt", ios::in );

if ( !infile ) {

cerr << "can not open file" << endl;

return 1;

}

while(!infile.eof()) {

infile.getline(statement,128);

cout << statement << endl;

}

infile.close();

infile.open("C:\downloads\data\etc.txt", ios::in);

if ( !infile ) {

cerr << "can not open file" << endl;

return 1;

}

}

上記の例では、2度目のオープンでエラーになる。

<原因>

EOFまでファイルを読んでいるためEOFフラグがセットされたままになっている。

<対処法>

close()後、エラー/EOFフラグをクリアする。

infile.close();

  infile.clear();

infile.open("C:\downloads\data\etc.txt", ios::in);

:

infile.seekg(0); でファイルポインタを先頭に持っていったのにファイルが読めない、といったケースでも、エラー/EOFフラグのクリアが必要になる。この場合、clear()->seekg(0)の順で実行する必要があることに注意。

2010年3月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

My Favorite Songs

  • My foolish heart
    Bill Evans Trio: Waltz for Deby (★★★★★)