C#でPCのMACアドレスを取得する方法

 C#でPCのMACアドレスを取得する方法には、色々あるようだが、iphlpapi.dllをコールするのが良さそうだ。但しiphlpapi.dllの出所がはっきりしないという説もあるのだが。取りあえず自分のマシン(Win2k Pro)では動作した。
 C#でdllを呼び出すには、事前にAPIの宣言が必要になる。
 Windows API は C 言語から呼び出せるように設計されていて、オブジェクト思考の立場から見れば、それは常に public static なメソッドなわけである。またC# 言語では外部メソッドを呼び出す場合、必ず、メソッドに extern 修飾子を指定しなければなないので、iphlpapi.dllのSendARP関数を呼び出すには次のようになる。


using System.Runtime.InteropServices;

namespace Network_Sample01
{
public partial class Form1 : Form
{
    [DllImport("iphlpapi.dll", ExactSpelling = true)]
    public static extern int SendARP(int DestIP,int SrcIP, byte[] pMacAddr, ref int PhyAddrLen);


 このSendARPを呼び出してMACアドレスを取得するの例だが、フォームにtextBox1とtextBox2とbutton1を配置して、button1のクリックイベントに次のように処理を入れる。


private void button1_Click(object sender, EventArgs e)
{

    try
    {
        IPAddress addr = IPAddress.Parse(textBox1.Text);

        byte[] bytMacAdr = new byte[6];
        int len = bytMacAdr.Length;
        int intMacAdr = BitConverter.ToInt32(addr.GetAddressBytes(), 0);
        int r = SendARP(intMacAdr, 0, bytMacAdr, ref len);

        textBox2.Text = BitConverter.ToString(bytMacAdr, 0, 6);
    }
    catch (Exception)
    {
        textBox2.Text = “ERROR!”;
    }
}


 実行結果は上図のようである。ついでなのでホスト名からIPアドレスを取得するルーチンも実装してみた。ソースコードは下記URLからダウンロードできる。

■プログラムのダウンロード(networksample01.zip)

電子認証の方法を考える

 印鑑印影作成ソフトを作っているのだが、その印鑑を間違いなく本人が押印したということを証明するのは意外に難しい。Excelなどで作った申請書に上司が自分の印影画像を貼り付けて承認するという図はよくある光景だとは思うが、簡単に偽造されてしまうということは想像に難くない。
 PDFファイルについてはどうだろう?Excelとあまり変わらないと思われるかも知れないが、意外に信頼性はアップするかもしれない。
 PDFには、画像を貼り付けるときの属性でAnnotation(注釈)というプロパティがある。場合によってはここにURLを貼り付けてやることも可能である。このURLを認証サーバー宛にして、押印者を特定するIDと押印日付をポストすると言う方法で、その認印の信頼性を保障するという方法なら意外といけるかも知れない。
 例えば、下図のPDFファイルのAnnotationは、コンピュータのMACアドレスと押印日付・時刻をポストするように印影イメージに付加したものである。

 もちろんこのPDFに押印したときに、本人が押印したことを認証サーバーに通知してやる必要があるのだが、オフラインのときはせめてイベントログに残しておくとか、オンライン時に認証されていない認印をサーバーに通知するという作業が必要だとは思う。実は自分の作成した「印刷印影ソフト Stamp It!」は認証サーバーへの通知部分は除いて、既にこの辺りまではプログラムに実装されている。
 ところでダイヤルアップ接続時の場合はMACアドレスってどうなるのだろうか?イーモバイルの場合はどうだろうか?PCを世界で唯一無二と識別させるのはけっこう難しい。

C#でGhostscriptを使ってPDFのページイメージをJpegファイルに保存する方法

 Ghostscriptは、PDFファイルなどの画像ファイル変換には大変有益なソフトだが、いかんせんコマンドラインから実行しなければいけないというのが最大のネック。
 このGhostscriptを扱いやすいように画像変換ソフトなどのGUIのアプリケーションにして活かせないかと考えてみた。それをC#で書いたらどうなるのかというと、先ずはコマンドライン上のパラメータも含めて全て外部アプリケーションを起動するやり方で呼び出せば良いというわけだ。例えば下の通り


// — Ghostscriptによるpdf=>jpg変換
// — 対象PDFパス
string strPdfPath = "C:\\Work\\Test001.pdf";
// — Ghostscriptのパス
string strGSPath = "C:\\gs\\gs8.63\\bin\\gswin32c.exe";
int intFirstPage = 1; // — 先頭ページ
int intLastPage = 5; // — 最終ページ
Process extProcess = new Process();
// — 起動するGhostscriptのパスを指定
extProcess.StartInfo.FileName = strGSPath;
extProcess.StartInfo.Arguments = " -dSAFER";
extProcess.StartInfo.Arguments += " -dBATCH";
extProcess.StartInfo.Arguments += " -dNOPAUSE";
extProcess.StartInfo.Arguments += " -sDEVICE=jpeg";
// — 解像度指定
extProcess.StartInfo.Arguments += " -r72";
// — 出力ファイル名
extProcess.StartInfo.Arguments += " -sOutputFile=temp%03d.jpg";
// — 先頭ページ指定
extProcess.StartInfo.Arguments += " -dFirstPage=" + intFirstPage;
// — 最終ページ指定
extProcess.StartInfo.Arguments += " -dLastPage=" + intLastPage;
// — 入力Pdfファイルのパス指定
extProcess.StartInfo.Arguments += " " + strPdfPath;
// — 新しいウィンドウで起動
extProcess.StartInfo.CreateNoWindow = true;
// — シェル不使用
extProcess.StartInfo.UseShellExecute = false;
// — プロセス開始
extProcess.Start();
// — プロセス終了まで待つ
extProcess.WaitForExit();
// — 後片付け
extProcess.Dispose();


 一応、これはGhostscriptがインストールされていることが前提である。
 これはこれで特に問題はないのだが、さらに突き進んでGhostscriptの心臓部であるgsdll32.dllを直接コールする方法については、現在模索中である。

プラグイン第二弾はSolaris対応で

これまでうちのエンドユーザさんはLinuxが中心、WindowsやMacが少々って感じだったんだけど、Solarisユーザも加わって、そっち方向のスキルも蓄積され始めました。

基本的には、x86版のOpen Solarisでだいたいのことはわかっていたんだけど、どうしたってSPARCプロセッサのマシンにも馴染んでおきたいのは人情です。

で、私物で買っちゃいました(^^;; Sun SPARCの中古サーバ\(^O^)/

なんと格安4980円(爆)

 

で、届いてみれば、付いているはずの内蔵CD-ROMドライブは入っていないし、コネクタが特殊だから他のマシンのIDE CD-ROMドライブは繋がらないし….まぁ、幸いSCSIインターフェースがあったから、古~いSCSIーCDROMドライブをつないで、なんとかSolaris 10をインストールして使えるようになりました。

 

使えるようになりゃ、なにかプログラムを作ってみたいのも人情ってもんで、Linuxで作っていたプラグインの第二弾を早速移植してみました。

普通に動くよぉ!! (結構感動)

gccを入れてもパスは通っていないし、makeもそうだし、癖はあるけど全然OKです。

MacのPowerPCにも移植して、こっちもOK!

あとはWindowsとか、x86版Solarisなんかも行けそうなんだけど、ネックが一つ!

うちの会社には、IntelのMacがないんだなぁ(^^;;

これも私物で買っちゃうことになるんだろうか(汗)

印鑑印影作成ソフト Stamp It! 製品版出来ました!

 JSOX-Quick Audit Standalone版の開発のからみで印鑑印影作成ソフトの作成を、昨年末からやっておりましたが、とうとう世に出しても恥ずかしくは無い程度の完成度のものが出来上がりました。


 上の図がプログラムのメイン画面なんですが、印鑑の種類としては丸判、角判、丸判日付印、角判日付印の4種類。大きさや文字位置、枠の太さなどが微調整できるようになっています。そして最大の売りは「PDFファイルにハンコが押せること」でしょうか。印鑑印影作成ソフトはフリーのものを含め、けっこう出ているのですが、PDFに印鑑が押せるのはそうはないと思います。


 もちろんユーザーさんが作成したPNG形式の画像だったら印鑑印影の登録が出来て、同じようにPDFファイルに押印することが出来ます。ですから印鑑印影に限らず、よくある「コピー禁止」などの透かし画像とかをPDFに埋め込みたいときは、このソフトを使えば簡単に画像を埋め込むことが出来るというわけです。


 一応、今のところお試し期間ということで、60日間は無料でお試しできるようになっていますが、まだはっきりお値段が決まってないんですよね。


 簡単に編集できないPDFで稟議書とか申請書を利用して電子認証をやっている会社さんには朗報だと思うんですが、いかがでしょうか?

やっぱCにして良かった

社内のCGPに新開発のプラグインを入れて速度試験をしていてつくづく思った。

やっぱ、Cっしょ!

2296回の暗号化ヘッダ追加処理で、CPU使用時間の総計は0.20秒!

1回当たり、0.087ミリ秒だもんね。

100万分の87秒って無意味に短い処理時間だけど、Perlとかじゃこうはいかないよなぁ

鉄道ヲタクはてっちゃん、バスおたくは?

 そういえば、バス運行表をPerl言語でウェブ整形表示するプログラムを書いているとき、バスの運行表をウェブで公開している会社はどのくらいあるんだろうと調べていると、すごく面白いサイトを見つけてしまった。いわゆるバスマニアというかバスおたくが公開しているサイトである。何がすごいって、「○○観光の車番□□番のバスは平成?年頃廃車になった」とか、「□□にある車庫は平成?年頃廃止された」とか、やたらと細かい。しかも各バス会社が所有しているバスの写真は当たり前、車両ナンバーまで掲載されているという凝りようである。それゆえ廃車してナンバーの取れたバスの外観だけをみて「これは栃木22う○□×△である」とか判別が付いてしまう。
 しかもそのバスおたくはどうも栃木県人であるらしい。というのは栃木県のバス事情に特に詳しいからである。関東のバス会社のみならず、東北のバス会社まで一部掲載されている。一体その取材力はどうやって発揮されるのだろうかと疑問に思ってしまった。
 鉄道ヲタクはてっちゃん、バスおたくは何ていうのだろうか?その方のハンドルネームは「サルビア」といい、下のURLがそのサイトである。

■栃木のバス資料館」
http://kitabus.net/

連休中にPerl言語の学習(バス運行表)

 この3連休中に普段は使わないプログラミング言語の勉強がてら、ビジネスにならないかと思ってPerl言語でとあるバス会社のバスの運行表を表示するプログラムを書いてみた。なぜバスの運行表かというと、そのバス会社の公式サイトに掲載されているバス運行表がスキャンされたただのPDFファイルで、解像度も良くなく見辛かったからである。
 各地域・エリア番号を設定し、エリアを選択すると路線を選択し、目的の運行表が表示されるという仕組みである。取りあえず今回はエリアを限定し、路線を選択し、CSV形式の運行表を整形して表示するサンプルを作ってみた。
 ゆくゆくは、このCSV形式のデータの入力をウェブ上で入力できるようにして管理できるようにしてみたい。ついでに携帯電話から検索できるようにするのも良いかもしれない。そうしたらバス会社に売れるだろうか?
 それにしても慣れない言語は、デバッグに時間が掛かる。例えばPerlの場合、HTML文書を表示するようにするためには、ウェブブラウザに”Content-type”を教えてやらなければならないのだが、行末に¥n¥nと改行コードを2つ付けてやらなければならない。「Content-type を指定した次の行は空行でなければならない、という規則」があるからなのだが、改行コードが1つしかなかったのでCGIエラーで、何度も表示に失敗して嵌ってしまっていた。PHPではあまり意識していなかったので、すっかり忘れていたのだ。

■バスの運行表のサンプル
http://hpcgi3.nifty.com/sunaolabo/select_line.cgi

※ちなみ1本の路線しかデータは入れていないのであしからず。
※運行表には誤りがあるかもしれません。本家本元の公式のサイトでご確認下さい。

CGPプラグイン開発

前々から機会があればやろうと思っていたけど、雑務に流されてできなかった、CGPのプラグイン作り!

やってみるとこれが結構楽しい。

基本的に、CGPからたたき起こされて動きっぱなしになるプロセスが、ずーっと標準入力を待っている..というスタンスで作るんです。

親プロセスたるCGPから、プラグインの標準入力に、そのコマンドのID、コマンド名、パラメータを受け取り、それに関する適切な応答を、標準出力に返す..という作りにするだけで動きます。

 

そのコマンドから、パラメータとしてキューのファイル名を受け取れるので、キューのファイル内を調べて何らかの処理をすれば、結構好きなことが出来ます。

受信後のメールのファイルになっちゃうと失われてしまうエンベロープの中身が、キューのファイルには入っているので、それを調べて出来るようなことを、独自に組み込めるわけですね。

 

今回は、エンベロープのTOアドレスを、全て読み出して、それを結合した後で、暗号化を行い、暗号化した全てのTOを、独自ヘッダに埋め込むプラグインを作りました。

 

どういう意味があるのかって?

エンベロープのTOを見れば、BCCの宛先も読めるわけですよ。

最近じゃ、内部統制がどうとかで、メールをぜーんぶアーカイブしてくれってお客さんも多くて、ぜーんぶアーカイブしたものがどこに送られたかも、全て知りたいって要求があるんですわ

かといって、BCCの中身を読めるようにして付けちゃったらBCCの意味がなくなっちゃうから、暗号化して読めなくして、キーを知っている管理者さんだけが読めるようにするわけ

 

でもね、お客さんの中には、日量20万通ぐらいのメールを送受信しているところもあるし、暗号化も含め、やっぱ超高速じゃなきゃ嫌でしょ! ….ってことで、C言語ですっかすか速く動く奴に仕上げました。

CGPのフリーのプラグインって、Perlの奴が多いけど、やっぱCだよねぇ~!!

 

で、これを国内初のプラグイン製品として、売り出そうって話もあるんで、どう紹介しようか悩んでるんだよね

CGPのアーカイブソリューションは、仕組みを熟知していれば、お手軽にいろいろ仕上げられるんだけど、それをどうやってわかりやすく説明しようかってね

商品名だってわかりやすくしたいし!

前に「Open BCC」なんて冗談で言ったんだけど、どうなるのかなぁ

作った本人としては、Linux版のデコーダーソフトやWebデコーダーページも含めて格安提供して、たくさんの人に使ってみてもらいたいんだよね

Aidexer v1.0.0 リリース

開発開始当初に社内向けに約束した、11月中β版リリース、12月製品版リリースというスケジュールは何とか守れました。

毎週金曜日の23時40分に、社内の検索対象ディレクトリにある55万ファイルのインデックス更新を動かしているんだけど、翌朝4時前には毎週終わっているし、55万ファイルの巡回時間で4時間20分ってのは、毎日巡回に耐えると言っていいのかなぁ?

でも、これ、うちの会社はファイルサーバもAidexerもギガビット接続だし、100Mbpsでできあがっている所じゃ辛いかもねぇ

まぁ、Aidexerの能率があんまり上がると、ファイルサーバの応答速度を食ってでも全力で巡回しちゃうから、日中に巡回バリバリって状況は避けたいし、やっぱり毎週末の実行がおすすめですね!

そうそう、最初の1回目の巡回は結構時間かかるから、うちぐらいの規模だと、全域サムネイル生成・全文検索インデックス作成が終わるまで、1週間近い巡回が必要になるでしょう。その間も、巡回を終えたところから順に検索は出来るけど、巡回中はやっぱりそれなりに検索は重くなります。

nice値を設定し直して、巡回側プログラムは低いプライオリティで動いてはいるけど、どうしてもディスクI/Oの多さは避けられないし、やっぱ、導入後の最初の巡回を終えてからが、Aidexerの本領発揮って感じでしょうかね!