<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>開発者の談話室</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/" />
    <link rel="self" type="application/atom+xml" href="http://www.agile-tech.com/blogs/dev/atom.xml" />
    <id>tag:www.agile-tech.com,2007-11-06:/blogs/dev//4</id>
    <updated>2009-09-29T11:09:44Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Open Source 4.1</generator>

<entry>
    <title>携帯でGoogleAnalytics (ASP.NET編)</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2009/09/googleanalytics-aspnet.html" />
    <id>tag:www.agile-tech.com,2009:/blogs/dev//4.526</id>

    <published>2009-09-29T09:43:39Z</published>
    <updated>2009-09-29T11:09:44Z</updated>

    <summary>GoogleAnalyticsは携帯では利用できません。これは、Javascriptを使って計測サーバに画面表示情報を送信しているためです。

ですが、携帯からのアクセス時にサーバから直接HTTPリクエストを送信すれば、アクセス数を計測可能になります。しかし、この方法はアクセス数の多いサーバですと、サーバ負荷が増大するのであまりオススメできません。
</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term=".Net" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="携帯" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="aspnet" label="ASP.NET" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="携帯" label="携帯" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="c" label="C#" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="googleanalysis" label="GoogleAnalysis" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>GoogleAnalyticsは携帯では利用できません。これは、Javascriptを使って計測サーバに画面表示情報を送信しているためです。</p>
<p>ですが、携帯からのアクセス時にサーバから直接HTTPリクエストを送信すれば、アクセス数を計測可能になります。しかし、この方法はアクセス数の多いサーバですと、サーバ負荷が増大するのであまりオススメできません。</p>
<p>秒間1000アクセス以上ある場合は、Googleへ携帯端末からアクセス情報を送るためのimgタグを自動生成する方法が望ましいです。</p>
<blockquote>
<p><span style="font-size: 60%">&nbsp;&lt;%= this.GetGoogleAnalyticsImageTag( &quot;UA-0000-00&quot;, &quot;your.domain.mobi&quot; ); &gt;<br />
&lt;script runat=&quot;server&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// <br />
&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;utmac&quot;&gt;登録番号 UA-XXXXX-XXXX&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;utmhn&quot;&gt;ドメイン&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp; public string GetGoogleAnalyticsImageTag( string utmac, string utmhn ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Random rand = new Random( (int)DateTime.Now.Ticks );</span></p>
<p><span style="font-size: 80%"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long win_time = DateTime.Now.ToFileTime();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 現在時刻<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long unix_time = ( win_time - 116444735995904000 ) / 1000000;&nbsp;&nbsp; // FileTimeからUnixTimeに変換<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string today = unix_time.ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string referer = &quot;-&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( Request.UrlReferrer != null ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; referer = Request.UrlReferrer.AbsoluteUri;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string utmp = Request.Url.AbsoluteUri;</span></p>
<p><span style="font-size: 80%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string utmn = rand.Next( 1000000000, 2147483647 ).ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string cookie = Session.SessionID;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string random = rand.Next( 1000000000, 2147483647 ).ToString();</span></p>
<p><span style="font-size: 80%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string uservar = &quot;-&quot;;</span></p>
<p><span style="font-size: 80%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string useragent = &quot;Unknown&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( Request.UserAgent != null ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; useragent = Request.UserAgent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 80%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string requrl =<br />
&nbsp;&nbsp;&quot;http://www.google-analytics.com/__utm.gif?&quot; +<br />
&nbsp;&nbsp;&nbsp;&quot;utmwv=1&quot; +&nbsp;&nbsp;&nbsp;&nbsp; // version<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&amp;utmn=&quot; + utmn +&nbsp; // 複数送信のブロック<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&amp;utmsr=-&quot; +<br />
&nbsp;&nbsp;&nbsp;&quot;&amp;utmsc=-&quot; +<br />
&nbsp;&nbsp;&nbsp;&quot;&amp;utmul=-&quot; +<br />
&nbsp;&nbsp;&nbsp;&quot;&amp;utmje=0&quot; +<br />
&nbsp;&nbsp;&nbsp;&quot;&amp;utmfl=-&quot; +<br />
&nbsp;&nbsp;&nbsp;&quot;&amp;utmdt=-&quot; +&nbsp;&nbsp;&nbsp; // ページタイトル<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&amp;utmcs=-&quot; +&nbsp;&nbsp;&nbsp; // Character Encoding&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&amp;utmhn=&quot; + utmhn +<br />
&nbsp;&nbsp;&nbsp;&quot;&amp;utmr=&quot; + referer +<br />
&nbsp;&nbsp;&nbsp;&quot;&amp;utmp=&quot; + utmp +<br />
&nbsp;&nbsp;&nbsp;&quot;&amp;utmac=&quot; + utmac +<br />
&nbsp;&nbsp;&nbsp;&quot;&amp;utmcc=__utma%3D&quot; + cookie + // 端末識別<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;.&quot; + random + // <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;.&quot; + today + // 初回訪問時刻<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;.&quot; + today + // 前回訪問時刻<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;.&quot; + today + // 現在時刻<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;.2%3B%2B__utmb%3D&quot; + cookie + // 下位互換性維持？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;%3B%2B__utmc%3D&quot; + cookie +&nbsp; // 下位互換性維持？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;%3B%2B__utmz%3D&quot; + cookie +&nbsp; // 下位互換性維持？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;.&quot; + today +<br />
&nbsp;&nbsp;&nbsp;&quot;.2.2.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)%3B%2B__utmv%3D&quot; + cookie +<br />
&nbsp;&nbsp;&nbsp;&quot;.&quot; + uservar + &quot;%3B&quot;;&nbsp; // user defined variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p><span style="font-size: 80%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format( @&quot;&lt;img src=&quot;&quot;{0}&quot;&quot; width=&quot;&quot;1&quot;&quot; height=&quot;&quot;1&quot;&quot; /&gt;&quot;, requrl );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&lt;/script&gt;<br />
&nbsp;</span></p>
</blockquote>
<p>イメージタグを出力するので、SSLページでは計測できません。SSLページでの計測は、やはりサーバから直接Googleの計測サーバにデータ送信するしかありません。</p>]]>
        
    </content>
</entry>

<entry>
    <title>ウェブページのサムネイル画像取得プログラム【.Net】</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2008/11/net.html" />
    <id>tag:www.agile-tech.com,2008:/blogs/dev//4.486</id>

    <published>2008-11-06T04:35:36Z</published>
    <updated>2008-11-06T06:43:02Z</updated>

    <summary>動的にリンク先を生成するWebアプリケーションの場合、任意のWebページのスナップショットをプログラムでリアルタイムに生成する必要があります。外部のWebサービスを使うのでは少し不安になります。プログラマであれば、自前プログラムからWebページサムネイルを生成できるようにしたくなります。</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term=".Net" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="サムネイル" label="サムネイル" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="スナップショット" label="スナップショット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="画像" label="画像" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="snapshot" label="Snapshot" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="thumbnail" label="thumbnail" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="webページ" label="Webページ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>昨年あたりいくつかのWebサービスが発表されてから国内でも使われる事例が増えてきました。伊藤 将雄さんの<a href="http://img.simpleapi.net/">Simple API</a>を先駆けに、いくつも提供されています。<a href="http://blog.boreal-kiss.com/2007/12/12101515.html">Webページスナップショット比較サイト</a>、<a href="http://dragon.jp/column/archives/miyanaga_060601.html">キャプチャを極める完全ガイド</a></p><p style="text-align: center">実際にだしてみるとこんな感じです&darr;(By <a href="http://capture.heartrails.com/">HeartRails</a>)</p><p style="text-align: center"><a href="http://www.agile-tech.com/"><img title="ネットショップ開発・コンサルティング 株式会社アジルテック" height="200" alt="http://www.agile-tech.com/" width="200" src="http://capture.heartrails.com/200x200/cool?http://www.agile-tech.com/" /></a></p><p>&nbsp;</p><p>Webページを画像やPDFとして変換する機能への需要は多くあります。外部ページへのリンクにマウスを合わせると飛び先のサムネイルが表示されるなどは、良い使い方だとおもいます。検索エンジンの結果にサムネイルを使っている場合もあります。</p><p>動的にリンク先を生成するWebアプリケーションの場合、任意のWebページのスナップショットを<strong>プログラムでリアルタイムに生成</strong>する必要があります。外部のWebサービスを使うのでは少し不安になります。プログラマであれば、<strong>自前プログラムからWebページサムネイルを生成</strong>できるようにしたくなります。</p><p>Webページサムネイルのプログラム開発アプローチは3通りあります。</p><p><strong>方法１</strong><br /><strong>正攻法</strong>は、HTMLをPersingして、レンダリングする方法です。<strong>ゼロからHTMLレンダリングエンジンを開発</strong>するのは、ワクワクと胸が躍ります。しかし、サムネイルを作成するためにだけHTMLレンダリングエンジンを自製してしまうのは、<strong>モッタイナイ</strong>ですよね。ですので、GPLで公開されている<strong>FireFoxの</strong><a href="http://ja.wikipedia.org/wiki/Gecko"><strong>Gecko </strong></a><strong>HTMLレンダリングエンジンを再利用</strong>する方法があります。ゼロからスタートしても3ヶ月くらいあれば開発できるでしょう。</p><p><strong>方法2</strong><br />もっと手を抜く方法は、<strong>IEコンポーネントを再利用</strong>することです。.NetであればWebBrowserコントロール(実体はIEのCOMオブジェクト)を使う方法です。Microsoft社製ですのでソースコードは開示されていませんが、IEのほとんどの機能はCOMインターフェイスを通じてプログラムから制御可能です。パフォーマンスを要求しなければ1週間程度で開発できます。</p><p><strong>方法3</strong><br />さらに手を抜く方法としては、コマンドラインで動くWebページキャプチャツールを使う方法です。例えば、<a href="http://dip.picolix.jp/disp5.html">CrenaHtml2Jpg</a>や<a href="http://www.url2jpeg.com/">url2jpg</a>などです。<a href="http://postcard.blog.ocn.ne.jp/itazura/2006/11/webwebnail_ac4b.html">こちらで実装した方がいます</a>が、毎分10ページ程度だそうです。これなら半日で作れますね。url2jpgは<a href="http://www.codeplex.com/url2jpeg">方法2で作られている</a>ので、実際は方法2の手抜きバージョンですね。</p><p>ちなみに、HeartRailsでは方法1(<a href="http://www.mozilla.org/projects/embedding/">Embedding Mozilla</a>)を採用しているようです。</p><p><hr /></p><p>&nbsp;</p><p>私は、方法2を試してみました。まだ、安定していないのでアプリを公開しませんが、単発で動作させるのは問題ないですが、マルチスレッドで動作させると落ちます。</p><p>IEのCOM周りにRe-entrantになっていない部分があるようで、手がでません。IE６、IE7と試してみましたがエラーがでるので、根本的にSTAモデルに対応してない資源管理している可能性があります。マルチプロセスでの処理はまったく問題ないので、どこかスレッドもでるがおかしそうです。&nbsp;<br />&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>]]>
        <![CDATA[<p><a href="http://www.searchme.com/">http://www.searchme.com/</a></p><p>&nbsp;</p><p><a href="http://michele.pupazzo.org/mozilla2ps/">mozilla2ps</a>を使う方法もありそうですが・・・Window表示が必須なんですね。(<a href="http://www.moongift.jp/2007/05/mozilla2ps/">紹介記事</a>)。&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>[.NET] PopBeforeSMTP</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2008/11/aspnet-popbeforesmtp.html" />
    <id>tag:www.agile-tech.com,2008:/blogs/dev//4.453</id>

    <published>2008-11-04T07:49:40Z</published>
    <updated>2008-11-20T08:26:31Z</updated>

    <summary>メール送信に利用するSMTPサーバがPOPBeforeSMTPで認証をしているケースが少なくありません。この場合、POPサーバに対して認証を実施する必要がありますが、Microsoft .NetのSystem.Net.MailはSMTPClientのみで、POPClientがありません。
TCPClientを使って直接POPサーバにメッセージを送信してもよいですが、POPClientの認証ライブラリがほしいところです。TKMP.dllを使えば解決できるのですが、GPLでしたので再配布する目的では利用できません。
</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term=".Net" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="認証" label="認証" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pop" label="POP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="popbeforesmtp" label="POPBeforeSMTP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="popclient" label="POPClient" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="smtp" label="SMTP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="systemnetmail" label="System.Net.Mail" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>メール送信に利用するSMTPサーバがPOPBeforeSMTPで認証をしているケースが少なくありません。</p><p>この場合、POPサーバに対して認証を実施する必要がありますが、Microsoft .NetのSystem.Net.MailはSMTPClientのみで、POPClientがありません。</p><p><a href=" http://tech.bbtune.com/csharp/items/301-2.html">TCPClientを使って直接POPサーバにメッセージを送信</a>してもよいですが、POPClientの認証ライブラリがほしいところです。</p><p><a href="http://uwa.potetihouse.com/library/tkmpdll.html">TKMP.dll</a>を使えば解決できるのですが、GPLでしたので再配布する目的では利用できません。</p><p>アジルテックでは、自前のPOPClientを利用しています。非商用利用向けに<a href="http://www.agile-tech.com/product/maillib.aspx">&beta;公開</a>していますので、ご利用ください。</p>]]>
        
    </content>
</entry>

<entry>
    <title>ASP.NET QRコード生成</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2008/09/aspnet-qr.html" />
    <id>tag:www.agile-tech.com,2008:/blogs/dev//4.450</id>

    <published>2008-09-07T13:27:12Z</published>
    <updated>2008-09-07T13:48:25Z</updated>

    <summary>世にあるQRコード生成ライブラリをまとめてみました。いくつも製品・フリーソフトがあるので適切なものを選んでください。 </summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="携帯" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="qrcodeaspnetnetプログラミング" label="QRCode ASP.NET .Net プログラミング" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>標準の .Net Frameworkの中に<strong>QRコードを生成するライブラリがありません</strong>。</p>
<p>最近ではWebサービスでQRコードを生成してくれるサービスもありますが、QRコードの生成機能などは外部サービスを使うよりも、自前のサーバで生成したほうがサーバの信頼性が高まります。</p>
<p>世にある<strong>QRコード生成ライブラリ</strong>をまとめてみました。いくつも製品・フリーソフトがあるので適切なものを選んでください。&nbsp;</p>
<table bordercolor="#afeeee" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr bgcolor="#afeeee">
<td><strong>製品名</strong></td>
<td><strong>会社</strong></td>
<td><strong>価格・ライセンス形態</strong></td>
<td><strong>コメント</strong></td></tr>
<tr bgcolor="#ffaeb9">
<td><a href="http://www.agile-tech.com/product/qrgen.aspx">QRGen</a></td>
<td><a href="http://www.agile-tech.com/">アジルテック</a></td>
<td><strong>個人利用無料</strong>、商用利用には商用ライセンス15,000円</td>
<td>弊社のライブラリです。ご要望などありましたら連絡ください</td></tr>
<tr>
<td><a href="http://www.spicy-inc.jp/seihin/free/qrencode.html">QR_Encode</a></td>
<td><a href="http://www.spicy-inc.jp/index.html">スパイシーソフト</a></td>
<td><strong>フリーソフト</strong>、アプリ同梱の再配布OK。単体での再配布は禁止</td>
<td>基本機能のみ提供。出力QRコードのタイプが02に固定</td></tr>
<tr>
<td><a href="http://www.pao.ac/products/barcode.net/index.html">BarCode.Net</a></td>
<td>(有) パオ＠オフィス</td>
<td>1ユーザライセンス18,900円。<a href="http://www.componentsource.co.jp/products/pao-barcode-net-j/index.html">CompornentSourceだと18,480円</a>。サーバライセンスは記述なし </td>
<td>ソースコードを含めて購入することができる</td></tr>
<tr>
<td><a href="http://www.geocities.jp/japan_inf/DotNetBarcode/">ColorfulQRCodeMaker<br />DotNetBarcode</a></td>
<td>個人 </td>
<td>再配布条件：本アプリの利用を明示すること。Webアプリについては「対応していない」と明記されているが、実際には利用できるが、Webで利用するとライセンス違反の可能性がある。著作者からWebでの利用ライセンスを確認する必要がある</td>
<td>色表現が多彩</td></tr>
<tr>
<td><a href="http://www.grapecity.com/japan/spotlight/activereports3/?gclid=CPvt8Mbww5UCFQE_egodu0LRiA">ActiveReports<br />for .Net Professinal Edition</a> </td>
<td><a href="http://www.datadynamics.com/default.aspx">Data Dynamics</a></td>
<td>再配布ライセンス&nbsp;<a href="http://www.grapecity.com/japan/support/database/P7_373.htm">294,000円</a></td>
<td>画像処理ライブラリの一環としてQRコード生成機能を提供している。高機能すぎる</td></tr>
<tr>
<td><a href="http://www.leadtools.com/SDK/Document/Document-Addon-BarcodeQRCode.htm">LEADTOOLS 2D QR Code Barcode Modules</a></td>
<td>Lead Technologies</td>
<td>再配布ライセンス147,000 + 210,000円 米国 995＄。サーバライセンスは記述なし</td>
<td>高機能すぎてWeb利用には不向き</td></tr></tbody></table>
<p><strong>まとめ：</strong></p>
<p>個人で利用するならば<strong>QRGen</strong>か<strong>QR_Encode</strong>がオススメです。Webアプリケーション用の商用ライセンスが必要な場合は、<a href="http://www.agile-tech.com/product/qrgen.aspx">QRGen</a>をご購入を検討ください。</p>]]>
        
    </content>
</entry>

<entry>
    <title>System.Net.MailでTo,Fromフィールドをiso-2022-jp Bエンコード</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2008/09/systemnetmailtofromiso2022jp-b.html" />
    <id>tag:www.agile-tech.com,2008:/blogs/dev//4.449</id>

    <published>2008-09-05T03:31:58Z</published>
    <updated>2008-11-20T08:31:57Z</updated>

    <summary>System.Net.Mailはその中でも際立っていて、海外ではUTF-8 ＆ Qエンコードが主流なため、国内のShift-JIS ＆ Bエンコードという日本のネット環境に適合していません。
結局、せっかく自動処理してくれるSubjectもMailMessage.SubjectEncodingは未指定にし、自前でBエンコーディングをする必要があります。</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="携帯" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="文字化け" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="quotedprintablebencodeqencodebエンコードqエンコードcontenttransferencodingcontenttype" label="quoted-printable B-Encode Q-Encode Bエンコード Qエンコード Content-Transfer-Encoding Content-Type" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>先日、<a href="http://www.agile-tech.com/blogs/dev/2008/09/net-framework-rfc.html">RFC違反のメールアドレス</a>に関する記事を書きましたが、ASP.NETのライブラリはGlobal基準(またはMicrosoft基準)のため、ガラパゴス進化をしている日本のネット環境と乖離していることがあります。</p>
<p>System.Net.Mailはその中でも際立っていて、海外では<strong>UTF-8 ＆ Qエンコード</strong>が主流なため、国内の<strong>Shift-JIS ＆ Bエンコード</strong>という日本のネット環境に適合していません。</p>
<p>悩まれている方も多く、あちらこちらで記事があがっています。</p>
<blockquote dir="ltr" style="margin-right: 0px"><a href="http://naka.wankuma.com/site/library/dotnet2.0/net/mail/SystemNetMondai3.htm">System.Net.Mail問題その3</a>(中の技術日誌)<br />
せっかくsubjectとbodyにはエンコード方式の指定があるにもかかわらず、<strong>From, To, Cc, Bcc, ReplyToなどのこのMailAddressクラスにはエンコード方式を指定する方法がありません</strong>。</blockquote>
<p>結局、MailAddressクラスのコンストラクタが「送り先氏名 &lt;user@address.com&gt;」という文字列を解釈して処理してくれるにもかかわらず、Qエンコーディングなため、<strong>自前でBエンコード処理</strong>をして2つ変数をとるコンストラクタ <strong>MailAddress( address, displayname)</strong> を呼ぶ必要があります。</p>
<blockquote dir="ltr" style="margin-right: 0px">string from_name = <strong>MyBEncode</strong>( &quot;株式会社 アジルテック&quot;, enc );<br />
string from_address = &quot;<a href="mailto:user@user@address.com">user@address.com&quot;;</a>&nbsp;<br />
msg.To.Add( new MailAddress( to_address, to_name ) );</blockquote>
<p>また、Subject, Bodyのエンコードを指定できますが、iso-2022-jpに指定しても、</p>
<blockquote dir="ltr" style="margin-right: 0px">Subject: =?iso-2022-jp<strong>?Q?</strong>=1B$B%5%V%8%'%/%H=1B(B1?=<br />
Content-Type: text/plain; charset=iso-2022-jp<br />
Content-Transfer-Encoding: <strong>8bit</strong></blockquote>
<p>出力はSubjectはQエンコードされ、BodyのContent-Transfer-Encodingは8bitエンコーディングです。</p>
<p>結局、せっかく自動処理してくれるSubjectもMailMessage.SubjectEncodingは未指定にし、自前でBエンコーディングをする必要があります。</p>
<p>Bodyを7bitにするには、Content-Transfer-Encodingについては、msg.HeadersにAddしても追加されず、AlternateViewを使って7bitエンコーディングを実現する必要があります。</p>
<blockquote dir="ltr" style="margin-right: 0px">追加されない：<br />
msg.Headers.Add( <strong>&quot;Content-Transfer-Encoding&quot;, &quot;7bit&quot;</strong> );</blockquote><blockquote dir="ltr" style="margin-right: 0px">AlternateViewを利用する：<br />
byte[] buf = enc.GetBytes( body );<br />
MemoryStream mem = new MemoryStream( buf );<br />
AlternateView alt_msg = new AlternateView( mem, new ContentType(&quot;text/plain; charset=&quot; + enc.BodyName ) );&nbsp;<br />
alt_msg.TransferEncoding&nbsp; = <strong>TransferEncoding.SevenBit</strong>;</blockquote>
<p>これまでは上記の方法でも、「content-transfer-encoding: 7bit」と出力するところが、「content-transfer-encoding: sevenbit」となっていたため、正しく送信できなかったのですが、.Net Framework 2.0 SP1で、「<a href="http://support.microsoft.com/default.aspx/KB/927858">[FIX] System.Net.Mime 名前空間または System.Net.Mail 名前空間を使用する Visual Studio 2005 プログラムを実行すると、TransferEncoding プロパティの値が正しくないことがある</a>」修正が含まれたので、SP1以降は送信するこができます。</p>
<p>&nbsp;参考：<br />
&nbsp;<a href="http://blogs.sqlpassj.org/mitsugi/archive/2006/02/23/16237.aspx">[.NET 2.0]日本語(ISO-2022-JP) を Content-Transfer-Encoding: 7bit で送信する方法</a></p>
<p>上記の方法で大部分は問題なく動作するが、まだ問題が残っています。<a href="http://www.akanko.net/marimo/data/rfc/rfc2047-jp.txt">RFC 2047</a>に記述のあるエンコード行の76文字改行規制です。</p>
<blockquote dir="ltr" style="margin-right: 0px">encoded-word = &quot;=?&quot; charset &quot;?&quot; encoding &quot;?&quot; encoded-text &quot;?=&quot;<br />
複数の行からなるヘッダフィールドの長さに制限はないが、1つ以上の<br />
&nbsp; 'encoded-word' を含むそれぞれの行は、76文字に制限される。</blockquote>
<p>改行いれた文字列を渡すと、MailMessageのSubjectプロパティもMailAddressクラスコンストラクタもエラーを発生します。</p>
<p>2バイト文字だと40文字越えるとこの制限に抵触します。</p>
<blockquote dir="ltr" style="margin-right: 0px">=?iso-2022-jp?B?GyRCJTUlViU4JSclLyVIRDkkJCU1JVYlOCUnJS8lSCRAJEgkSSQmJEokayRzJEckNyRnJCYkKyRKIzEjMiMzIzQjNSM2IzcjOCM5IzEjMiMzIzQjNSM2IzcjOCM5GyhCQUJDREVGRxskQiQiJCQkJiQoJCokKyQtJC8kMSQzJDUkNyQ5JDskPSQ/JEEkRCRGJEghIktcRnwkT0AyRTckSiRqGyhC?= </blockquote>
<p>しかし、上記のような長いエンコード文字列を渡しても大丈夫なSMTPサーバ、メールクライアントも多いようです。Au, Softbankは76文字で区切らなくても表示できる端末があるので、少なくとも両社のSMTPサーバは受け取ります。(ただし、端末によっては表示されない可能性あり）</p>
<p><strong>まとめ：</strong></p>
<div style="padding-right: 0px; padding-left: 40px; padding-bottom: 0px; padding-top: 0px">
<ol>
    <li><strong>ヘッダ中(To, Subject)のBエンコードは自分で行う。文字長は気にしなくてもよい</strong></li>
    <li><strong>本文のエンコード指定はSP1を適用し、AlternateViewを用いる</strong></li>
</ol>
</div>
<p><font style="font-size: 0.8em">RFCの作法は守りたいという方は、Socketから直接SMTPサーバと通信してください。</font></p>
<p><strong><font style="font-size: 0.8em">[追記 2008/11/20 ] </font></strong><font style="font-size: 0.8em">弊社より、<a href="http://www.agile-tech.com/product/maillib.aspx">サブジェクト文字化けとRFC非準拠アドレスに対応したSMTPClientを公開</a>しました。現在、&beta;公開につき無料で利用できます。ぜひお試しください。</font></p>
<p><a href="http://www.agile-tech.com/product/maillib.aspx"><img src="http://www.agile-tech.com/images/img_maillib_title.jpg" alt="RFC非準拠アドレスに対応メールライブラリ" /></a></p>]]>
        <![CDATA[<p><strong>サンプルコード</strong></p><p>&nbsp;</p><p><xmp>private void SendMail(){
	string subject = &quot;サブジェクト&quot;;
	string body = &quot;メール本文&quot;;

	// エンコード取得
	Encoding enc = Encoding.GetEncoding( &quot;ISO-2022-JP&quot; );
	MailMessage msg = new MailMessage();

	string to_name = MyBEncode( &quot;お客様のお名前&quot;, enc );
	string to_address = &quot;customer@address.com&quot;;

	string from_name = MyBEncode( &quot;株式会社 アジルテック&quot;, enc );
	string from_address = &quot;developper@agile-tech.com&quot;;
	
	// SubjectとBodyのエンコードを指定してはいけない
//	msg.BodyEncoding = enc;
//	msg.SubjectEncoding = enc;

	msg.To.Add( new MailAddress( to_address, to_name ) );
	msg.From = new MailAddress( from_address, from_name );
	msg.Subject = MyBEncode( subject, enc );	// エンコード文字列を渡す
	msg.Body = string.Empty;	// 空に指定

	// 本文をバイト列に返還
	byte[] buf = enc.GetBytes( body );
	// AlternateViewのためにメモリストリームを作成
	MemoryStream mem = new MemoryStream( buf );

	AlternateView alt_msg = new AlternateView( mem, new ContentType(&quot;text/plain; charset=&quot; + enc.BodyName ) ); 
	alt_msg.TransferEncoding  = TransferEncoding.SevenBit;

	msg.AlternateViews.Add( alt_msg );
	msg.IsBodyHtml = false;

	SmtpClient smtp = new SmtpClient( &quot;smtp.agile-tech.com&quot; );	// SMTPサーバを指定
	smtp.Send( msg );
}

private string MyBEncode( string str, Encoding encode ) {
	return &quot;=?iso-2022-jp?B?&quot; + Convert.ToBase64String( encode.GetBytes( str ) ) + &quot;?=&quot;;
}

</xmp></p><p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>[解決方法]【.Net】 RFC違反の携帯メアドに送信する</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2008/09/net-framework-rfc.html" />
    <id>tag:www.agile-tech.com,2008:/blogs/dev//4.448</id>

    <published>2008-09-02T16:55:01Z</published>
    <updated>2008-11-20T08:32:50Z</updated>

    <summary>RFC違反の携帯メアドを扱うには。
セキュリティに執着しない顧客で、メルマガのようにHTMLメールが不要なケースであればSystem.Web.Mailでも十分です。しかし問題点1で指摘したように、テスト環境では動いてたものが、本番環境によってCDOモジュールが見つからないというエラーがでて顧客のクレームを浴びることもありえます。</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="携帯" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="aspnetsystemnetmailsystemwebmailsmtp携帯メールcdo" label="ASP.NET System.Net.Mail System.Web.Mail SMTP 携帯 メール CDO" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p><strong>問題：</strong></p><p><strong>System.Net.Mail.MailAddressクラスは携帯各社が許可している、RFCに準拠しないメールアドレスを渡すことができません。</strong></p><blockquote dir="ltr" style="margin-right: 0px"><p>MailAddress address = new MailAddress( &quot;<a href="mailto:test...@docomo.ne.jp">test...@docomo.ne.jp</a>&quot; );</p></blockquote><p>上記のようなメールアドレスを渡そうとするとFormatExceptionが発生してしまいます。</p><blockquote dir="ltr" style="margin-right: 0px"><p>System.FormatException はユーザー コードによってハンドルされませんでした。<br />&nbsp; Message=&quot;指定された文字列は、電子メール アドレスに必要な形式ではありません。&quot;<br />&nbsp; Source=&quot;System&quot;<br />&nbsp; StackTrace:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 場所 System.Net.Mime.MailBnfHelper.ReadMailAddress(String data, Int32&amp; offset, String&amp; displayName)</p></blockquote><p><strong>原因：</strong></p><p>System.Net.MailAddressがRFCで定められているよりも厳しくメールアドレスの形式をチェックしているため。</p><p>実はこのようなRFC準拠していないメールアドレスであっても「<a href="mailto:%22test...%22@docomo.ne.jp">&quot;test...&quot;@docomo.ne.jp</a>&nbsp;」と<strong>アカウント部分をエスケープ</strong>することでRFC準拠として扱えるのですが、MailAddressクラスはFormatExceptionを発生させます。</p><p><strong>解決方法：</strong></p><p>ASP.NET開発で携帯メールアドレスを扱うことは多々あり、「RFC非準拠アドレスにメール送信できないのは仕様です」といっても発注元が検収してくれません。</p><p>そこで、簡単な逃げ道としては.Net Framework 1.1で使われていたSystem.Web.Mailを利用する方法があります。</p><blockquote dir="ltr" style="margin-right: 0px"><p>MailMessage msg = new MailMessage();<br />msg.To = &quot;<a href="mailto:test...@docomo.ne.jp">test...@docomo.ne.jp</a>&quot;;</p></blockquote><p>MailMessageクラスのToプロパティはstring型でメール形式をチェックしません。どんな文字列でも渡すことができます。また、OSが日本語環境であれば、デフォルトのエンコーディングはiso-2022-jp かつ Bエンコードになるので、特に設定せずとも各携帯キャリア対応です。</p><p>いいことずくめに思えますが、下記のような問題点があります。</p><blockquote><ol><li>実行環境依存が発生する</li><li>CDOモジュールが.Netプログラマにわかり難い</li><li>HTMLメール送信機能が不十分</li><li>SMTP/SSLが使えない</li></ol></blockquote><p>ひとつひとつ詳しく解説します。</p><p><strong>1 実行環境依存が発生する</strong></p><p>System.Web.Mailのメール送信は<strong>Microsoft CDO for Exchange 2000のモジュールを利用しているため、実行環境によって挙動が変化します。</strong>本番環境でモジュールがなくて動かない・・・ということもありえます。</p><p>アプリケーションの実行アカウント権限がCDOオブジェクトにアクセスできないとアウトです。あちらこちらの掲示板で質問があがっては未解決という状態です。</p><p>特定のVersionのVisual Studioをインストールしたり、Exchange Serverをインストール＆アンインストールしていると症状がでるといった報告もあります。</p><p>&nbsp;参考：<br />&nbsp;<a href="http://technet.microsoft.com/ja-jp/library/aa996615%28EXCHG.80%29.aspx">[MSDN] CDO.DLL ファイルが存在しない</a></p><p><strong>2 CDOモジュールが.Netプログラマにわかり難い</strong></p><p>この自由度の高かった1.1のSystem.Web.Mailが2.0でSystem.Net.Mailに置き換えられているのは、基本的に<strong>System.Web.MailはExchangeモジュールの.Net用ラッパークラス</strong>にすぎないためです。細かい制御は全て、CDOに対するメッセージを付加する必要があります。たとえば、portを25番以外に変更する場合には、MailMessageのFilesプロパティにCDOの設定をメッセージとして追加する必要があります。</p><blockquote dir="ltr" style="margin-right: 0px"><p>msg.Fields[<br /><span class="code-string">&quot;</span><span class="code-string">http://schemas.microsoft.com/cdo/configuration/smtpserverport&quot;</span>] = <span class="code-digit">25</span>;</p></blockquote><p>また、CDOのエラーメッセージが不親切で、原因の切り出しがし難い点があります。</p><p>&nbsp;参考：<br />&nbsp;<a href="http://support.microsoft.com/kb/910360/ja">「CDO.Message」を作成しなかったための」エラー メッセージのトラブルシューティング方法</a></p><p><strong>3 HTMLメール送信機能が不十分</strong></p><p>msg.BodyFormat = MailFormat.Html;</p><p>上記のプロパティを設定することでHTMLメールを送信することができるのですが、機能的に不十分です。携帯のデコメール等はimgタグで指定するsrc属性を外部リソースを指定することができません。そのため、添付ファイルを表示するためにContentIdを指定したいのですが、System.Web.Mail.MailAttachmentにはContentIdを指定できません。をまた、HTMLメールを指定した際の、Textメールは自動生成なので、HTMLとTextメールをそれぞれ整形して指定できません。</p><p>&nbsp;参考：<br />&nbsp;<a href="http://www.nttdocomo.co.jp/service/imode/make/content/deco_mail/">DoCoMo デコメ</a><br />&nbsp;<a href="http://www.au.kddi.com/ezfactory/tec/spec/decorations/index.html">KDDI デコメ</a><br />&nbsp;<a href="http://creation.mb.softbank.jp/mail/mail_contract.html">SoftBank</a></p><p><strong>4 SMTP/SSLが使えない</strong></p><p><a href="http://dictionary.rbbtoday.com/Details/term2683.html">SMTP/SSL</a>をサポートしていないようです。CDOの設定を探せばあるのかしれませんが、ドキュメントを発掘できません。SMTPAuthはサポートしているのですが、平文 or <a href="http://en.wikipedia.org/wiki/NTLM">NTLM</a>(=CRAM-MD5 )となり、ベストエフォート設定はできません。ちなみに<a href="http://www.atmarkit.co.jp/aig/02security/smime.html">SMIME署名</a>は<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=860ee43a-a843-462f-abb5-ff88ea5896f6&amp;displaylang=ja">CAPICOM</a>を使うのが常道なので、1.1、2.0いずれのVersionでもサポートしていません。</p><p>&nbsp;参考：<br />&nbsp;<a href="http://support.microsoft.com/kb/555287">[Microsoft]System.Web.mail を使用している 有効 SMTP 認証の方法</a><br />&nbsp;<a href="http://msdn.microsoft.com/en-us/library/ms526318%28EXCHG.10%29.aspx">[MSDN] リファレンス http://schemas.microsoft.com/cdo/configuration/</a></p><p><strong>総括：</strong></p><p>「<strong>入会案内程度のメールであればSystem.Web.Mailは利用に耐える</strong>」、セキュリティに執着しない顧客で、メルマガのようにHTMLメールが不要なケースであればSystem.Web.Mailでも十分です。しかし問題点1で指摘したように、<strong>テスト環境では動いてたものが、本番環境によってCDOモジュールが見つからないというエラー</strong>がでて顧客のクレームを浴びることもありえます。必ず、CDOモジュールが動作するかミニプログラムを本番サーバで動かして確認してください。</p><p>弊社ではSMTPは、System.Net.MailもSystem.Web.Mailのどちらも使うことを辞め、<strong>自前で実装したSMTPクライアントを利用しています</strong>。顧客からの要望に細かく対応できるので便利です。</p><p>&nbsp;<strong><font style="font-size: 0.8em">[追記 2008/11/20 ] </font></strong><font style="font-size: 0.8em">弊社より、<a href="http://www.agile-tech.com/product/maillib.aspx">サブジェクト文字化けとRFC非準拠アドレスに対応したSMTPClientを公開</a>しました。現在、&beta;公開につき無料で利用できます。ぜひお試しください。</font></p><p><a href="http://www.agile-tech.com/product/maillib.aspx"><img alt="RFC非準拠アドレスに対応メールライブラリ" src="http://www.agile-tech.com/images/img_maillib_title.jpg" /></a></p>]]>
        
    </content>
</entry>

<entry>
    <title>ASP.NET Event発生順序</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2008/08/aspnet-event.html" />
    <id>tag:www.agile-tech.com,2008:/blogs/dev//4.438</id>

    <published>2008-08-13T04:52:02Z</published>
    <updated>2008-09-04T06:20:11Z</updated>

    <summary>『OnInitイベントは最も内側のコントロールから外側の順序で発生し、それ以外のイベントは最も外側のコントロールから内側の順序で発生します』、と書かれていますが、この記述は間違っています。
</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="aspnetイベント発生順序" label="ASP.NET イベント 発生順序" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>Microsoft .Net framework ASP.NETでは、ウェブページの表示時に各種オブジェクトによるイベントが発生します。イベントの発生順序を正しく把握していないと、セッション保管しているパラメータや、オブジェクトのパラメータが意図しない値で挙動し、障害の原因となります。</p>
<p>下記の順序でイベントがおこるのは<a href="http://msdn.microsoft.com/ja-jp/library/dct97kc3%28VS.80%29.aspx">ドキュメント（ASP.NET のマスター ページとコンテンツ ページのイベント）に明記</a>されています。</p>
<blockquote>
<ol>
<li>
<p>マスタ ページ コントロールの <b>Init</b> イベントが発生します。</p>
</li><li>
<p>コンテンツ コントロールの <b>Init</b> イベントが発生します。</p>
</li><li>
<p>マスタ ページの <b>Init</b> イベントが発生します。</p>
</li><li>
<p>コンテンツ ページの <b>Init</b> イベントが発生します。</p>
</li><li>
<p>コンテンツ ページの <b>Load</b> イベントが発生します。</p>
</li><li>
<p>マスタ ページの <b>Load</b> イベントが発生します。</p>
</li><li>
<p>コンテンツ コントロールの <b>Load</b> イベントが発生します。</p>
</li><li>
<p>コンテンツ ページの <b>PreRender</b> イベントが発生します。</p>
</li><li>
<p>マスタ ページの <b>PreRender</b> イベントが発生します。</p>
</li><li>
<p>マスタ ページ コントロールの <b>PreRender</b> イベントが発生します。</p>
</li><li>
<p>コンテンツ コントロールの <b>PreRender</b> イベントが発生します。</p></li></ol>
</blockquote>

<p>ドキュメントでは、『<strong>OnInitイベントは最も内側のコントロールから外側の順序で発生し、それ以外のイベントは最も外側のコントロールから内側の順序で発生します</strong>』、と書かれています。</p>
<p>ですが、この<strong style="COLOR: red">記述は間違っています</strong>。</p>
<p>実際には、ページ内のコントロールのイベント発生順序は、MasterページないのコントロールがContentPlaceHolderの前後のどちらにあったかで、結果が違います。</p>
<p></p><xmp>前置の場合：
<uc1:UC_OnChildMaster id="UC_OnChildMaster1" runat="server"  Val="1"/>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" />
</xmp>
<p></p><xmp>後置の場合：
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" />
<uc1:UC_OnChildMaster id="UC_OnChildMaster1" runat="server"  Val="1"/>
</xmp>
<p></p>
<p> </p>
<p>前置の場合は、ドキュメントの言うとおりに、先にMasterページ内のコントロールUC_OｎChildMaster1のOnInitイベントが発生しますが、後置の場合は、コンテンツページ内に配置したコントロールのイベントが先に発生します。</p>
<p>直感として『<strong style="COLOR: blue">HTMLに出力する順序でコントロールのイベントが発生する</strong>』と覚えておくとよいです。</p>
<p>コントロールの内包関係に関してはMSDNの記述どおり、OnInitでは内側から、それ以外では外側からイベントが発生していきます。</p>
<p> </p>
<p>同時に覚えておくと便利なので、下記の点も把握しておくと良いです。</p>
<p><strong>1) ディレクティブでのプロパティアクセス</strong></p>
<p><strong>2) ユーザコントロールタグでのプロパティアクセス</strong></p>
<p><strong>3) コード表示ブロック &lt;% %> </strong></p>
<p>実はこれらの発生順序は下記の順序になっています。</p>
<p><strong style="color:red;">1) → 2) → OnInit → OnLoad → OnPreRender → 3) → OnUnload</strong></p>
<p>1)および2)は、MASTER、ASPX、ASCXファイルなどが読み込まれた時点で即座に解釈されているため、OnInitより先に発生します。</p>
<p>これは、非常に使い勝手がよく、複数のページで共通して使う機能を継承元の親ページで実装している場合に、OnLoadイベントなどの挙動を指定することが可能になります。例えば、Page_Loadで表示データをRepeaterにDataBindするコントロールなどで、表示する個数を指定したいばあいに、コントロールを配置したページないのコードブロックで下記のようにしていしても、ユーザコントロールのOnLoadが先に発生しているので動作を制御することができません。</p>
<p>&lt;% this.DisplayItemCount = 3; %></p>
<p>そこで、OnLoadよりも先に処理される、下記のような形で指定することになります。</p>
<p>&lt;uc1:ItemList id="ItemList1" runat="server" DisplayItemCount="3" /></p>
<p>継承関係、AutoEventWireapとoverride、DataBindとDataBind式まで含めてオブジェクトへのイベント発生順序を考えるとさらに複雑になります。このあたりを正しく把握しておくと、見通しのよい保守性の高い設計が可能になりますので、是非習得してみてください。</p>
<p> </p>]]>
        
    </content>
</entry>

<entry>
    <title>[解決方法]ASP.NETではKDDI AU端末でistyleが表示されない</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2008/08/aspnetkddi-auistyle.html" />
    <id>tag:www.agile-tech.com,2008:/blogs/dev//4.434</id>

    <published>2008-08-07T05:56:12Z</published>
    <updated>2008-08-07T07:51:05Z</updated>

    <summary> ASP.NETで携帯向けアプリケーションを作成すると、最近のAU端末ではinputタグに初期の入力文字を指定するための、formatやistyle属性が表示されません。Browser定義ファイルを追加しChtmlTextWriterでレンダーすることで問題を回避できます。</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="携帯" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="aspnetkddiau端末istylebrowserapp_browserscontroladaptersmarkuptextwritertypechtmltextwriter" label="ASP.NET KDDI AU端末 istyle Browser APP_Browsers controlAdapters markuptextwritertype ChtmlTextWriter" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>問題：<br />&nbsp;ASP.NETで携帯向けアプリケーションを作成すると、最近のAU端末ではinputタグに初期の入力文字を指定するための、formatやistyle属性が表示されません。</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p>例：<br />ASPXファイルの記述<br />&lt;asp:TextBox istyle="3" ID="TB_Mail" runat="server" /&gt;</p></blockquote>
<p>原因：<br />&nbsp;Up.BrowserのVersion6以降では、HTMLレンダリングにSystem.Web.UI.XhtmlTextWriterが用いられているため、istyleなどの非正則属性を除去してしまう。</p>
<p>対策：<br />&nbsp;Html32TextWriterもしくはChtmlTextWriterを利用するように設定する。<br />VS2005以降で開発しているのでしたら、App_Browsersフォルダを追加して、KDDI AU用の定義ファイルを作成してください。</p>
<p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px"><xmp>例：
<browsers / / />
 <browser refid="Up" / / />
  <capabilities>
    <capability name="supportsInputIStyle" value="true" />
  </capabilities>
  <controlAdapters markuptextwritertype="System.Web.UI.ChtmlTextWriter" />
 </browser>
</browsers></xmp></blockquote>
<p>デフォルト定義されている%Windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers\ 内部のopenwave.browserファイルの407行目を直接編集した場合は、コマンドプロンプトから「aspnet_regbrowsers.exe - i」を実行してください。</p>
<p>&lt;controlAdapters markupTextWriterType="System.Web.UI.<strong>XhtmlTextWriter</strong>" /&gt;<br />↓変更<br />&lt;controlAdapters markupTextWriterType="System.Web.UI.<strong>ChtmlTextWriter</strong>" /&gt;<br /></p>
<p>参考情報：&nbsp;</p>
<p>&nbsp;<a href="http://msdn.microsoft.com/ja-jp/library/ms228122.aspx">MSDN ブラウザ定義ファイルのスキーマ</a> </p>]]>
        
    </content>
</entry>

<entry>
    <title>ASP.NET : Google モバイル コンテンツ向け AdSenseコード</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2008/04/aspnet-google-adsense.html" />
    <id>tag:www.agile-tech.com,2008:/blogs/dev//4.393</id>

    <published>2008-04-16T05:45:41Z</published>
    <updated>2008-04-16T06:17:17Z</updated>

    <summary>ASP.NET用Google AdSenseモバイル向けコンテンツのAdSense コード </summary>
    <author>
        <name>nogu</name>
        
    </author>
    
    <category term="aspnetgoogleadsense" label="ASP.NET Google AdSense" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>GoogleのモバイルアドセンスはPHPやPerl用にプログラムコードが用意されているのですが、なぜかASPはあるのにASP.NET向けには用意されていません。</p>
<p>携帯のクリック広告は弊社の<a href="http://i-mobile.co.jp/">クリック報酬型広告 i-mobile：アイモバイル</a>を使っていただきたいのですが、ASP.NET用のスクリプトを作成したので公開しておきます。</p>
<p>基本的にGoogleはAdSenseの画面で提供する以外のスクリプトを認めていないので、自己責任で利用してください&nbsp;</p>
<p>&nbsp;</p>
<p>下記のスクリプトをページ内の任意の箇所に設置して、HTMLの表示したい箇所で&lt;%=&nbsp;googleShowAdSense( "ここに自分のIDを入力" )&nbsp;%&gt;を設置すればOKです。</p>
<xmp style="color:blue;">
<script runat="server">
    private string googleColor( string v, long random ) {
        string googleColor;
        string[] colorArray;
        colorArray = v.Split( ",".ToCharArray() );
        return colorArray[ random % colorArray.Length ];
    }

    private string googleScreenRes() {
        string screenRes;
        string delimiter;
        string[] resArray;
        screenRes = Convert.ToString( Request[ "HTTP_UA_PIXELS" ] );
        delimiter = "x";
        if( screenRes == null || screenRes == string.Empty ) {
            screenRes = Convert.ToString( Request[ "HTTP_X_UP_DEVCAP_SCREENPIXELS" ] );
            delimiter = ",";
        }
        if( screenRes == null || screenRes == string.Empty ) {
            return string.Empty;
        }

        resArray = screenRes.Split( delimiter.ToCharArray() );

        if( resArray.Length == 2 ) {
            return "&u_w=" + resArray[ 0 ] + "&u_h=" + resArray[ 1 ];
        }
        return string.Empty;
    }

    private string googleReferrer() {
        if( Request.UrlReferrer == null ) {
            return string.Empty;
        }
        return Request.UrlReferrer.AbsoluteUri;
    }

    private string googleShowAdSense( string userid ) {
        return googleShowAdSense( "", userid, "", "", "", "", "", true, "xhtml", "utf8" );

    }
    private string googleShowAdSense( string channel, string userid, 
        string bordercolor, string bgcolor, string linkcolor, string textcolor, string urlcolor, 
        bool single, string markup, string encord ) {
        
        long googleDt;
        string googleScheme, googleHost;
        DateTime time = DateTime.Now.AddTicks( -( new DateTime( 1970, 1, 1 ).Ticks ) );
        googleDt = time.Ticks / 10000;

        System.Text.Encoding enc = System.Text.Encoding.UTF8;

        string format = "mobile_double";
        if( single ) {
            format = "mobile_single";
        }

        string colorparam = string.Empty;
        if( bordercolor != string.Empty
			&& bordercolor != string.Empty
			&& bgcolor != string.Empty
			&& linkcolor != string.Empty
			&& textcolor != string.Empty
			&& urlcolor != string.Empty ) {
            colorparam = "&color_border=" + googleColor( bordercolor, googleDt ) +
			"&color_bg=" + googleColor( bgcolor, googleDt ) +
			"&color_link=" + googleColor( linkcolor, googleDt ) +
			"&color_text=" + googleColor( textcolor, googleDt ) +
			"&color_url=" + googleColor( urlcolor, googleDt );
        }

        string googleAdUrl;
        googleAdUrl = "http://pagead2.googlesyndication.com/pagead/ads?" +
			"ad_type=text" +
			"&channel=" + channel +
			"&client=" + userid +
			colorparam +
			"&dt=" + googleDt +
			"&format=mobile_single" +
			"&host=" + System.Web.HttpUtility.UrlEncode( Request.Url.GetLeftPart( UriPartial.Authority ), enc ) +
			"&ip=" + System.Web.HttpUtility.UrlEncode( Request.UserHostAddress, enc ) +
			"&markup=" + markup +
			"&oe=" + encord +
			"&output=" + markup +
			"&ref=" + System.Web.HttpUtility.UrlEncode( googleReferrer(), enc ) +
			"&url=" + System.Web.HttpUtility.UrlEncode( Request.Url.AbsoluteUri, enc ) +
			"&useragent=" + System.Web.HttpUtility.UrlEncode( Request.UserAgent, enc ) +
			googleScreenRes();

        string googleAdOutput;
        System.Net.WebClient client = new System.Net.WebClient();
        System.IO.Stream st = client.OpenRead( googleAdUrl );
        System.IO.StreamReader sr = new System.IO.StreamReader( st );
        googleAdOutput = sr.ReadToEnd();
        sr.Close();
        st.Close();


        return googleAdOutput;
    }
</script>
</xmp>

<p style="color:black; font-weight:bold;">
利用例： 基本色での表示</p>
<xmp style="color:red;"><html><body>
<%= googleShowAdSense( "ca-mb-pub-5130513572354664" ) %>
</body></html>
</xmp>
<p>(注) IDは適当です。
</p>

<p style="color:black; font-weight:bold;">
利用例： チャネル・色を指定しての表示</p>
<xmp style="color:red;"><html><body>
<%= googleShowAdSense( "0285258959", "ca-mb-pub-5130513572354664",
 "6699CC", "FFFFFF", "003366", "AECCEB", "AECCEB", false, "xhtml", "utf8" ) %>
</body></html>
</xmp>

<p>
 チャネルや色を指定する場合は上記のようにつかってください。<br / />
 文字コードはASP.NETであればweb.configのGlobalizationで指定するのが一般的ですので、utf8のままで問題ないです。
</p>

<p>
なにか問題などありましたらフィードバックください。念のために繰り返しますが、自己責任のうえでお使いください。
</p>]]>
        
    </content>
</entry>

<entry>
    <title>UTF-8とShift-JIS マルチエンコーディングの注意点</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2008/02/utf8shiftjis.html" />
    <id>tag:www.agile-tech.com,2008:/blogs/dev//4.354</id>

    <published>2008-02-14T05:19:29Z</published>
    <updated>2008-02-14T05:48:33Z</updated>

    <summary>単一のページで、PCと携帯の両対応を目論む方の中には、「PC向けにはUTF-8で、携帯向けにはShift-JISで表示したい」と考えるかもしれません。(迷信ですが、SEO的にUTF-8のほうが良いと言われているため)

この場合、globalizationではUTF-8を指定しておき、UserAgentから携帯電話端末を識別して、Responseオブジェクトに1行追加するだけでShift-JISにすることができます。</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="携帯" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="文字化け" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>ASP.NETはweb.config中のglobalizationを指定するだけで、文字コードを簡単に変更することができます。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>&lt;globalization requestEncoding="UTF-8" responseEncoding="UTF-8"/&gt;</strong></p>
<p>PC向けのサイトではなにも考えずにUTF-8でサイトを構築してもいいのですが、携帯向けサイトですと、SHIF-JISでエンコードする必要があります。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>&lt;globalization requestEncoding="Shift-JIS" responseEncoding="Shift-JIS"/&gt;</strong></p>
<p>この場合、ASP.NETのサーバオブジェクトは、クライアントからのポストデータをShift-JISエンコードとして自動処理します。</p>
<p>単一のページで、PCと携帯の両対応を目論む方の中には、「PC向けにはUTF-8で、携帯向けにはShift-JISで表示したい」と考えるかもしれません。(迷信ですが、<strong>SEO的にUTF-8のほうが良い</strong>と言われているため)</p>
<p>この場合、globalizationではUTF-8を指定しておき、UserAgentから携帯電話端末を識別して、Responseオブジェクトに1行追加するだけでShift-JISにすることができます。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Response.ContentEncoding = System.Text.Encoding.GetEncoding( "Shift-JIS" );</strong></p>
<p>ただし、これを行うと、<strong>Softbank＆Vodafone端末</strong>で文字化けがおこります！</p>
<p>理由は、.NET FrameworkはDoCoMoとKDDIとJ-PHONEはご存知なのですが、「Vodafone？Softbank？だれそれ？」状態です。ですので、browser情報を追加する必要があります。</p>
<p>ASP.NETフォルダの追加からApp_Browsersフォルダを追加して、その中にVodafoneとSoftbankのための情報を追加してください。特に重要なのは下記の1行です。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;capability name="preferredResponseEncoding"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="shift_jis" /&gt;</strong></p>
<p>アプリケーション単体ではなく、サーバ自体に設定を追加する場合は、<a href="http://msdn2.microsoft.com/ja-jp/library/ms229858(VS.80).aspx">こちらの記事を参考</a>にしてください。</p>
<p>以上、ASP.NET 2.0の話です。ASP.NET 1.1の環境ではBrowser Capsで対応してください。</p>
<p><strong>その他資料：</strong></p>
<p><a href="http://msdn2.microsoft.com/ja-jp/library/ms229858(VS.80).aspx">MSDNブラウザファイルのスキーマー</a></p><a href="http://msdn2.microsoft.com/ja-jp/library/sk9az15a(VS.80).aspx">BrwoserCaps</a>]]>
        
    </content>
</entry>

<entry>
    <title>Windows 64ビット環境での32ビットASP.NET開発環境</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2007/12/windows-6432aspnet.html" />
    <id>tag:www.agile-tech.com,2007:/blogs/dev//4.325</id>

    <published>2007-12-25T02:42:05Z</published>
    <updated>2008-11-07T06:08:24Z</updated>

    <summary>ASP.NET 1.1の開発があるかぎり、64ビットOSに移行してはいけません</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="64ビット" label="64ビット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="aspnet" label="ASP.NET" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="x64" label="x64" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>最近では3.5GByte以上のメモリ搭載するために、64bitの開発環境を使うようになってないでしょうか。</p><p>Visual Studio 2005を使ってASP.NET 2.0以降の開発しかしていなければさほど問題はありませんが、ASP.NET 1.1の開発を続けている場合、64bit版の.Net Frameworkがリリースされていないという問題があります。</p><p>ASP.NET 1.1のソースを開発するには、下記のコマンドを実行します。</p><p><strong>cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1</strong></p><p>これで、IISを32ビットモードで動かすことができます。その後、ASP.NET 1.1をIISに登録してください。</p><p><strong>v1.1.4322\aspnet_regiis.exe -i</strong></p><p>64ビットモードに戻す場合は、下記のコマンドを実行します。</p><p><strong><p><strong>v1.1.4322\aspnet_regiis.exe -u</strong></p></strong></p><p><strong>cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 <font style="color: #ff0000">0</font></strong></p><p><strong>Framework64\v2.0.50727\aspnet_regiis -i</strong></p><p>最近では、ASP.NET 2.0が開発の主流です。両方開発する必要がなければ、64ビット環境でIISを実行することをお勧めします。64ビット環境で動作させることの最大の利点は、非ページプールメモリの最大値が256MByteから128GByteへ大幅に増大している点です。負荷テストをする際には必ず、本番環境と同じIISの構成にしてチェックしましょう。</p><p>ちなみに、<a href="http://support.microsoft.com/kb/919283/ja">32ビット環境ではIISマネージャーが正しく動作しない</a>という問題もあります。このため、64ビットOSでIISを32ビットエミュレーションしていると、ASP.NETの実行環境を1.1と2.0で切り替えには、拡張子とISAPIフィルタの関連付けをひとつづず直す必要がでてきます(切り替えバッチファイルを作っておくのがよい)。</p><p>さらに、ほとんど使っている人はないでしょうが、Mobile Internet Toolkit を使っている場合、バージョンチェックにひっかかってInstallすらできません。この場合は仕方ないので、Web Matrixをインストールすることになります。</p><p>結論としては、<strong>ASP.NET 1.1の開発があるかぎり、64ビットOSに移行してはいけません</strong>。</p><p><strong>関連ページ</strong></p><p><a href="http://support.microsoft.com/kb/894435/ja">64 ビット版の Windows で 32 ビット版の ASP.NET 1.1 と 64 ビット版の ASP.NET 2.0 を切り替える方法</a></p><p><a href="http://support.microsoft.com/kb/894435/ja">Microsoft ASP.NET 2.0 ホスティング展開ガイド</a></p><p><a href="http://support.microsoft.com/kb/911720/ja">64 ビット コンピュータに ASP.NET 2.0 の32 ビット バージョンをインストールすると、 ASP.NET 状態サービス(Aspnet_state.exe)がインストールされません。</a></p>]]>
        <![CDATA[<p>64bit環境で動作しない開発ツール</p><p><a href="http://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32/MozillaBuildSetup-1.3.exe">mozilla-builder (1.3)</a><br />&nbsp;MSYS起動時にエラーがでる。おかげでFirefoxがBuildできない。</p>]]>
    </content>
</entry>

<entry>
    <title>Content-Disposition FireFoxとIEの挙動の違い</title>
    <link rel="alternate" type="text/html" href="http://www.agile-tech.com/blogs/dev/2007/12/contentdisposition.html" />
    <id>tag:www.agile-tech.com,2007:/blogs/dev//4.312</id>

    <published>2007-12-04T04:45:07Z</published>
    <updated>2008-09-05T04:25:29Z</updated>

    <summary>Microsoftではファイル名をURLエンコードして回避するようにと記載していますが、これですとFireFoxなどほかのブラウザで文字化けをしてしまします。</summary>
    <author>
        <name>nogu</name>
        
    </author>
    
        <category term="ASP.NET" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="文字化け" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ファイルアップロードaspnet" label="ファイルアップロード ASP.NET" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.agile-tech.com/blogs/dev/">
        <![CDATA[<p>ファイルダウンロードするプログラムを作成する際にはHTTPヘッダに下記の表記を追加します。</p>
<p><strong>Content-Disposition: attachement; filename=&lt;ファイル名&gt;</strong></p>
<p>しかし、ダウンロードファイルに日本語や記号を含む場合、なにもしないと文字化けが発生します。<br />これは、各社のブラウザがContent-Dispositionのフォーマットに関する実装をRFC通りに実装していなため、英語圏以外で問題が発生しています。</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p><a href="http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B436616">ファイルをダウンロードする ASP.NET Web ページで日本語ファイル名が文字化けする</a><br /><font style="FONT-SIZE: 0.8em">原因<br />Internet Explorerでは、Content-Disposition ヘッダが送信された場合、送られてきたコンテンツをそのままブラウザで開かずにファイルダウンロードダイアログを表示するようになっています。その際にこのヘッダの filename パラメータを利用している場合、このパラメータで渡されたファイル名をファイルの保存時の既定のファイル名にします。ただし、クライアントコンピュータのロケールを日本語にしている場合、Internet Explorer ではこのパラメータで渡された文字列 (ファイル名) を Shift-JIS でエンコードされているものとして処理します。<br /></font><font style="FONT-SIZE: 0.8em">また、<strong>ASP.NET および .NET Framework では、構成ファイル globalization エントリ responseEncoding 属性の設定に関わらず、HTTP ヘッダを UTF-8 でエンコードして送信します。Internet Explorer では、UTF-8 でエンコードされたファイル名を Shift-JIS でエンコードされているものとして処理するため、ファイル名を正しく表示できません</strong>。<br /></font><font style="FONT-SIZE: 0.8em">Content-Disposition ヘッダのパラメータの文字コードのエンコード方式に関しては、RFC2231 に基づくべきですが、現行の Internet Explorer はこのエンコード方式をサポートしていません。 RFC2231 につきましては、以下の URL をご参照ください。</font></p></blockquote>
<p dir="ltr">Microsoftではファイル名をURLエンコードして回避するようにと記載していますが、これですとFireFoxなどほかのブラウザで文字化けをしてしまします。</p>
<p dir="ltr">ブラウザ毎にContent-Dispositionの記載を変更できるのであれば、IE向けにはURLエンコードをし、FireFoxにはなにもしないという対処もあります。</p>
<p dir="ltr">ASP.NET環境であれば下記の対応をするのがもっともシンプルかとおもいます。</p>
<p dir="ltr"><strong><font style="COLOR: #ff1111">Response.HeaderEncoding&nbsp; = System.Text.Encoding.GetEncoding( "SHIFT-JIS" );</font></strong></p>
<p dir="ltr">IE用に強引にSHIFT-JIS送信してあげればいいわけです。<br />ただし、これでは一部文字がまだ文字化けします。化けるのは2バイトコードで考えた場合、下位バイトが「５C」、「７C」の場合です。<br />「予 (0x975c)」→「誉 (0x975f)」　「表 (0x955c)」→「廟 (0x955f)」</p>
<p dir="ltr">これを避けるためには、該当する文字をURLエンコーディングしてあげます。(すべてURLエンコーディングしないのは、一定以上の文字列長になった場合にファイル名を省略するのを避けるためです)</p>
<p dir="ltr">&nbsp;</p>
<p dir="ltr"><strong>そのほか参考情報</strong></p>
<p dir="ltr"><a href="http://www.wsdeveloper.com/viewtopic.php?p=149">ダウンロード時に日本語ファイル名が文字化け</a></p>
<p dir="ltr"><a href="http://www.wsdeveloper.com/viewtopic.php?p=149">MSDNフォーラム日本語ファイルのダウンロードについて </a></p>
<p>&nbsp;</p>]]>
        <![CDATA[<p>(追記 2008/6/4)</p>
<p><a href="http://support.microsoft.com/kb/895262/ja">FIX: ASP.NET で Response.Addheader 方法を使用する場合、応答ヘッダーが UTF-8 として常にエンコードされます。 </a></p>
<p>.Net 1.1にはサービスパックがでています。</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p>private void Page_Load(object sender, System.EventArgs e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string filename="&lt;Some Korean Characters&gt;.txt";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.ContentType = "text/plain";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Clear();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer={65};&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.AddHeader("Content-Disposition","attachment;filename="+filename);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.BinaryWrite(buffer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Flush();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.End();<br />&nbsp;}</p></blockquote>
<p dir="ltr">本当にこれで文字化けしないのかは未確認です。<br />このFIXがあがったのと、前述の<a href="http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B436616">引用ページの日付</a>をみるとこちらのほうが古いんですよね・・・。</p>
<p>(追記 2008/9/5) </p>
<p>文字化けとは別に、ファイル名が途切れる問題が存在します。</p>
<p>こちらが発生する原因は、IEではダウンロードファイルをキャッシュフォルダに一時保存するのですが、そのときに「フォルダパス名 + ファイル名」が255文字を越えると途中で途切れます。</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p><span>C:¥Documents and Settings¥(ユーザ名)¥Local Settings¥Temporary Internet Files¥Content.IE5¥<strong>ｘｘｘｘｘｘｘｘｘ[0].zip</strong></span></p></blockquote>
<p>ユーザ環境によって発生条件が変わるのがいやらしい現象です。これといった解決方法はないので、あきらめて短めのファイルをアップ・ダウンするしかないのが現状です。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

</feed>

