2007年4月27日金曜日

Day 0: 基礎とインストール

元記事

「31日間ReSharper一周」にどっぷり進む前に言っとくけど、僕は退屈だけど書かなきゃならないことを書いている。1日目まで飛ばして構わない(ReSharperをインストールするのなら、ざっと目を通すぐらいはしたいかもしれないけど)。


IDEとバージョン


ReSharperの最新版はVisual Studio 2005でしか動かない。Visual Studio 2003で動く旧バージョンがまだ手に入るけど、超すごい機能を全部持ってるわけではない。


これを書いている時点では、ReSharperの最新版(つい1週間前に出た)は2.5.1だった。2.5にあった小さいバグがいくつか修正されたので、書くネタが予定より少なくなってしまった。いくつかの困った点をどう回避するかに関して話すつもりだったから。逆に、2.5では動いたんだけど2.5.1ではぶっ壊れていることがらもちょっとある(もうフィードバックしてある)。


インストールに関して知るべきこと


警告: ReSharperを初めてインストールするときに、Visual Studio Hotfixをインストールするように言われるが、これには「永久の眠りか!」ってぐらい時間がかかる。仕事PCにインストールしたのは結構前だから、どれくらいかかったのか覚えてない。でも最近家のノートPCにインストールした時には(冗談抜きで)4時間以上かかった。そりゃあ僕の家のノートPCは850MHzでメモリは256MBにすぎない。でもそうは言っても4時間だぜ。推して知るべし。


(もちろん、ReSharperにはインストール時間分の価値はある。でも退社する15分前にインストールを始めたいかもしれない。そんな時には「すべてYes」をクリックして家に帰ることができる。翌朝にはReSharperのインストール準備が完了しているだろう。)


ヘルプをインストールする(もしくは、しない)


ReSharperのインストールウィザードは、ヘルプをインストールするか尋ねてくる。MSDNヘルプ全体のインデックスを再構築しなければならないから時間がかかるよと言われる。


冗談抜きで長くかかるぞ。たぶんインストールには30分かそこらかかる(しかも、パワフルな仕事用PCでの計測だ。CPUは3GHzでメモリは2GB積んであった)。


でも……理解できない。ReSharperのダイアログはどれにもヘルプボタンがないし、F1キーにも反応しない。Visual Studio からヘルプを起動してみても、ReSharperのヘルプトピックはまったく見つからなかった。いったい何のヘルプをインストールしてんの?!


だから、少なくともReSharper2.5.1に関して、ヘルプをインストールするためのチェックボックスにチェックしないことを勧める。意味があるとは思えないから。


公式サイトにあるもの



サポートはかなり反応がいい。これらの記事を書いていたときに僕は何度か、「うーん、ReSharperであれとかこれとかができたならもっとすごいのに……」と書きたくなった。でもそのたび僕は筆を置いて公式サイトに行き、バグレポートや機能向上の要求を送った。反応は本当にいい――いつもはだいたい数時間以内に返事がある。もし「その件についてはリストに追加しておきます」という返事であっても、レスポンスが素早いのは良いことだ。


この前なんか、1、2か月前なんだけど、もらった返事は「その機能を追加しました。今週後半に出すアップデートに含まれています。」だった。たぶん僕が言う前から既に追加されてたんだとは思うが、それでも、ある会社がバグレポートと機能要求に関してそのぐらいの対応をしようとするなんて、かなり凄いこと(そして、めったにないこと)だ。

31日間ReSharper一周

移動しました

2007年4月26日木曜日

"Tower Of Power"のコピバン、GWにライブ

同僚がやってるコピバンがライブやる。




バンド名
Power Of Tower

日時
5/6(日)14:30開場、15:00開演

場所
新中野 LiveCafe弁天

料金
チャージ¥1,000 Drink¥500



ファンクバンド"Tower Of Power"のコピーバンドです。同僚はキーボーディスト。体調を崩して休職してましたが、5月から完全復帰とのこと。めでたい。
"Tower Of Power"を知らない人のために、YouTubeに上がっていた動画を紹介。

  • Soul Vaccination(YouTube) Soul Vaccination

  • What Is Hip(YouTube) What Is Hip

  • Soul with a capital S(YouTube) Soul with a capital S

2007年4月25日水曜日

ASP.NET AJAXで他ドメインのWebサービスを呼び出す part1

AJAXは便利なんですが、XMLHttpRequestのセキュリティ制限により、他ドメインの呼び出しはできません。これを回避する技は(JSONPなど)いくつかありますが、ASP.NET AJAXにはそれらを簡単に扱う道具は用意されていません。というか、ASP.NET AJAX Futuresには、IFrameを利用して他ドメインを呼び出すためのライブラリが含まれていたのですが、現在のFutures CTPからは除かれています。セキュリティのためにも、その手の機構には慎重になるべきですね。


ということで、ASP.NET AJAXで他ドメインを呼び出すのであれば、自ドメイン上に置いたXML Webサービスを通して呼び出すしかありません。呼び出したいのが他ドメインのXML Webサービス(要するにSOAP)であれば、あまりコードを書くこともなく実現できますが、REST APIとかXML-RPCだったらどうでしょうか。


……と思っていたら、ASP.NET AJAX Futuresに便利なものがありました。それが、asbxファイルです。



asbxファイルは、他ドメインのサービスへの橋渡し(bridge)をするクラスを作り出します。しかも、GETメソッドを使うREST APIであれば結構簡単に書けます。


サンプルを書く前に注意。Web.configは、Futures CTPを扱えるようにしておいてください。ふつうにインストールをすると、asbxファイルを扱うための設定が間違っているので、<system.web>要素の中の以下の部分を修正してください。



<compilation>
<buildProviders>
<-- アスタリスクは不要
<add extension="*.asbx" type="Microsoft.Web.Preview.Services.BridgeBuildProvider"/>
-->
<add extension=".asbx" type="Microsoft.Web.Preview.Services.BridgeBuildProvider"/>
</buildProviders>
<compilation>


さて、Web.configの設定が終わったところで、サンプルとして呼び出すのは……( AWS を使うことが多いんですが登録が必要なので今回はやめて )……Livedoorのお天気Webサービスにしましょう。


まずは仕様を確認しましょう。呼び出しURLは http://weather.livedoor.com/forecast/webservice/rest/v1 です。パラメータは2つ、cityとdayです。これらをURLクエリパラメータとして付加し、HTTP GETで取得します。さてこれをasbxで書いてみましょう。ファイル名はとりあえず、lwws.asbxとでもしましょうか。





<?xml version="1.0" encoding="utf-8" ?>
<bridge namespace="MyNamespace" className="MyClass">
<proxy type="Microsoft.Web.Preview.Services.BridgeRestProxy"
serviceUrl="http://weather.livedoor.com/forecast/webservice/rest/v1" />
<method name="getWeather">
<input>
<parameter name="city" />
<parameter name="day" />
</input>
</method>
</bridge>


これだけでも動かせます!



asbxファイルをこのように書くとどうなるかというと……次のXML Webサービスみたいなものができたのと同様に扱えます。



namespace MyNamespace
{
[WebService]
[ScriptService]
public class MyClass : System.Web.Services.WebService
{
[WebMethod]
public string getWeather(object args)
{
// Livedoorお天気Webサービスを呼び出すコード
}
}
}



よって、ScriptManagerのServicesプロパティでlwws.asbxを指定してやれば、JavaScriptからは、



MyNamespace.MyClass.getWeather(args, succeeded);

といったスクリプトで呼び出すことができます(注:succeededは呼び出し成功時のコールバック関数)。




さてここで疑問が2つ浮かびます。そうです。「引数は?」「戻り値は?」という疑問です。


まずは引数から。JavaScriptではこんな感じで書きます。



var args = new Object();
args.city = 63; // 東京地方を指定。サービス仕様を確認のこと。
args.day = 'tomorrow'; // 明日の予報を指定。サービス仕様を確認のこと。
MyNamespace.MyClass.getWeather(args, succeeded);

あるいはこう書いてもOKです。



var args = { city: 63, day: 'tomorrow' }
MyNamespace.MyClass.getWeather(args, succeeded);

詳細は省略しますが、すべてのオブジェクトは連想配列であると知っていれば、結果が同じであることは分かるでしょう。




次は戻り値です。ここは少し長くなりますよ。


上で書いたXML Webサービスのメソッドシグネチャを見返してください。戻り値はstringになっていますね。そうです。お天気Webサービスの結果として得られるXMLがそのまま文字列として返されます。長くなるので、http://weather.livedoor.com/forecast/webservice/rest/v1?city=63&day=tomorrow で実物を見てください。



もちろん、この文字列をもとにDOMオブジェクトを作って、必要な部分を操作することもできますが、面倒ですよね。面倒だといってください。そんな人のために、結果をサーバ側で変換して、扱いやすい形式にすることができます。


Futures CTPには、Microsoft.Web.Preview.Services.IBridgeResponseTransformerインタフェースと、それを実装するクラスが4種類含まれています。今回はそれらの実装クラスの中から、 Microsoft.Web.Preview.Services.XPathBridgeTransformer クラスを説明しましょう。


XPathBridgeTransformerクラスの使い方ですが、これもasbxファイルに記述します。たとえばこんな感じ。





<?xml version="1.0" encoding="utf-8" ?>
<bridge namespace="MyNamespace" className="MyClass">
<proxy type="Microsoft.Web.Preview.Services.BridgeRestProxy"
serviceUrl="http://weather.livedoor.com/forecast/webservice/rest/v1" />
<method name="getWeather">
<input>
<parameter name="city" />
<parameter name="day" />
</input>
<transforms>
<transform type="Microsoft.Web.Preview.Services.XPathBridgeTransformer">
<data>
<attribute name="selector" value="/lwws" />
<dictionary name="selectedNodes">
<item name="Area" value="location/@area" />
<item name="Prefecture" value="location/@pref" />
<item name="City" value="location/@city" />
<item name="DateTime" value="forecastdate" />
<item name="Forecast" value="telop" />
<item name="Description" value="description" />
<item name="MaxTemperature" value="temperature/max/celsius" />
<item name="MinTemperature" value="temperature/min/celsius" />
</dictionary>
</data>
</transform>
</transforms>
</method>
</bridge>



こんな風に書くと、JavaScriptでは戻り値にこんな風にアクセスできます。





function succeeded(result) {
var area = result[0].Area;
var pref = result[0].Prefecture;
var city = result[0].City;
var datetime = result[0].DateTime;
var forecast = result[0].Forecast;
var desc = result[0].Description;
var max = result[0].MaxTemperature;
var min = result[0].MinTemperature;
}



要は、戻り値がオブジェクト(連想配列)の1次元配列になります。




なぜこうなるのか?というと、XPathBridgeTransformerクラスは、XPathで指定された要素を抜き出してくれるからです。asbxファイルの記述を見ながら説明しましょう。




まず見るべきなのは<attribute>要素です。name="selector"はXPathBridgeTransformerクラスのためのおまじないです。注目すべきはvalue属性で、ここに1次元配列として抽出する要素を表現するXPathを書きます。ここでは"/lwws"を指定しているので、ルート要素である<lwws>を抜き出します。(なので配列の要素数は1です。)


続いて<dictionary>要素です。name="selectedNodes"もXPathBridgeTransformerクラスのためのおまじないです。その子要素である<item>要素で、連想配列に格納する値を指定します。たとえば最初の記述は<item name="Area" value="location/@area" />ですね。これで、ルートの<lwws>要素直下にある<location>要素のarea属性の値を抜き出し、Areaというキーで連想配列に追加します。以下も同様ですので説明は省略します。


というわけで、結果は連想配列の1次元配列となるわけです。ちなみに連想配列の値は文字列型となっています。数値型や日付型やブール型を期待すると痛い目にあいます。

2007年4月22日日曜日

週末の写真いくつか

ベランダでハーブを育てようとしている。
ハーブ

鹿浜のスタミナ苑に行った。
スタミナ苑
レバーがうまかった。
レバー
ミックスホルモンもうまかった。
ミックスホルモン
でもハラミは品切れだった。悔しいです!(ものすごい顔で)

木場の陳麻婆豆腐に行った。
前に来たときに一番辛いやつで死んだので、激辛と辛口の間ぐらいにしてもらった。
陳麻婆豆腐

船橋のIKEAに行った。
広いので疲れた。会社用の小物ばかりを買った。
IKEA

2007年4月21日土曜日

Web+DBでつきぬけろ!

見本誌いただきました。いつもありがとうございます。
vol38書影

連載「.NET開発天国」は尾島・猪股の連名でやっているんですが……今号は最後尾です。
ジャンプなら打ち切り間近だなこりゃ。

ここで次号予告!!次号はASP.NET AJAX登場!!非同期ポストバックでつきぬけろ!→[マタ]

2007年4月20日金曜日

もんたメソッドに効果音が欲しくて

MP3を用意してみましたよ。

教科書にも載った「もんたメソッド」。
なんと!今回は効果音つきです。


音のファイルはこちら。記憶だけで作ったんだけど、音違ってないですかね。明日テレビで確認してみます。(追記)確認したら違ってたので直しました。「♪朝ズバッ!」てな感じで。

たぶんWinのIEとFireFoxでは出ると思うんですが。音が出なければごめんなさい。もっとましなスクリプトに直してください。
(2013/5/21 追記)jsdo.itに置いてみました。

2007年4月19日木曜日

一二功夫

「イー・アル・カンフー」のテーマソングを、中国の伝統楽器(胡弓とか)で演奏したものが聞きたい。
生演奏がいいけど、難しいなら打ち込みでもいいや。

えーと、仕事してないときはこういうことばっかり考えています。

2007年4月18日水曜日

MCPD試験のメモ

自分のためのメモ。 マイクロソフト認定プロフェッショナル デベロッパー(MCPD)となるために受験しなければならないMCP試験の内容をまとめてみました。 (複数ページを何度も見返すのが面倒だったため)
スキル詳細スキル70-55170-55270-55370-554
(a) 共通
システム型およびコレクションを使用するアプリケーションの開発.NET Framework 2.0 のシステム型を使用して .NET Framework アプリケーションでデータを管理する (System 名前空間を参照)。
コレクションを使用して .NET Framework アプリケーション内で関連するデータのグループを管理する (System.Collections 名前空間を参照)。
ジェネリック コレクションを使用して .NET Framework アプリケーションのパフォーマンスと型の安全性を向上させる (System.Collections.Generic 名前空間を参照)。
標準的な規約にコンポーネントが従うように .NET Framework インターフェイスを実装する (System 名前空間を参照)。
.NET Framework アプリケーションへの構成、診断、管理、およびインストール機能の組み込み.NET Framework アプリケーションに構成管理機能を組み込む (System.Configuration 名前空間を参照)。
System.Diagnostics 名前空間を使用して .NET Framework アプリケーションをデバッグおよびトレースする。
.NET Framework アプリケーションでのシリアル化および入出力機能の実装ランタイム シリアル化手法を使用してオブジェクトまたはオブジェクト グラフをシリアル化またはシリアル化解除する (System.Runtime.Serialization 名前空間を参照)。
System.Xml.Serialization 名前空間を使用して XML 形式へのオブジェクトのシリアル化を制御する。
ファイル システム関連のクラスを使用してファイルとフォルダにアクセスする (System.IO 名前空間を参照)。
.NET Framework アプリケーションでストリーム情報を圧縮または展開する (System.IO.Compression 名前空間を参照)。 分離ストレージを使用してアプリケーション データのセキュリティを向上させる (System.IO.IsolatedStorage 名前空間を参照)。
.NET Framework 2.0 のセキュリティ機能を使用した .NET Framework アプリケーションのセキュリティの向上System.Security.AccessControl のクラスを使用してアクセス制御を実装する。
System.Security.Authentication のクラスを使用してカスタム認証スキームを実装する (System.Security.Authentication 名前空間を参照)。
System.Security.Cryptography のクラスを使用してデータの暗号化、復号化、ハッシュ演算を行う (System.Security.Cryptography 名前空間を参照)。
System.Security.Permission のクラスを使用してリソースに対するアクセス許可を制御する (System.Security.Permission 名前空間を参照)。
System.Security.Policy のクラスを使用してコード特権を制御する (System.Security.Policy 名前空間を参照)。
System.Security.Principal のクラスを使用して ID 情報のアクセスと変更を行う (System.Security.Principal 名前空間を参照)。
.NET Framework アプリケーションでの相互運用機能、リフレクション、およびメール機能の実装.NET Framework アプリケーションから配信するために SMTP (Simple Mail Transfer Protocol) サーバーに電子メールを送信する (System.Net.Mail 名前空間を参照)。
.NET Framework アプリケーションでのグローバリゼーション、描画、およびテキスト操作機能の実装System.Drawing 名前空間を使用して .NET Framework アプリケーションのユーザー インターフェイスを強化する。
(b) Web アプリケーションのテクノロジ
Web アプリケーションの作成およびプログラミングWeb サーバー コントロールを追加および設定する。
Web アプリケーションを設定する。
Web アプリケーションをプログラミングする。
ADO.NET、XML、およびデータ連結コントロールを使用した Web アプリケーション内のデータの統合データ連結コントロールを実装する。
データベースの接続とトランザクションを管理する。
接続された環境でデータを作成、削除、編集する。
カスタム Web コントロールの作成複合 Web アプリケーション コントロールを作成する。
アプリケーションのトレース、設定、配置Web コピー ツールを使用して Web アプリケーションをターゲット サーバーにコピーする。
Web 公開ツールを使用して Web アプリケーションをプリコンパイルする。
Web アプリケーションの最適化とトラブルシューティングを行う。
Web アプリケーションのカスタマイズおよびパーソナライズマスタ ページを使用して一貫性のあるページ デザインを実装する。
テーマとユーザー プロファイルを使用して Web ページをカスタマイズする。
Web アプリケーションで Web パーツを実装する。
認証および承認の実装フォーム認証を使用してユーザーのアイデンティティを確認する。
承認を使用して認証済みユーザーの権限を設定する。
ログイン コントロールを使用して Web アプリケーションに対するアクセスを制御する。
ASP.NET モバイル Web アプリケーションの作成モバイル Web アプリケーション プロジェクトを作成する。
デバイス固有のレンダリングを使用して各種のデバイスにコントロールを表示する。
アダプティブ レンダリングを使用して Web サーバー コントロールの外観を変更する。
モバイル Web コントロールを使用してデバイスにコンテンツを表示する。
(c) Windows アプリケーションのテクノロジ
標準コントロールによる Windows フォーム アプリケーションの UI の作成Windows フォーム上のコントロール レイアウトを管理する。
Windows フォーム コントロールの追加と設定を行う。
メニューの作成および設定
Windows フォーム アプリケーション内のデータの統合データ連結コントロールを実装する。
接続およびトランザクションの管理
XmlReader クラスおよび XmlWriter クラスを使用して XML の読み取り、書き込み、および検証を行う。
ユーザビリティの強化ユーザー アシスタンスのコントロールおよびコンポーネントを作成、設定、カスタマイズする。
非同期プログラミング テクニックの実装によるユーザー エクスペリエンスの向上BackgroundWorker コンポーネントを使用してバックグラウンド処理を管理する。
アプリケーションの設定および配置ClickOnce テクノロジを使用して、Windows フォーム アプリケーションのインストールを設定する。
(d) 分散 アプリケーションのテクノロジ
Web サービス アプリケーションの設定とカスタマイズSOAP メッセージを設定する。
リモート処理アプリケーションの作成、設定、配置サーバー アプリケーションを作成および設定する。
リモート オブジェクトにアクセスするクライアント アプリケーションを作成する。
リモート型を作成およびシリアル化する。
Web Services Enhancements (WSE) 3.0 の実装クライアント アプリケーションとサーバー アプリケーションで WSE を有効にする。
デジタル署名を SOAP メッセージに追加する。 既存の SOAP メッセージの署名を確認する。
SOAP メッセージを暗号化および復号化する。
Web サービス アプリケーションのポリシーを実装する。
Web サービス アプリケーションでフィルタを実装する。
WSE SOAP メッセージングを実装する。
WSE ルーターを使用して SOAP メッセージをルーティングする。
セキュリティ資格情報を追加および確認する。
サービス コンポーネントの作成およびアクセスとメッセージ キューの使用サービス コンポーネントの作成、設定、アクセスを行う。
メッセージ キューの権限を作成、削除、設定する。
メッセージ キューにメッセージを送信する。 メッセージ キューからメッセージを削除する。
メッセージを受信する。
(e) 応用
アプリケーションの構想と設計アプリケーション設計のコンセプトが技術的に実現可能であるか評価する。
ビジネス上の要件を満たすためにアプリケーションの技術仕様を評価する。
データベース設計を評価する。
アプリケーションの論理設計を評価する。
アプリケーションの物理設計を評価する (プロジェクト構造の設計、ファイル数、アセンブリ数、これらのリソースのサーバー上の場所など)。
概念の実証 (POC) のプロトタイプを作成する。
ユーザー インターフェイスの設計と開発視覚的インターフェイスについて適切なレイアウトを選択する。
UI 全体に共通するレイアウトの実装方法を評価する。
設計仕様に基づいて適切なコントロールを選択する。
UI 階層における適切なデータ検証方法を選択する。
適切なユーザー アシスタンスおよびアプリケーション ステータス フィードバック手法を選択する。
コンポーネントの設計と開発コンポーネントに必要な特性を決定する。
コンポーネントの高レベル設計を行う。
コンポーネントのパブリック API を開発する。
コンポーネントの機能を作成する。
例外処理メカニズムを作成する。
コンポーネントのデータ アクセスおよびデータ処理機能を作成する。
プロファイリングの要件を含むコンポーネントを作成する。
Web サービスとメッセージ キューを使用して分散アプリケーションにマルチメディア データを提供するための適切なメカニズムを選択する。
アプリケーション フレームワークの設計と開発再利用可能なソフトウェア コンポーネントを使用する。
適切な例外処理メカニズムを選択する。
アプリケーション設計ロジックに対して適切な実装アプローチを選択する。
アプリケーションに対して適切なイベント ログ記録方法を決定する。
アプリケーション設定アーキテクチャを評価する。
アプリケーションの特定の特性や側面を監視する。
アプリケーションのテストと安定化コード レビューを実行する。
テスト方法を評価する。
単体テストを設計する。
統合テストを実行する。
バグを解決する。
アプリケーションの配置とサポートパフォーマンス分析方法に基づいてアプリケーションのパフォーマンスを評価する。
アプリケーション監視時に受信したデータを分析する。
配置計画を評価する。
実稼働構成環境を検証する (負荷分散、Web ファーム、Web ガーデンなど)。
アプリケーション フロー ロジック図を作成する。

2007年4月15日日曜日

いわしのムニエル&キャベツのスープ

美味くできた。

いわしのムニエル


いわしが2尾で90円だったので。

  • いわしを指で開く

    • 洗ってうろこを取る

    • 頭を落とす

    • 腹びれを取って腹を開き、わたを取る

    • よく洗う

    • 片側の身と骨の間をこそぐようにして切り開く

    • 同様にもう片側もこそぎ、背骨をはずす

    • 尾の部分は折るなり切るなりする

    • 背びれも適当に取る


  • 塩こしょうを適当に

  • 小麦粉をまんべんなくまぶす。好みで小麦粉に粉チーズを混ぜておく

  • フライパンにバターを溶かし、皮の方を強火で焼く

  • ひっくり返して白ワインを振り、アルコールが飛んだらふたをして弱火にする

  • 火が通ったら取り出す

  • レモン汁と醤油をフライパンに入れて煮立て、ソースにする


前に買ったカルピス醗酵バター(業務用、無塩)をどんどん料理に使っている。バターを減らしてヘルシーにするなら、普通に油で焼いて最後にバターで風味付けすること。
今回は醤油味にしたが、ハーブとかガーリックオイルとかバルサミコとかでイタリアンな感じにしても美味い。

キャベツのスープ


キャベツが安かったので。

  • にんにくと玉ねぎは薄切りにし、弱火か中火でじっくり炒める

  • ソーセージは好みの大きさに切って投入

  • にんじんはみじん切り、セロリはすじを取って縦に切ってから横に細かく切り、投入

  • ハーブソルトみたいなの(クレイジーソルトとか)で適当に味付け

  • スープはコンソメとかマギーブイヨンとかそんなので可(スープストックを作っておくほどの気合いはなし)

  • 炒めた具材を入れて煮る

  • キャベツは芯を取り、適当に切って投入

  • もちろん芯も食べる。薄く小さく切って投入

  • こしょうを適量振って完成


野菜の甘みが出てればよし。今回は生ソーセージだったので豪華。