「プログラミング」カテゴリーアーカイブ

Subversionはまりにはまった。

ブラウザからはきちんと見える状態なのに、svn importで

svn: PROPFIND リクエスト (相手: ‘/svn/repos/hoge’) が失敗しました
svn: PROPFIND (URL: ‘/svn/repos/hoge’): 301 Moved Permanently (https://www.hits-net.com)

のようなエラーが出たり、AnkSVNでさっぱりディレクトリが表示されなかったりと。

非常にはまりつつも、いろんなサイトを参考にしつつ、結局Locationに指定したパスが実際に存在するとエラーになるということを発見。

まぁこの場で俺がうだうだ書いても仕方ないので、以下の素晴らしいサイトをご覧ください。

参考サイト:
http://kamakura.cool.ne.jp/oppama/misc/subversion2.html
http://www.hinet.mydns.jp/tdiary/20050317.html

結局抜本的な解決にはなってないが、実際のディレクトリは「repos」でLocationには「repo」としてみた。

結局「SVNParentPath」で実際のディレクトリを通しているのでいけてるっぽいのか?!

やっぱりApacheの設定ももう少し本格的に勉強しないとな~。

この件は時間がある時にきっちり調べてみます。

[サンプル]
https://www.hits-net.com/svn/repo/hoge/
(実際にファイルのあるディレクトリは/[DocumentRoot]/svn/repos/hoge)
https://www.hits-net.com/trac/hoge/

とりあえずsubversionとTracを入れてみた

以下自分用めも

【参考サイト】

http://www.cafechantant.com/blog/2007/08/27/centos5-%E3%81%A7-subversiontrac/
(↑メインはこちらを参考にさせていただいた)

http://oku.edu.mie-u.ac.jp/~okumura/linux/?Subversion

http://blog.clouder.jp/archives/000734.html

http://www.i-act.co.jp/project/products/products.html
(↑Tracの日本語化版の配布元。ありがたい。)

http://espion.just-size.jp/archives/05/297225719.html

 

なんとか動いているものの、最初compatでこけた。

httpd再起動したらなおったけどw

あとは、pythonの問題かな~。egg-cashとか言う奴のパスがいまんとこ、ちょっと嫌なところにある。
/etc/sysconfig/httpdで修正できるらしい。が、これはとりあえず後回し。

Transact-SQLに引っかかる。

いやぁども。

お久しぶりです。

お久しぶりですが、個人メモ。

Transac-SQLで文字から数字へ変換
テーブル Test
data(nvarchar)
———-
01
 010
0003
A
 B
———-

↑のようなめちゃくちゃなデータのテーブルからきれいに値を取りだす。

目指す結果は
Result
——–
1
10
A
B

この場合、数字を一度integerでCASTすることで、頭の空白や0をはずせます、が、CastだとAとBでエラーが出ます。

そこでこんな風に。
select
case when (IsNumeric(data)) = 1 then Cast(data as Integer)
else Ltrim(Rtrim(data))
end as Result
From Test

おっと!ただしコレじゃ「nvarcharをintに変換できません」的なエラーになります。

正直一晩悩みました。

なぜか。

まずこのSQLは特にソートしていませんのでテーブルの上から処理します。

01はisnumericで1が帰ってきます。そこでCastするんですが、このときにエイリアス「Result」の型がintegerに決定されてしまいます。

んだ。こまっただ。

というわけで。

select
case when (IsNumeric(data)) = 1 then str(Cast(data as Integer))
else Ltrim(Rtrim(data))
end as Result
From Test

文字列に変換してやりましょう。

まぁちょっと特殊な事例ですが、誰か困った人の参考にでもなればうれしいです。

あぁまだまだ修行がたりんなぁ。。。

検索:
Transact-SQL Cast IsNumeric Case When nvarcharの値 をデータ型 int に変換できませんでした メッセージ 245 レベル 16

WinPcapではじめるネットワークプログラミング – 2 –

やってしまいました。

ついつい夢中になって気づけばこんな時間。。。

とりあえずサンプル見つつ、自分で書き換えつつ、

パケットひろうところまでは暫定的に理解。

サンプルで非推薦の古い関数が使われていたのでいろいろと置き換え。

新しい関数への置き換え作業のおかげで、だいぶ理解が深まりましたね。

ただし、今は拾うことしか出来ないので、これからIPヘッダやらなんやらの解析の実装が待ってます。

それと拾う部分をうまくスケルトン化したい。

まぁ何が一番困ったかって、

*つけんの?&つけんの?

ってポインタかよ!もっと真面目にCやっとけばよかったなぁ。みたいな。

まぁそれはそれで。VCのおかげで、&つけて型が違うといわれりゃ*にかえちゃえ。みたいな感じで。

はい。ちゃんともっかい勉強します。

それと、サンプルをアップするつもりでしたが、不覚にも眠いので、

また今度にします。

今日感じた一番大きなこと。

MS厨(VB[:ハート:])ですが、

CもたのC!!

あ、はい。寒いですかそうですか。

とりあえずCでうまくサンプルできれば、うまいことC++っぽくOOP化して、

DLL化してVBから呼び出して使う!

最後にゃCOMだよCOM。

COMにしてAccess/Excelから引っ掛けて自動レポーティングでウマー。

月別、日別、プロトコル別あて先別とかでレポートとかだしちゃったりして、

さらにウマー。

うひょひょひょ。

やりたいこと山積み。

後はパケット出す側もほしいなぁ。

というわけで寝ます。

ではでは。又の機会に。

WinPcapではじめるネットワークプログラミング

どうも~。こんにちは。

さてさて、今C++パケットキャプチャの開発を考えています。

半分は授業(C++)の課題制作なんですが。

んで、window用のライブラリwinPcapを使ってみることにします。

お約束:
以下の手順を実行した上でのいかなる損害も補償しません。
自己責任でどうぞ。

~winPcapのサンプルが動くまで~

OS:Windows XP SP2
IDE:Visual Studio.NET 2003
Language:Visual C++
Lib:winPcap 3.1

手順1:winPcapのインストール

http://www.winpcap.org/

↑のサイトから「Get WinPcap」へ進む。

今回winPcapのバージョンは資料やサンプルが豊富なので3.1を使います。

WinPcap auto-installerをダウンロードしてインストール。

これをインストールしないとwinPcapを使用したアプリは動きません。

手順2:開発キットをダウンロードする

先ほどのページから「Development」へ進み、

「WinPcap 3.1 Developer’s Pack」

をダウンロードして解凍。

手順3:Visual Studio .NET 2003 にライブラリの追加

手順2で解凍したフォルダの中のIncludeとLibフォルダの中身を

C:¥Program Files¥Microsoft Visual Studio .NET 2003¥Vc7

のInclude,Libにそれぞれコピー。

正直これはやらなくていいかも知れないですが、ここでコピーしておくと、

間違ってヘッダファイルなどを消してしまう心配がないかと思います。

(VS自体アンインストールしてしまうといみないですが・・・)

ここでコピーしておけば

#include

のように”<>“を使ってincludeできます。

手順3:サンプルのビルドと実行

では実際にビルドしてみましょう。

Visual Studio .NET 2003を起動して、

「新しいプロジェクト」
「Visual C++ プロジェクト」
「Win32」
と進み
「Win32コンソール プロジェクト」

プロジェクト名を入力してOK。

Win32アプリケーションウィザードが表示されるので

「アプリケーションの設定」

で「空のプロジェクト」にチェックを入れて完了。

出来たら、ソースファイルに「sample.c」を追加し、

下記のサンプルコードを入力してみましょう。

/*
#include “pcap.h”
↑手順2でヘッダファイルなどコピーしなかった場合
この場合はしっかりヘッダなど追加して下さい。
(こっちでは試してません。)
*/
#include

/* prototype of the packet handler */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];

/* Retrieve the device list */
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,”Error in pcap_findalldevs: %s¥n”, errbuf);
exit(1);
}

/* Print the list */
for(d=alldevs; d; d=d->next)
{
printf(“%d. %s”, ++i, d->name);
if (d->description)
printf(” (%s)¥n”, d->description);
else
printf(” (No description available)¥n”);
}

if(i==0)
{
printf(“¥nNo interfaces found! Make sure WinPcap is installed.¥n”);
return -1;
}

printf(“Enter the interface number (1-%d):”,i);
scanf(“%d”, &inum);

if(inum < 1 || inum > i)
{
printf(“¥nInterface number out of range.¥n”);
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

/* Jump to the selected adapter */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* Open the device */
/* Open the adapter */
if ((adhandle= pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture.
// 65536 grants that the whole packet will be captured on all the MACs.
1, // promiscuous mode (nonzero means promiscuous)
1000, // read timeout
errbuf // error buffer
)) == NULL)
{
fprintf(stderr,”¥nUnable to open the adapter. %s is not supported by WinPcap¥n”, d->name);
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

printf(“¥nlistening on %s…¥n”, d->description);

/* At this point, we don’t need any more the device list. Free it */
pcap_freealldevs(alldevs);

/* start the capture */
pcap_loop(adhandle, 0, packet_handler, NULL);

pcap_close(adhandle);
return 0;
}

/* Callback function invoked by libpcap for every incoming packet */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct tm *ltime;
char timestr[16];

/* convert the timestamp to readable format */
ltime=localtime(&header->ts.tv_sec);
strftime( timestr, sizeof timestr, “%H:%M:%S”, ltime);

printf(“%s,%.6d len:%d¥n”, timestr, header->ts.tv_usec, header->len);

}

入力し終わったらビルド!

おおおおおおおおおお。

うごかねーーーーーーー。

正直なやみました。

いろいろ調べたところ、wpcap.libをリンカに関連付けしないといけない模様。

というわけで、

1.メニューバーから「プロジェクト」
2.[プロジェクト名]のプロパティ
3.構成プロパティ
4.リンカ
5.入力
6.追加の依存ファイルにwpcap.libと入力。
7.OKを押して再度ビルド

これで動くと思います。

で、このプログラムは何をしてるかというと、

PCにインストールされているネットワークカードを検出し、

そのネットワークカードに流れてきたパケットを拾っているようです。

あ、そうそう。

言い忘れてました。

僕C/C++最高に苦手なんで。

一応コンソールでそれなりのものは作れますが、

やさしいCレベルなんで(^^;;

まぁこれから勉強していきたいと思います。

参考・資料にさせていただいたサイト

WinPcapを使ったプログラミング

ひげぽん OSとか作っちゃうかMona- – WinPcapを試す

そしてwinPcapの日本語ドキュメント

WinPcap Documentation

↑3.0用ですが、かなりありがたいです。
この解説資料を元にいろいろ作っていく感じになります。

参考にさせていただいたサイト様ありがとうございました。

それとスペシャルサンクス

くだすれVisual C++(超初心者用)スレのの550さん

僕と全く同じエラー出てました。

落ちてますのでキャッシュを貼らせていただきます。
こちら

.NETのインターフェースについて。

※以下個人的な覚書です。
情報の正当性や、妥当性は保障しかねます。

普段Interfaceと聞くと、ついついJavaで見かけるようなInterfaceを想像します。

もちろん.NETにもJavaのような使用方法もありますが、

この記事では、インターフェースを型として宣言したり、メソッドの引数にするような使用方法を個人的にまとめます。

[開発環境]:Visual Stdio.NET 2003
[開発言語]:Visual Basic.NET(VB.NET)
[実行環境]:Windows Xp SP2

□Javaのinterfaceと同等のコード
‘Subプロシージャとプロパティを持つインターフェース
Public Interface IMyIF1
Property Msg() As String
Sub ShowMsg()
End Interface

※VB.NETではインターフェースに宣言できるのは、Sub,Functionおよびプロパティのみ。

‘IMyIFを実装した、IFTestクラス
Public Class IFTest
Implements IMyIF1
Private strMsg As String

Public Property Msg() As String Implements IMyIF1.Msg
Get
Return strMsg
End Get
Set(ByVal Value As String)
Me.strMsg = Value
End Set
End Property

Public Sub ShowMsg() Implements IMyIF1.ShowMsg
MsgBox(strMsg)
End Sub
End Class

ここまでのコードを見ると、言語の違いのみでJavaと等価といえます。
ただし、VB.NETに限って言うと、それぞれのプロシージャ、プロパティの
宣言の後に”Implements~”が書かれています。

これにより、実装するクラス側ではInterfaceで宣言したものと異なった名前
をつけることが可能です。

すでにご存知の方もいらっしゃると思いますが、
IDEが優秀なおかげ(?)で、Implements IMyIF1を記述した時点で、
実装コードは自動的に生成されます。

今回は僕が書き加えたのは、
・strMsgの宣言
・プロパティのGet,Setの中身。
・ShowMsgプロシージャの内容
のみです。

□インターフェースを型として宣言する。
まず、通常通りにIFTestクラスのインスタンスを生成してみます。

‘IFTestクラスのインスタンス生成
Dim IFTestObj As New IFTest

当然ながら、プロパティ「Msg」,プロシージャ「ShowMsg」を使用することができます。

次に何も考えずにIMyIF1を型として宣言してみましょう。

‘Interfaceの宣言
Dim IMyIF1Obj As IMyIF1

※InterfaceはNewすることは出来ません。

‘すると以下のように見事Interfaceのプロパティや、プロシージャにアクセスできます。
IMyIF1Obj.Msg = “test”
IMyIF1Obj.ShowMsg()

が、実行すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

というエラーが出ます。
.NET触り始によく出したエラーですね(笑)

ここからが本題です。

上記コードでは、Interfaceのみを宣言した形になります。

ここで魔法の1行。

Dim IFTestObj As New IFTest
Dim IMyIF1Obj As IMyIF1
IMyIF1Obj = IFTestObj
IMyIF1Obj.Msg = “test”
IMyIF1Obj.ShowMsg()

あら不思議。

見事”test”とメッセージボックスが表示されましたね。

ここで僕の大好きな@ITから引用させてもらうと
@IT:連載 オブジェクト指向プログラミング超入門 最終回 オブジェクトをつなぐためのインターフェイス

インターフェイスを実装しているクラスは、そのインターフェイスの型の変数にキャストなしで代入することができます。

ふむふむ。

ここで@ITを呼んで理解できた人はすごい。

正直僕はいまだに理解してません(^^;;

本当にInterfaceを実装していればキャストせずに代入できるのか!?
ためしにもう一つInterfaceを作ってみます。

‘IFTestクラスに新たにShowMsg2を実装させるためのInterface
Public Interface IMyIF2
Sub ShowMsg2()
End Interface

実際にIFTestクラスに実装しましょう。
Public Class IFTest
Implements IMyIF1, IMyIF2
Private strMsg As String

Public Property Msg() As String Implements IMyIF1.Msg
Get
Return strMsg
End Get
Set(ByVal Value As String)
Me.strMsg = Value
End Set
End Property

Public Sub ShowMsg() Implements IMyIF1.ShowMsg
MsgBox(strMsg)
End Sub

Public Sub ShowMsg2() Implements IMyIF2.ShowMsg2
MsgBox(“ShowMsg2:” & strMsg)
End Sub
End Class

結局こんな感じになりました。

それではここから実験。

Dim IFTestObj As New IFTest
Dim IMyIF1Obj As IMyIF1
Dim IMyIF2Obj As IMyIF2

‘IMyIF1
IMyIF1Obj = IFTestObj
IMyIF1Obj.Msg = “test”
IMyIF1Obj.ShowMsg()

‘IMyIF1
IMyIF2Obj = IFTestObj
IMyIF2Obj.ShowMsg2()

どうでしょうか。
なんとなくわかっていただけたでしょうか?

正直本人すらよく分かってないものを一生懸命説明しても仕方ないんですが。。。

説明を書いている過程でひらめくかなと思った次第だったのですが、

あまりひらめきませんでしたorz

とりあえず、個人的なまとめとして、
・Javaのように使うことが出来る。
・Interfaceを実装しているクラスは、実装済みのInterfaceに代入できる。
・代入後、型として指定したInterfaceのメソッドや、プロパティを利用できる。

といったところでしょうか。

良いサンプルでなくて申しわけないのですが。

補足させていただくと、最近MSHTMLをよく触っていまして、
そこにIHTMLDocument,IHTMLDocument2,IHTMLDocument3,IHTMLDocument4,
IHTMLElement,IHTMLElement2などといったたくさんのインターフェースが
あったわけです。

この場合IHTMLDocument系のインターフェースはすべてHTMLDocumentClassというクラスが実装しています。(親クラスとでも言うんでしょうか)

それで何気なく、bodyにアクセスしたいときはIHTMLDocumentをつかうとか、
writeメソッドやwritelnメソッドを使いたいときはIHTMLElement2を使うなど、
適当にいじっていたわけです。

それで、どうも.NETというか、COM(?)のインターフェースは何か違うと感じ、
この記事にいたったわけです。

※もちろん、MSHTMLは8Mほどのファイルを再配布する必要があるので、
TypeクラスやとType.InvokeMembeなど駆使して利用していますが。。。

そのうちMSHTMLを使ったDOMHTMLでのHTML解析のサンプルも載せたいと思います。

最後に・・・

もしこの記事を読まれた方で、誤りを見つけられた方や、ご指摘のある方は、コメントの方へお願いしますm(_ _”m)ペコリ

まだまだ僕も勉強が足りてないなぁと思う今日この頃でした。

ではでは。またの機会に。

すばらしき妄想の世界。

どうも~。こんばんは。

今日は久々にXMLをいじりました。

そいでもって、いつものごとく会社の帰りにいろいろ妄想してたんですが。

画期的なXMLの処理エンジンを作りたい!

たとえばこんなXMLがあります。

<?xml version="1.0" encoding="UTF-8">
<memberlist>
<member no="1">
<name>山中 聡</name>
<age>35</age>
<address>yamanaka@yamanaka.orz</address>
<birth>1986/05/25/</birth>
</member>
</memberlist>

皆さんはぱっと見何のデータだと思いますか?

どうやら個人情報っぽいってのがわかりますよね。

ところが同じ情報を表そうとすると、

<?xml version="1.0" encoding="UTF-8">
<会員名簿>
<山中聡 番号="1">
<年齢>35</年齢>
<連絡先>yamanaka@yamanaka.orz</連絡先>
<誕生日>昭和61年5月25日</誕生日>
</山中聡>
</会員名簿>

とも表せますよね。(正直こんなつくりのXMLは実用性ないけど)

人間にはこの違いを吸収して同じデータとして扱うことが出来るじゃないですか。

つまり何がいいたいかというと、この違いをパーサーレベルで吸収できないなか。

ということです。

はい。

無理です。

正直、僕のXMLの技術が未熟なせいもあり、

構造の変化でプログラムをやたらいじるのがどうも違和感を感じているんですね。

主にDOMを使ってるんですが、

いつものやり方上の方のXMLから名前を取って出力してみます。

(とりあえずPHPで書きます。)

$nodeslist = get_element_by_tagname(“name”);

foreach ($nodeslist as $node){
echo $node->get_content();
]

とまぁこんな感じなんですが。

下の方のXMLから名前を抜き出そうとすると、今度は名前がノード名に

なっているので、ぜんぜん違う方法を取る必要が出てきます。

おまけにこれだとタグ名が変わったり、取り出したいデータが増えるたびに

ソースを改変する必要がありますよね。

もちろん、あらかじめ必要なタグ名を配列に入れておいて、その配列

をループさせながら取得するとい方法もありますが。

それもめんどくさいし、どうせ、こっちでXMLの構造把握しとかないと

使えないわけじゃないですか。
(当たり前っちゃあたりまえですが)

つまり、日付がきたら概ね誕生日とか、入会日とかw

男、女、men,women,male,femaleなら性別。

みたいなXMLの形態素解析?みたいなことをやって、

勝手にいい感じのデータ構造(配列や、ハッシュテーブル)に変えてくれないかな~。

たとえばどちらのXMLを解析させても

$result[“No”] = 1
$result[“名前”] = “山中聡”
$result[“年齢”] = 35
$result[“誕生日”] = “1986/05/25/”

見たいなとっても使いやすいデータになって出せないかな?

とか思ったわけです。

人間だったら可能じゃないですか?

まぁ。実際実現して利用価値があるか?と言われるとありませんし、XMLのノードの親子関係や、兄弟関係などの表現の仕方もあるでしょうし、
実現は厳しいかな?

とりあえず、どんなデータが来ても理解してくれるってのが出来たらおもしろいかな~と。

そしたらコンピュータが大きく人間側に近づけるんじゃないかな?

という妄想です。

妄想ほど、楽しいものはないし、人間特有ではないでしょうか?

自分で言うのも変ですが、こういう妄想を繰り返していくうちに、

不意に新しいアイデアや、既存の問題へのブレークスルーにつながるのでは?

と思った今日この頃でした。

しょーもない上にわかりにくくてすみませんm(_ _”m)ペコリ

ではでは。またの機会に。

MIDP

どうも~。こんばんは。

最近ちょっとずつMIDPをいじってます。

MIDPってのは携帯向けのJavaの使用の一つで、

vodafoneでも採用されています。

これがまた、今までにない感じの言語です。

正直、C,PHP,Java,.NETなどかじってますが、

ぜんぜん違う・・・。

まぁJavaのswingいじったことないので・・・。

正直、UIがこんなにめんどくさいものとは・・・。

やっぱVB見たいにぽんぽんってかんじで作れませんね・・・。

結構苦労してます。

でもまぁ、とりあえず、楽しい♪

また、情報など少しずつ掲載したいなと思います。

.NET系のTipsもちょっとずつたまってきてるので、そっちの方も公開していきたいと、

思います。

ではでは。またの機会に。

ILMerge

どうも~。こんばんは。
 
今日はちょっとそれっぽいブログを書きますね。
 
以前から開発しているツールなんですが、mdbをいじります。
 
ですのでDAOを使っていたんですが、.NETの特性上相互運用なんとかっていうDLL
 
ここでいうと、「Interop.DAO.dll」が実行上必要になります。
 
ただ、どうしてもこれがダサいというか、正直消したいので、いろいろと思案していたんですが、
 
リソースに埋め込む。
dllの中身をソースに書く
exeに抱合させる。
 
などなど。今回上記二つが今のスキルでは多少困難ということで三つ目の方法を取りました。
 
内容としては
 
ILMergeをMicrosoftよりダウンロードおよびインストール。
(いろいろ調べたところ商用利用可能とのことです)
 
コマンドラインより操作し、dllをexeにくっつける。
 
コマンドとしては
(ILmerge.exeの存在するフォルダと同じ階層に抱合したいexe,dllがあるとします。)
 
ilmerge /out:newApp.exe App.exe *.dll /wildcards /v1.1
 
上記のようになります。
 
引数[out]
抱合した新しいexe
 
引数[wildcards]
上記のようにすべてのdllを対象にする場合です。
 
引数[v1.1]
.NET Framwork 1.1 として書き出します。
 
ここで注意したいのは、プライマリアセンブリ(メインのプログラム)の拡張と同じ拡張子で引数[out]
 
を設定することです。
 
これで同じフォルダ階層にnewApp.exeというdllを含んだものが生成されます。
 
ただ僕の場合テスト的にコードに書いていたADODBのコードのせいでエラーが出ました。
 
ですので、不要なコードを削除することで解決しました。
 
ADODBもdllがあるから、それが同じ階層のフォルダにdllがないからかな?
 
許可されない参照:ADODB
 
見たいなエラーです。実際は英語です。Resolve allowなんとか。
 
すみません忘れました。
 
これでdllがexeに含まれるのですっきりしますね。
 
※ILMergeは現在.NET Framework 2.0上でしか動きません。
今回は1.1をターゲットにしていることと、まだ2.0が正式版でないことから、混合させるのが怖かった
ため別のパソコンに2.0をインストールして行いました。
 
注意:上記の内容を実行した結果のいかなる損害も筆者は補償できません。
また、今回筆者の環境でうまく言っただけで、すべての環境でうまくいく保障はありません。
実行は自己責任でお願いします。あくまで、今回筆者がこういう形式で回避したというサンプルです。
 
 
で、調べていくうちにILDSMというツールを見つけました。
 
おそらく.NETに詳しい方なら知っていると思います。
 
これには驚きました。
 
ILコードやCLRヘッダのせいみたいですが。
 
変数名やら関数名、DLLの情報など丸見えです。
 
詳しくは下記の@ITの記事を読んで下さい。
 
わかりやすく説明さています。
 
ちょっと怖いですね。しかもこれが.NET Framework SDKの標準装備だから驚きです。
 
ためしにvectorで.NETで作成されフリーウェアをDLし、開いてみたところ、丸見えでした。
 
そこで調べていくと実は VisualStudio.NETにコードを難読化させるソフト"Dotfuscator"がバンドル
されていました。
有償のものもあるみたいです。
 
難読化っていうのは、簡単な話変数の名前などややこしくしリバースエンジニアリングされたときに
 
読みづらくすることです。
 
まだ使っていませんが、仕上げ段階で使おうと思います。
 
参考:
Dotfuscato
 
ILMerge
 
@IT「.NET逆コンパイラとコードを難読化するDotfuscator」
 
 
まぁ今日気づいたのは、開発するということは、環境を知ることが大事だってことですね。
 
ドンだけすごいロジック作っても、リバースエンジニアリングとかされたら損失出るし、
 
どういう仕組みで動くかもわからずプログラムを組むっていうのが危険なことかというのが
 
思い知らせれました。
 
もっと勉強しなくては・・・・。
 
ではでは。
明日のテスト勉強します!
オラクルとC!
 
それでは。またの機会に。