ASP.NET2.0の事前コンパイル方法

2006-01-26
このエントリーをはてなブックマークに追加

VisualWebDeveloperを使うと、ビルドしても実行時コンパイルでしかない。VS2003ではビルドすればDLLが生成され、配布時にはそれを配置しておけばよかったのだが、はてさて。まさか実行時コンパイルしかできないなんて寂しい仕様なわけはあるまいに。

で、色々調べてみますと、どうやらコマンドラインでコンパイルするらしい。

C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_compiler.exe

環境によってパスは違うかもしれないが、たいていはここでしょう。

C:WINDOWSMicrosoft.NETFrameworkv2.0.50727>aspnet_compiler -v /hoge -p C:InetpubwwwrootWebSite1 C:InetpubwwwrootBin

-vが、仮想ディレクトリの指定
-pが、ソースのあるディレクトリとコンパイルしたプロジェクトを出力するディレクトリ

「hoge」という仮想ディレクトリを作成しておきます。「C:InetpubwwwrootWebSite1」にソースが配置されています。僕の場合は、「hoge」のローカルパスが「C:InetpubwwwrootWebSite1」になっているということです。

「C:InetpubwwwrootBin」というフォルダを作成しておきます。これはもしかするとフォルダが存在しない場合は自動で生成してくれるかもしれません。

で、上記コマンドをコマンドプロンプトから実行すると、「C:InetpubwwwrootBin」にDLLとその他もろもろが生成されるという仕組みです。

実際にやってみればわかると思いますが、VS2003の時はASPXファイルだけは残ったもんですが、ASP.NET2.0になると、ASPXファイルは残骸(マーカーファイルというらしい)のみです。ASPXまでコンパイルされてしまうので、デザイン変更だけでも再コンパイルが必要という、JavaServlet並みのメンテナンス性の悪さです。

製品版では改善されているのでしょうか…。

.NET2.0でのデータベースコネクション

2006-01-26
このエントリーをはてなブックマークに追加

VisualWebDeveloperとSQLServerExpressを使ってASP.NET2.0を試しているのだが、論外な部分でつまずいてしまった。

というかSQLServerExpress側の問題だったのだが、何にも気にしないでインストールしたらインスタンスを勝手に作られてしまったのである。おかげで、サーバ名だけ指定してコネクションしようとすると、「そんなやついねぇよ」と怒られてしまい、つながせてくれないのだ。

_conn.ConnectionString = “Data Source=localhost\sqlexpress;user=ユーザ名;password=パスワード;Initial Catalog=データベース名”;

ASP.NET側の基本的な部分は変更なし。

多分、インストール時の設定しだいでインスタンス作成しないでデータベースサーバを作ることも可能なんでしょうね。ちょっと後日調べてみますわ。

SEO

2006-01-21
このエントリーをはてなブックマークに追加

SEO、Search Engine Optimization、検索エンジン最適化。
ここ数年流行った言葉です。

正直、ミーハーくさくて嫌いです。
(SEO業者の皆さん、ごめんなさい、個人的な意見ですので、怒らないでください)

もともと、IT業界の連中はなんでもアルファベットに略したり、カタカナ言葉使いたがったり、「美しい日本語」を馬鹿にしているような気がする。

ま、きっと正しい日本語が使えないんだろう。

なんて話はさておき、個人で請けている仕事で、webサイトをふたつほど構築した。両方とも、特に特殊ではないキーワードでGoogleで一番上にヒットするようになった。

僕は技術者ではあるが、webの専門家ではない。SEOのプロフェッショナルでもない。でも、期待の結果を得ることができた。

ポイントは簡単、正しいHTMLを書き、正しい文章、正しい説明を書くこと。伝えたいことを明確にし、見出しには、「何を伝えようとしているか」を明確に記述する。

それだけである。

SEOのテクニックで、成功報酬何百万円なんていう話もよくあるが、そんな業者に依頼するよりも、「正しい日本語の書き方、正確に自分の意思を相手に伝える方法」を学んだ方がいい結果が得られるような気がした今日この頃でした。

C#でのメール受信

2006-01-20
このエントリーをはてなブックマークに追加

はじめてこれを書いたときは、まだまだPOPのサンプルとかってほとんどなかったのに、最近いろんなとこで公開されてるなぁ。C#もだいぶこなれてきたかな。

大事なことは、メールの送受信の方法ではありません。
ソケットプログラミングの基礎を知ること、それとPOPコマンドを知ることです。

ソケットプログラミングを覚えると、FTPソフトなんかも作れるようになりますよ。

using System.Net;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Diagnostics;

private void button1_Click(object sender, System.EventArgs e)
{
//POPサーバと接続、ストリームを開く
TcpClient pop3Conn = new TcpClient(“メールサーバ”,110);
NetworkStream pop3Stream = pop3Conn.GetStream();

StreamReader stmReader = new StreamReader(pop3Stream);
Debug.WriteLine(ReadStreamLine(stmReader));

//ユーザ名を送信
SendStream(pop3Stream,”USER アカウントrn”);
Debug.WriteLine(ReadStreamLine(stmReader));

//パスワードを送信
SendStream(pop3Stream,”PASS パスワードrn”);
Debug.WriteLine(ReadStreamLine(stmReader));

//メールの件数を取得
SendStream(pop3Stream,”STATrn”);
string[] strMailCount = ReadStreamLine(stmReader).Split(‘ ‘);
int intMailCount = int.Parse(strMailCount[1]);

//メール本文の取得、件数分ループさせる
for (int i=1;i<=intMailCount;i++)
{
//i件目のメールをちょうだいというコマンドを送信
SendStream(pop3Stream,”RETR ” + i + “rn”);

string strBody = ReadStreamToEnd(stmReader);
Debug.Write(strBody);
}

//終了コマンドの送信
SendStream(pop3Stream,”QUITrn”);
Debug.WriteLine(ReadStreamLine(stmReader));

//ストリームを閉じる
pop3Stream.Close();
//サーバとの接続を閉じる
pop3Conn.Close();
}
private void SendStream(Stream pop3Stream, string strSendString)
{
//コマンドをバイト配列にしてストリームに流す
byte[] ByteData = Encoding.Unicode.GetBytes(strSendString);
int intByteDataCount = Encoding.Unicode.GetByteCount(strSendString);

pop3Stream.Write(ByteData,0,intByteDataCount);
}

private string ReadStreamLine(TextReader txtReader)
{
return txtReader.ReadLine() + “rn”;
}

private string ReadStreamToEnd(TextReader txtReader)
{
//本文開始のフラグ
bool blFlg = false;

//本文を作成するStringBuilder。stringに += していくのは効率悪い
StringBuilder strReturn = new StringBuilder();

//読み込んだ一行
string strBuffer;

//読み込んだ文字列のバイト配列
byte[] ByteData;

//配列数
int intByteDataCount;

while(true)
{
strBuffer = txtReader.ReadLine();
//”.”が来たら終了、メール1件の最後には必ずこれがついている
if (strBuffer.Equals(“.”)) break;

//ヘッダ部分と本文の境目は空白一行あるだけ。
//一行ずつ読んでいって、ここに来たらフラグを立てる
if (strBuffer.Length.Equals(0))
{
blFlg = true;
}

//フラグたってたら本文開始ということで、読み込み始める
if (blFlg)
{
ByteData = Encoding.ASCII.GetBytes(strBuffer);
intByteDataCount = Encoding.ASCII.GetByteCount(strBuffer);
strReturn.Append(Encoding.GetEncoding(“iso-2022-jp”).GetString(ByteData,0,intByteDataCount) + “rn”);
}
}

//StringBuilderをstringに変換して返す
return strReturn.ToString();
}

Tags:

実行している自分自身のパスを取得する

2006-01-16
このエントリーをはてなブックマークに追加

自分の居場所を知るのに使う

DirectoryInfo dirCurrent= new DirectoryInfo(“.”) ;
dirCurrent.FullName + “hoge.exe”;

だと、例えばデスクトップにショートカットを作成し、
そのショートカットをダブルクリックした場合はデスクトップ上の「hoge.exe」を指してしまう。
「現在イベントの起きたところ」という意味合いだろうか。

今回使ったのはこれ

Application.StartupPath

まさしく、アプリケーションの実行ファイルの位置を示してくれた。

Tags:

ディレクトリのサイズを求めるメソッド

2006-01-09
このエントリーをはてなブックマークに追加

ディレクトリのサイズを一発で求めるメソッドはなかった。
つまり、ディレクトリのサイズを求めるには、そのディレクトリ内のすべてのファイルサイズを加算していく必要がある。
FTPコマンドでディレクトリサイズもとめる方法と同じである。
APIを直叩きすれば別の方法があるのかもしれないが、C#としてはこれが簡単であろう。

public long GetDirSize(DirectoryInfo dirBaseDir)
{
    long lngDirSize = 0;
    //ターゲットディレクトリのすべてのファイルの加算
    foreach (FileInfo filFilesInDir in dirBaseDir.GetFiles())
    {
        lngDirSize += filFilesInDir.Length;
    }
    //ターゲットディレクトリのすべてのディレクトリの加算
    foreach (DirectoryInfo dirDirInBaseDir in dirBaseDir.GetDirectories())
    {
        lngDirSize += GetDirSize(dirDirInBaseDir);
    }

    return lngDirSize;
}

Tags: