[天気:まだ夜中]
#1
明けましたね
今年もよろしくお願いします。
#2
[鯖] 年明けメール
あんましやらないでね、と ISP が言ってもそんなもんは誰も聞かないわけでして…。
でも僕はおめでたいことだし、そんな制限で水をさすのもどうかと思うので
DoCoMo 辺りには是非制限じゃなく逆に期間限定で増強とかして頑張ってもらいたいなぁ
等と考えたりする。
ところで、
統計とって見たところ年明け2時間のメールトラフィックは通常の5倍〜20倍でした。
凄いねぇ。
でも、そんなこといってる僕もなんだかんだで日が昇るまでに50通ほどやってたらしい。
#3
今年の抱負
今年の抱負はどうしようかな?
去年は『英語を鍛える』だったなぁ、
一応 Load Of The Rings を英語で読むという大挙を成し遂げたから偉かったな。
内容把握は日本語訳でしたけど案外読めてて見直したよ(ぉ
んー、今年のはとりあえずまだ考え中だ。
初日の出見て、初詣行きつつ考えよっと。
[天気:晴れ]
小国神社に行ってきた。
あの山の中を通る裏道はやっぱし偉大だと思った。
@
おみくじ:
去年は凶だったが今年は
大吉
だった。
弟が1番で大吉。僕が2番で大吉だった。
今年は本厄だが今年も良い年でありますように(−人−)
#2
[実家] プレステ2
実家でぶらぶらしてたら突発的に欲しくなったので買ってしまった(^^;
ドラムマニアも中古でとても安く売ってたので買ってしまった。
[天気:曇りのち雨]
#1
[実家] 雨ザンザン
夕方から浜松駅で高校からの友人と待ち合わせて軽く新年会をした。
一人は京都で一人は名古屋だ。
インドネシア料理を食った。
結構美味かった。
インドネシア語で美味しいは「エナ」だそうな。
@
店を出たら雨が酷くてショボーン:
何故か僕が一番濡れていた。
毛皮のコートとかは水はじくみたいで良いなぁと思った。
@
新幹線:
こだまで帰った。
帰省時と同じく終電のこだまはやっぱり空いていた。
少し眠った。
[天気:晴れ]
#1
疲れてて
メチャクチャ寝てた。
起きたのは3時過ぎでした。
夕方から高松邸にお邪魔しに行った。
りさちゃんは寝かすとオートで座るようになっていた。
1ヶ月会わなかっただけだが大部元気に育ってた。
この時期の子供は成長が著しくて面白いね。
@
夕飯:
豚肉のなんとか風
*1
とミネストローネをご馳走になった。
美味しかった。
*1: 何風だったっか聞いたんだが忘れた(^^;
豚肉にローリエを貼り付けてその上に生ハムを貼り付けてバターで焼いて
最後にコンソメスープを少しジュワッって入れる料理。
[天気:晴れ]
#1
ぐーたら
昼過ぎまで寝てたりプレステ2をやったりと最後の休みを満喫した。
明日はもう会社かー…(--;
[天気:晴れ]
#1
仕事始め
事業所に人がいっぱい居てとても違和感を感じた。
でも午後には居なくなって元の閑散とした状態だった。
#2
ビッグオー
3年越しの謎
*1
が今解き明かされる!!
ビッグオーが帰ってきた!!
なべさん情報サンクス。
明日早速見よー。
[天気:晴れ]
さんまさん
が
XOOPS
(
日本
)試したいというし、他にも要望があったようなので入れた。
configure オプションは以下のようにしてみた。
./configure \
--prefix=/opt/php4 \
--with-apxs2=/opt/apache2/bin/apxs \
--enable-mbstring \
--enable-mbstr-enc-trans \
--enable-mbregex \
--enable-trans-sid \
--with-openssl \
--with-xml \
--with-pgsql=/opt/pgsql \
--with-mysql=/opt/mysql
このあと php.ini-dist を /opt/php4/lib/php.ini にコピーして以下の点を修正した。
safe_mode = On
register_globals = On
magic_quotes_gpc = Off
あと、apache の httpd.conf の php 周りの設定では以下を追加した。
LoadModule php4_module modules/libphp4.so
AddType application/x-httpd-php .php .php4
AddType application/x-httpd-php-source .phps
DirectoryIndex に index.php index.php4 を追加。
phpinfo()
で動作確認、どうやら動いてるようだ。
ず:一日中フォームにコントロールをピクセル単位で修正しつつ配置してたら、
ず:コントロールの幅とかが見ただけでピクセル単位で分かるようになってきてる自分が居る…。
れ:あふぉか(w
茶:かわずん中国人説浮上。
ず:フォームのここに配置したいと思ったらマウスで置かなくてもいきなり座標指定できるよ
ず:誤差数ピクセル以内らしい
ず:今日一日中こんなことしてたからなぁ…
茶:フォーム職人かわずん
れ:絶対なりたくないタイプの職人だな(w
ず:僕もそう思う
目が痛い…(=_ゞ
[天気:晴れ]
#1
[健康] 朝から下痢気味
トイレに篭って薬飲んでから出社。
とてもお腹が空いている。
#2
[.NET] 不要なリソースファイル
VS.NET でプロジェクトにファイルを追加するときに、
クラスを追加するときとコンポーネント等を追加するときは出来るファイルが違うので
多少気をつけたほうが良い。
テンプレートなソースファイルが違うのは見れば分かるが実はクラスを追加した場合は
cs ファイルだけだが、コンポーネント等を追加した場合は resx という拡張子がついた
リソースファイルが追加される。
しかし、コンポーネントといってもカスタムコンポーネントや拡張プロバイダコントロール
等の場合はリソースファイルは普通不要なので消してしまいましょう。
消し方は次の通りです。
- まず csproj ファイルをテキストエディタで開きます。
- プロジェクトファイルは XML です。 <VisualStudioProject> - <CSHARP> - <Files> - <Include> の下に
<File RelPath="ファイル名" ...> というのがたくさん並んでると思います。
そのうち要らないファイルを RelPath が指している File 要素を消しましょう。
- プロジェクトファイルを編集したらプロジェクトを開きなおして問題なく ビルドとテストが行えることを確認します。
- 最後に実際に要らないリソースファイル自体も消しましょう。
このようにして不要なリソースファイルをプロジェクトから削除することができます。
[天気:晴れ]
#1
冬眠暁を覚えず
年が明けて以来良く寝る。
いくら寝てもまだ眠いようだ。
布団の引力は未だ強力であった。
[天気:晴れ]
#1
[健康] 風邪かな?
今日は朝起きたときに咽喉が痛かった。
タンが絡む。
昼過ぎくらいから頭が痛くなってきたのでバファリン飲んだ。
でも他には特に体調悪くなかったからそのまま仕事して帰ってきた。
風邪と考えたら、ここ数日やたら眠かったのも説明がつくかもしれない。
明日はゆっくり休もう。
[天気:晴れ]
#1
[健康] 大分良くなった
やっぱし風邪だったっぽい?
何度か薬飲んだらいつの間にか咳も減ってきてた。
[天気:晴れ]
大分追い詰められてきた模様…。
[天気:晴れ]
#1
[仕事] HRP研修1日目
金曜なのに8時に家を出てしまった…。
今日は上野でHRP研修
*1
なので会社には行かないのだ。
@
ふむー:
重要。
@
はやっ:
5時半に終わったよー♪
久しぶりの早い帰宅。
*1: Human Resource Planing:今回はコミュニケーション訓練。
話し方・聞き方の基礎を始め、主に相手のニーズを引き出す訓練を中心にやった。
[天気:晴れ]
#1
[仕事] HRP研修2日目
土曜日なのに上野まで研修に出かける。
今日は実践演習メインだ。
やはりとても参考になる。
会社の金でこういう講習受けられるってのはやっぱ良いね。
@
昼飯:
何故かみんなとはぐれたので数人で適当な飯屋に入ってしまった。
ランチタイム真っ只中というのに自分たち以外誰も居ない店内…。
味はまずまずだけど量が少なかった。
戻って他の人達に聞いたところみんなで美味いカレー屋に言ったとのこと。
美味いカレー食べたかったな。
#2
[飯] 上海エキスプレス
豪華に3800円セットを頼んでみた。
北京ダックウマー。
[天気:曇りのち雨]
少ない休日をまったりごろごろ過ごす。
でも選択も纏めてしたよ。
[天気:晴れ]
#1
げぼげぼ
折角遅刻しないようにいつもより早く出たのに電車止まってやがる。
お陰で結局乗換え駅構内と品川駅前を全力ダッシュだよ…。
FeliCa 対応費接触 IC カードリーダ『PaSoRi』を購入!
Edy の残金照会とかクレジットカードでのネットでの入金とか、
Suica の残金チェックや乗降駅履歴が見れたりとかするらしい。
3千円くらいで売ってたので面白そうなので買ってみた。
後で遊んでみよう(ぉ
#3
ボーランドすげー
今日、ボーランドから『JBuilder8 Enterprise トライアルCD』って書いた青い封筒が
届いたんだが
*1
、中には『送付のご案内』って紙とカタログがいっぱい入ってるだけで
肝心の CD が無かったので、
別途送付ですか?それとも入れ忘れですか?
ってメールしたら、メール送信後30秒もたたずに電話が掛かってきた。
申し訳ありません入れ忘れですっ(--;
って、レスポンス早すぎ(w
*1: 実はもう2ヶ月くらい前にトライアル版を申し込んでいたのだが、
トライアルCDがまだ工場でもプレスされてないので出来ましたら送付しますって
言われてたんだよね。
それがやっと来たわけなんだが…。
#4
[メモ] SendInput とか
VBレスキュー
、ここのその他に SendInput の VB サンプルがあるので参考になる。
[天気:晴れ]
#1
[メモ] CVS-NT TIPS
cvs [server aborted]: cannot rename file C:/Repository/Age/,Sage.cs, to C:/Repository/Age/,Sage.cs,v: Permission denied
cvs commit 時にサーバがこんなメッセージを返してきたら CVSNT サービスを
再起動してやれば解決する。
このエラーが出る原因は謎(バグ)らしいがこれで対処できるので覚えておきたい。
*1
よく発生する場合は
net stop CVSNT
net start CVSNT
等と書いたバッチファイルを作っておくと楽チンである。
*1: 実はこれかなりはまったよ。
おかげで昨日は commit 出来ずに2,3時間も無駄にした…(--;
#2
[.NET][メモ] Transact-SQL
SqlServer で INSET した行の取得方法。
オートナンバー型の ID、整数型の V1、デフォルトが GETDATE() な日付型の V2
があるテーブル T1 の場合、Transact-SQL で
INSERT INTO T1 (V1) VALUES(1);
SELECT ID, V2 FROM T1 WHERE ID = @@IDENTITY;
としてやれば INSERT した行が取得できる。
[天気:晴れ]
#1
OJT報告会
今月はコンサルブと合同でワークショップやった。
プロジェクトマネージャやリーダーの苦労を知った。
大変面白かった。
[天気:晴れ]
#1
盛大に寝坊した
起きたら12時(ぉ
[天気:晴れ]
#1
[.NET] VS.NET と XML コメント
XML コメントをせっせと書いたら Visual Studio .NET の IntelliSense や
オブジェクトブラウザのコメントやツールチップに反映してくれると思って頑張ったんです。
でもプロジェクトを参照設定にしている場合にはツールチップとか出てたんですが、
コンパイルした DLL を参照設定した場合にはコメントが出ないんですよ。
折角頑張ったのに…(ホロホロ
こんな悩みがありましたとさ。
@
XMLコメントはDLLには含まれない:
XML コメントはソースファイルからドキュメント作成用に記述するものなので
コンパイルされたアセンブリには XML コメントは含まれていません。
その証拠に XML コメントをいくら記述してもアセンブリのファイルサイズは変わりません。
VS.NET でプロジェクトを参照設定すると XML コメントが表示されるのは
ソースコードがそこにあるから単に VS.NET が気を利かせてくれてるだけだと思ってます。
@
じゃ、どうしろと!?:
実際に DLL で参照設定をしたときに XML コメントを Visual Studio 等のツールで
有効にする為にはどうしたらよいかというと、やりかたは以下の通り。
ソースファイルから生成された XML ドキュメントを『アセンブリ名.xml』
としてアセンブリと同じディレクトリに置いておくことで
IntelliSense がそれを読み込んでコメントを表示してくれるようになります。
XML ドキュメントの生成方法はこんな感じ↓。
- コマンドラインの場合は csc.exe の引数に /doc:○○.xml を追加すると生成されます。
- Visual Studio .NET で開発している場合はプロジェクトのプロパティを開いて、 「構成プロパティ」の「ビルド」の「XML ドキュメントファイル」に『アセンブリ名.xml』
と入力しておくとビルド時に XML ドキュメントの生成も行ってくれます。
@
蛇足:
同じようなモノで、プロパティエディタの下部に表示されるコメントに関しては、
アセンブリの属性(DescriptionAttribute)を利用して実現されています。
具体的にはプロパティ名、イベント名、etc... の宣言の前に
[Description("コメント")] と書いてあげます。
こちらはコンパイル時に DLL に含まれるので DLL の参照だけで利用することが出来ます。
[天気:晴れ]
#1
[飯] スパゲッティ
柏の駅前通りにファーストスパゲティ屋(?)があったので入ってみた。
おそらくこの店のコンセプトはスパゲティの吉野屋だろうか、
全てのメニューが500円だった。
@
腹いっぱいすぎ:
写真をぱっと見て美味そうだったので
『かぼちゃのクリームスープ』と『ナスのトマトソーススパ』をさくっと頼んだのさ。
定員のお姉さんが何故か怪訝そうな顔で
どちらを先にお持ちしますか?
とか聞いてくるので不思議に思いつつ「どっちでもいいよ、一緒に持ってきて。」と答えた。
まず最初に来たのは…『かぼちゃのクリームスープ
スパ
』!!
…あれはそういう意味だったのか。
スープかと思ってたらスパを見落としてたのね。
食い始めるとすぐにもう一皿ナススパがドーンと。
目の前にはスパ2人前、
あぁ、食ったさそりゃー美味かったさ。
美味かったからまた今度行ってやるよチクショー。
美味かったけどとても負けた気分だった。
センターでちょっとした工事があったので夜中から働いた。
サーバルームは年中無休で寒い。
せめてあと2,3度高い温度で安定させてくれれば人やさしいのにな。
[天気:曇りのち雨]
#1
お大事に
>さんまさんとこ
#2
インフルエンザ
今、抗生物質が無いんだってね…。
でもとりあえず普通の(?)風邪でよかったね。
38度5分は充分大変だけど(^^;
[天気:雨]
雨は嫌いだ。
#2
[.NET] ASP.NET TIPS
@
クライアントにキャッシュさせない:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
@
PDF を BinaryStream で出力して IE で表示させる:
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "atachment; filename=hoge.pdf");
hoge.pdf の部分は拡張子が pdf な任意のファイル名を指定する。
@
レスポンスを圧縮する:
GZIP圧縮する為のフィルタクラスを作り、
Response.Filter にセットすることで実現できます。
具体的には Page の Init イベントや Load イベントに以下の2行
*1
を追加してやります。
Response.AddHeader("Content-Encoding", "gzip");
Response.Filter = new Jp.Kawaz.Web.Util.GZipFilter(Response.Filter);
ここで使っている GZipFilter クラスのソースは以下の通りです。
.NET フレームワークには圧縮アルゴリズムが無いので
SharpZipLib
*2
というライブラリを使用しています。
ここからダウンロードした DLL を bin フォルダに置いておいて下さい。
using System;
using System.IO;
using ICSharpCode.SharpZipLib.GZip;
namespace Jp.Kawaz.Web.Util
{
/// <summary>
/// 出力ストリームを圧縮する為のフィルタです。
/// <example>
/// <remarks>
/// 内容が html なら10分の1程度までトラフィックが軽減されると思います。
/// </remarks>
/// <example>
/// Page の Load イベントや Init イベント等に以下の2行を追加することで
/// クライアントへの送信が gzip 圧縮されます。
/// <code>
/// Response.AddHeader("Content-Encoding", "gzip");
/// Response.Filter = new Jp.Kawaz.Web.Util.GZipFilter(Response.Filter);
/// </code>
/// ※注意※<br>
/// Content.Server.Transfer を使う場合、ヘッダはクリアされるが Filter は
/// GZipFilter のままなので Transfer される側のページでは
/// Response.AddHeader("Content-Encoding", "gzip");
/// のみを行うこと。
/// </example>
/// </summary>
public class GZipFilter : MemoryStream
{
private Stream sink;
public GZipFilter(Stream sink) : base()
{
this.sink = sink;
}
public override void Close()
{
GZipOutputStream gzip = new GZipOutputStream(sink);
WriteTo(gzip);
gzip.Close();
base.Close();
}
}
}
ほんとは
Response.Filter =
new ICSharpCode.SharpZipLib.GZip.GZipOutputStream(Response.Filter);
の様に使おうとしたんだがコレだとエラーになったので
上記の様なクラスを作った。
@
ブラウザの能力を見る:
このままだと全てのクライアントに対して gzip 圧縮したコンテンツを返してしまうので
gzip を理解できないクライアントではそのページを見ることが出来なくなってしまう。
なので Filter を設定する部分は本来以下のようにするべきである。
foreach(string enc in Request.ServerVariables["HTTP_ACCEPT_ENCODING"].Trim().ToLower().Split(','))
{
if(enc.Equals("gzip") || enc.Equals("x-gzip"))
{
Response.AddHeader("Content-Encoding", "gzip");
Response.Filter = new Jp.Kawaz.Web.Util.GZipFilter(Response.Filter);
break;
}
}
@
HTTPモジュールで実装:
GZipFilter のみを実装して利用する場合は上で説明したように、
各 aspx ページに GZipFilter を使う為の記述が必要だったが各ページでこれを行うのは
とても面倒いし、間違えて2重に Filter を設定してしまったり、また Response.Server.Transfer を行う場合に不具合が発生しやすいなどの理由で
あまり良いやり方ではないと思っていた。
そこで IHttpModule を継承して HTTP モジュールとして GZipModule を作り
Web.config でそれを使うよう記述するだけで全てのコンテンツで gzip 圧縮を
有効にしようと頑張ってみた。
それで出来たのが以下に示す GZipModule です。
using System;
using System.Web;
namespace Jp.Kawaz.Web.Util
{
/// <summary>
/// レスポンスを圧縮する為の HTTP モジュールです。
/// </summary>
/// <remarks>
/// ブラウザが gzip を解釈できる場合は HTTP のレスポンスを gzip 圧縮します。
/// これにより text/html なコンテンツなら10分の1程までトラフィックを軽減することが出来ます。
/// </remarks>
/// <example>
/// 使い方は Web.config に GZipModule を使うように以下の記述を追加するだけです。
/// <code>
/// <configuration>
/// <system.web>
/// <httpModules>
/// <add name="GzipModule"
/// type="Jp.Kawaz.Web.Util.GzipModule, Jp.Kawaz.Web.Util" />
/// </httpModules>
/// <system.web>
/// </configuration>
/// </code>
/// </example>
public class GZipModule : IHttpModule
{
void IHttpModule.Dispose()
{
}
void IHttpModule.Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(OnBeginRequest);
}
private void OnBeginRequest(object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender;
foreach(string enc in
context.Request.ServerVariables["HTTP_ACCEPT_ENCODING"].Trim().ToLower().Split(','))
{
if(enc.Equals("gzip"))
{
context.Response.AddHeader("Content-Encoding", "gzip");
context.Response.Filter = new AESC.Web.Lib.GZipFilter(context.Response.Filter);
break;
}
else if(enc.Equals("x-gzip"))
{
context.Response.AddHeader("Content-Encoding", "x-gzip");
context.Response.Filter = new AESC.Web.Lib.GZipFilter(context.Response.Filter);
break;
}
}
}
}
}
このモジュールを利用するように Web.config に以下のように httpModules に add する。
<configuration>
<system.web>
<httpModules>
<!-- ブラウザが gzip を解釈できる場合はレスポンスを gzip 圧縮します。-->
<add name="GZipModule" type="Jp.Kawaz.Web.Util.GZipModule, Jp.Kawaz.Web.Util"/>
</httpModules>
</system.web>
</configuration>
ここで、<add> の type の記述方法だが、詳しくは
MSDN
を見て欲しいが、
簡単に説明すると一つ目が IHttpModule を継承するクラスのフルネームで
次の Jp.Kawaz.Web.Util はこのモジュールが含まれるアセンブリ名です。
例えばこの例では Jp.Kawaz.Web.Util.dll にこのモジュールが含まれていることを
表しています。
当然 WEB フォルダの bin ディレクトリにはこの dll を置いておく必要があります。
GZipModule を適用すると asmx ページ、つまり Web サービスが動かなくなる不具合が
発覚しました。
場当たり的な対策
を書いたので参照すること。
*1: この2行は gzip 圧縮する為の本質的な部分のみを抜き出してあります。
実際はこの2行だけだと問題があるので
『ブラウザの能力を見る』
で書いたようにしてください。
*2: SharpZipLib のライセンスについて:このライブラリは GPL で公開されていますが、
例外事項により API としての利用なら商用のクローズドソースでも
利用可能となっているのでお仕事でも安心して使えるようです。
[天気:晴れ]
#1
晴れ!!
雨止んでよかったー。
この時期の雨はカナリ鬱だからな。
#2
IHttpModule
使い方が分かってくるととても便利だ。
昼休みに gzip 圧縮するモジュールを作ってみた。
ホントは今日やった内容なんだが昨日の続きなので
昨日の日記
に追記した。
フィルタとして考えただけでも余分な空白を消すフィルタとか、
クライアントによって hdml に変換するフィルタとか色々考えられそうだ。
[天気:晴れ]
#1
[.NET] スマートクライアント
.NET の世界では exe や dll がイントラネットやインターネットから
直接起動することが出来る。
とても危険そうな機能。
でも .NET フレームワークのセキュリティに不備が無ければとても便利かもしれません。
@
厳しいんだこれがまた:
しかし当然実際に使ってみようと思えば何も考えずに書いたコードならば9割方は
SecurityException で動かないだろう。
ここを乗り越えるのがマジ大変。
そしてこの件に関する情報がホントに無いのが困りモノなのである。
@
重要書籍ハケーン!!:
Visual C#.NETによるWebプログラミング入門―XML WebサービスとWebアプリケーション構築のノウハウ
これはスマートクライアントと .NET のコードアクセスセキュリティについての
書籍としては是非読んでおきたい。
っていうかこの本でも充分には解説されているわけではないが、
今のところこの本以外でスマートクライアントの実行について詳しく書いている
書籍やサイトは見たことが無い。
ホントにドキュメントが少ないのだ…。
この本を他のサイトで照会してるのを発見して即 amazon でゲット。
表紙の雰囲気等からパッと見内容が薄そうなんだが、
ところどころ詳しい解説があってなかなか侮れない。
特に60ページにわたるスマートクライアントの解説は必見だと思った。
@
ところで:
上記リンクから購入してくれると僕に amazon から紹介料が入るらしい。
初めて設置してみたのでどうなるのか誰か試してもらいたい(笑
っていうか自分で買うときもここ経由で買うと紹介料入るらしいので
実質的に割引で本が買えるということか(ぉ
今後本を買うときはこのてを使ってみようと思う。
#2
[.NET] System.IO.Directory(dirName, "*.txt") はクソ
普通こう書いたら dirName ディレクトリにある拡張子が txt なファイルの一覧が
取得できると思うだろう。
実際 MSDN を見てもそのようにしか見えない。
しかし実際にはコレは *.txt_ や *.txt~ や *.txtあああ のようなファイルまで
引っかかってしまうらしいのだ。
これは何故かというと 8.3 形式のファイル名にするとこれらは全て *.txt に
なってしまい、結果 *.txt で引っかかるのだ。
正に FAT の呪い…(--;
@
結局:
これについて調べてみたがどこかのフラグで 8.3 形式ファイル名を
無効に出来るようなことは出てこない。
つまり拡張子が txt なファイルの一覧が欲しければ以下のようにするしかないっぽい。
foreach(string fname in Directory.GetFiles(dirName)
{
if(fname.EndWith(".txt"))
{
(何かの処理)
}
}
うーむ、かなり怒る…。
[天気:晴れ]
#1
早すぎー
余裕で9時前に会社につける時間に品川についてしまった…。
困ったので適当に朝飯を食べつつモーニングを読んでから出社。
それでも充分早かったらしい。
[天気:晴れ]
ねむねむねむねむねむねむねむねむ…。
#2
[.NET] VS.NET で自動ビルド
プロジェクトやソリューションを自動的にビルドしたいが、
今更 NAnt を導入してみるほどの余裕は無い。
なんとか Visual Studio だけで自動ビルドが出来ないものだろうか…。
こんなことを悩んでたんだが意外と簡単に出来てしまうことが分かったのでメモっておく。
実は以下のようにコマンドラインでソリューションやプロジェクト出来るのだ。
devenv FooBar.sln /build DEBUG
devenv FooBar.sln /project Boe.csproj /projectconfig Release
一つ目は FooBar ソリューションをデバッグビルドする。
2つ目は FooBar ソリューション中の Boe プロジェクトをリリース構成でリビルドする。
コレだけで大体分かると思うが他にもいくつかオプションがあるので詳しくは
devenv /?
としてやればコマンドラインオプションについてのヘルプが出る。
引数が無かったり間違えたりして devenv を実行すると
普通に Visual Studio が起動してしまうので注意。
#3
[.NET] WEB サービスは gzip 圧縮できない?
数日前に作った HTTP のレスポンスを圧縮する為の
GZipModule
だがこれを適用していると asmx ページ、つまり WEB サービスが使えなくなってしまった。
まだ原因は未調査だがとりあえずの対策として、リクエストが asmx の場合は
gzip 圧縮しないようにしておくことにした。
以下のように OnBeginRequest メソッドを修正する。
private void OnBeginRequest(object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender;
//WEBサービスだったら何もしない
if(context.Request.FilePath.EndsWith(".asmx"))
{
return;
}
//ACCEPT_ENCODING を見て GZipFilter をセットする
(…以下略…)
}
原因が分かったらちゃんとしたアプローチでの解決はする予定。
@
解決(2月19日追記):
結論は wsdl.exe で wsdl から生成したプロキシクラスは Accept-Encoding を送ってない
為、gzip 圧縮がされません。
しかし普通なら圧縮されないだけですが実は GZipModule に不具合があり
Accept-ncoding が送られてこない場合に例外が発生してエラーになってしまっていました。
ですのでそこを修正します。
修正個所は GZipModule の OnBeginRequest メソッドです。
以下が修正部分です。
private void OnBeginRequest(object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender;
//ACCEPT_ENCODING が送られていない場合は何もしない
string strAcceptEncoding = context.Request.ServerVariables["HTTP_ACCEPT_ENCODING"];
if(strAcceptEncoding == null)
{
return;
}
//ACCEPT_ENCODING を見て GZipFilter をセットする
foreach(string enc in strAcceptEncoding.Trim().ToLower().Split(','))
{
if(enc.Equals("gzip"))
{
context.Response.AddHeader("Content-Encoding", "gzip");
context.Response.Filter = new AESC.Web.Lib.GZipFilter(context.Response.Filter);
break;
}
else if(enc.Equals("x-gzip"))
{
context.Response.AddHeader("Content-Encoding", "x-gzip");
context.Response.Filter = new AESC.Web.Lib.GZipFilter(context.Response.Filter);
break;
}
}
}