Go Azure 2日目に参加しました

Go Azure2日目に参加しました。1日目についてはこちらを。

2日目はJapan Windows Azure User Group (JAZ)が中心となったコミュニティのセッションやハンズオンセミナーが行われました。自分は金曜日のマイクロソフトのセッションよりも、土曜日のセッションを楽しみにして来ました。初日よりも参加人数が少なかったですね、平日にマイクロソフトの社員の話を聞くことを目的とした人が多かったんでしょうか。スーツで参加した人が多かった(ほとんど)でしたし。

キーノートは初日の振り返り。Blobストレージにhtml+jsのような静的なファイルを置いて究極のスケールサイトが作れるという話が印象に残りました。確かにBlobストレージはHTTPでアクセスできるので可能ですよね。

午後からはずっと「クラウド開発トラック」部屋に閉じ篭ってました。

TFS on Azure で始めるイマドキのソフトウェア開発

TFSの歴史とAzure上のTeam Foundationのお話です。TFSの適用範囲の拡大、クラウド上にTFSがあることのメリットの説明。そして開発プロセス、ソフトウェア開発の目的の重要性のお話でした。

この5年で開発を支援するツールはプロセスとともに大幅に進化しました、ただ人間はそんなに進化してません(自分の見える範囲では)。

  • 計画は作ってみるものの、やってみなければそれができるかどうかわかりません。
  • やってみたらできませんでした、計画をどう変更していいかわかりません。
  • 計画を変更してみたものの、それができるかどうかはやってみなければわかりません。
  • 計画を立ててみたものの、絶対にこんな計画ではうまくいきません。
  • 計画通りにはいっていないけど、やるしかない!

とか

  • この技術やったことないので、できません
  • やり始めてみたものの、どうやったらうまく行くのかわかりません
  • なんかよくわからないけど、サンプルをコピったら動きました
  • なんかよくわからないけど、変えてみたら動かなくなった
  • 何にも変えてないんですけど(本当は何か変更してる)、なぜか動かなくなった

とかとか。そんなことを考えたらネガティブな気分になってしまいました。ツールもプロセスも進化してるんですけど、人間が進化してないのでその進化に対応ができないんですよね。プロジェクトに10人いたら、1人はプロセスの適用方法であったり、ツールの運用であったり開発技術に追随できているでしょうが、残りの9人はどう計画を立てたらいいのか、どう開発をしたらいいのかわからない有象無象の人の印象です。(自分の周りは)

ツール・プロセスの進化を啓蒙することは非常に重要ですし、進化させることは非常に重要なんですが、現場は「計画通りでなくても、プロセスに則っていなくても動く・納品可能なソフトウェアをとにかくつくること」「実際はプロセスに則っていなくても、プロセスに則っていることを証明するためのエビデンスを作成する」ことに力を注いでいます。何とももどかしいです。TFSとかScrumとかは都市伝説じゃないか(現実にはツールを使ってScrumを適用している現場なんて存在しないんじゃないか)と思ったりしてしまいます。

すいません、ネガティブになりすぎたのでここらで終わらせます。ツールやプロセスの進化に追随できる人間になりたいです、はい。

One ASP.NET – ASP.NET Web Stack

一人のファンとして「キャー! シバヤンサーン!!」という気分でした。こういう方にはオーディエンズを置き去りにするようなセッションをやってほしいですよね。

「オラ!オレのテールに食らいついてこい!!」

ってやつを。「ASP.NET WebFormとは」とか「ASP.NET MVC とは」とか「SignalRとは」をお話させるのはもったいないです。そんなことは全部知っている前提で、技術的にもっともっともっともっと尖った話が聞きたいです。ブログを読んでいるとそういったことを知っている方なので。そういった場を作りたいですね。

懇親会でお会いすることができました、やっぱり「あ、あのクラウディアを嫁っていってる人」と思われてました…間違ってはいませんが。

AWS のクラウド デザイン パターンを Windows Azure に持ってきてみた

Windows Azureを使用したクラウドデザインパターンの適用方法のお話。1イベントのプレゼンテーションとしてSlideShareに公開するだけじゃなくて、JAZのコンテンツとしてサイトに公開してもいいんじゃないでしょうか。もっと検索エンジンから探しやすく、アクセスしやすい形にして残して欲しいなぁと思いました。大変な作業だと思いますが、それだけの価値があると思います。

クラウド上のデザインの話は断片的にブログなどで紹介されてる方もいらっしゃいますが、これだけ体系的にまとめられている資料はもっともっと多くの人の目に触れられるようになってほしいです。

ネットワーキングパーティー

転職活動とか、他のコミュニティでお会いした方と少々ですが声を書けることができました。2~3回「クラウディアの方ですよね?」と声をかけられましたが、「あ…はい…」とつれない返事をして3次元の名前を名乗らずにごめんなさい。あと、ムッシュさんと同世代だったことが新しい発見でした。

最後に、きちんとミッションをコンプリートしました。

Experience of Windows Azure is priceless(1)

DVC00012

Experience of Windows Azure is priceless(2)

DVC00013

このイベントの準備・当日の運営に関わった方、本当にお疲れ様でした&ありがとうございました。自分はブログ書くことと写真撮って(・∀・)ニヤニヤすることしか出来ませんが、本当に勉強になりましたし、楽しかったです。

Go Azureに参加しました

日本でのWindows Azureのイベント「Go Azure」に参加しました。

image

http://msdn.microsoft.com/ja-jp/windowsazure/jj129528#top

ずっとJAZUG主催のコミュニティイベントだと思っていたら、マイクロソフト主催の営業イベントでしたw 受付で

「名刺をだせ」(超意訳)

と言われたので

「働いてねぇよウワァァァァァァヽ(`Д´)ノァァァァァァン!」(コミュニティイベントだと思っていたので名刺を持ってきてない)

と受付のお姉さんを困らせました。ごめんなさい。現地は異様なスーツ率&男子率でした、ルナルナのCMが虚しく響くレベルでした。1日目のセッションはMSの社員による Meet Windows Azure で発表されたAzureの新機能紹介でした。

では、セッションごとに感想を。

Opening & Keynote クラウド利用のあらゆるニーズに応える Windows Azure の進化

OP映像で会場が一体となりスタンディングオベーション(嘘) 早く動画を公開して欲しいですね。

キーノートセッションなのに、何か頼りない感じ。デモも観ているこっちがヒヤヒヤするし、偉い人だから普段Azureを使うことはないんだろうなぁ、と感じさせるようなセッションでした。それに対して、砂金さん、井上章さん、高添さんはプレゼン&デモ慣れしてて見てるこっちも安心できました。

印象に残ったことはデジタルハリウッドの3DCGレンダリングの実証実験の事例です、20コアのリソースをクラウドに用意して映像作成を行うというものですが、手元に準備することが難しい巨大なリソースを準備するのはクラウドに向いてますね。ダメだったら使った分だけ払って辞められますし。

「Microsoft(R) Windows Azure(TM)」 を活用したレンダリング実証実験 ~クラウド活用による、制作期間&コストの大幅削減~ 学習環境への導入とデジタルコンテンツ産業の支援を目指す

新ポータルのローカライズについてですが、もうローカライズしなくてもいいと思うんですよ。英語の概念なんですから英語のまま理解すればいいんですよ。新ポータルに慣れてしまったので、しょーもない間違った日本語にローカライズされるくらいなら英語のままの方がいいです。HTMLベースのポータルになっただけではなく、クラシックWebアプリではなくモダンWebアプリに変わったためにとても使いやすいです。GmailのようなSPA的サイトになっているので、デベロッパ的には時間を作ってJavaScriptのソースを読んでみたいですね。Virtual Machineを作成するときのウィザードのようなページはJavaScriptでどうやって実現しているのか興味津津です。

あと、デモでAzure Virtual Machinesの仮想マシンにリモートデスクトップに接続するときの動きがもの凄くスムーズでした。自分のWebロール(XS)はあんなにスムーズじゃない…XSだからでしょうか。デモを見ているとインターネット越しにリモートデスクトップ接続しているとは思えないほどスムーズでした。

Technical Session #1

新機能 "Web サイト" で実現する Web アプリケーション高速開発

この資料見てください。Webサイトの構成図の説明がありました。資料はこちらで公開されています。

image

単純にIISのサイトをどんどん追加してるわけではないよな、と思っていたらこういう構成になっていたんですね。WebサイトのコンテンツがAzureドライブに保存されていたのは意外でした。確かにローカルのドライブに置いていたらサーバーに障害があった場合に消えてしまいますし。Azureドライブを使用すると(たぶん)自動的に多重レプリケーションされるメリットもあるのでしょう。I/Oパフォーマンスがどうかは分かりませんが。

あと、MySQLは「ClearDB」という外部のサービスを使っているんですね。さすがにマイクロソフトだけで提供はしないか。WebサイトもWebロールと同様にスケールアップ・スケールアウトできますが、MySQLがボトルネックになりそう。やっぱり規模が大きくなったら、Webロール+Azure SQL Databaseに移行するか、MySQLを高スペックのIaaSで動かすしかないのかな。

あと、WebForm大好きですね。デモのときはMVC使ってほしいな。

最後に、語られなかったWebサイトのメリットがプレゼンテーションに。

image

そう、WebサイトはClassisASPの移行も対応してるんです!VB6がWindows8で動作することも発表されたようですし、VB6/ClassicASPは滅びませんよ。.NET1.0/1.1はもうほぼ滅びましたがw

Special Session

マイクロソフトは本当にオープン ソースに対してオープンか?

たまたま.NETラボ勉強会で同じテーマで話す機会があったので、実は今日一番楽しみにしていたセッションでした。

Azureがオープンであることがとても強調されていますが(キーノートでも「究極のオープンクラウドサービス」というキーワードが出ていました)、「オープンであること」自体が目的ではありません。多くの人がWindows Azureを使って、マイクロソフトに利益が出すことが目的です。慈善事業ではなくて営利企業ですから。

多くの人がWindows Azureを使おうと思うためにはオープンであることが1つの基準になります。クラウドのプラットフォームなので具体的には

  • 多くの選択肢が提供されていること
  • 多くのアプリケーション/ミドルウェアが動作すること

だと思います。選択肢については

  • IaaS(Virtual Machine) / PasS(WebRole / WorkerRole / WebSite)
  • SDK (.NET / Java / PHP / Python / Node.js) (Windows / Linux / Mac)
  • VM用OS (Windows / Linux)
  • データ(Blob / Table / SQL Database / MySQL)

と、ユーザーが迷うほどの選択肢が用意されています。(ユーザーからのフィードバックをもとに選択肢を増やしているのですが)

Azure上で動作するアプリケーションについては、以下のブログで色々と言及されています。

Openness Update for Windows Azure

A New Milestone For Openness On Windows Azure

クラウドサービスではマイクロソフトは後発ですし、クラウドで成功しなければ未来はないと考えているでしょうから必死ですよね。Linuxで動作する素晴らしいソフトウェがあれば、エンジニアをだしてWindows / Windows Azureで動作するように協力しています。Windows Azureはプラットフォームですから、その上で動作するものはWindows Server + .NETでなくてもいいんでしょうね(本当は使って欲しいでしょうけど)

マイクロソフトがオープンソースに対してオープンかと言われれば、マイクロソフトにとって利益になるから、つまり、多くのユーザーがWindows Azureを利用してクラウドの勝者になって世界のコンピューティングの覇権を制することができるから、オープンになっているのだと思います。単なる慈善事業ではないのでしょう。したたかに自社の利益のために協力できるとことは協力しているのでしょう。

もちろん、オープンソースに協力することでイメージ戦略もあるのでしょうが、それはオマケでしょう。

マイクロソフト社員がクラウド上のCentOS+GlassFish+MySQLで動くJavaアプリをライブコーディング姿はシュールでした。まさにオープン厨でした。

明日も参加します、一生懸命ステルスします。クラウド開発トラックに篭る予定です。

.NETラボ6月勉強会でスピーカーを担当します

.NETラボ6月勉強会で「マイクロソフトのオープンソース戦略を考える」というテーマでセッションを担当します。

.NETラボ6月勉強会

マイクロソフトは近年「オープンであること」「オープンソースへの貢献」に力を入れています、自分が追いかけているASP.NET/Windows Azureでは特にその傾向が顕著です。

ASP.NET MVCはバージョン1から、各種Windows Azure SDKはオープンソースで公開され、ASP.NET/Windows Azureでは「オープン」という言葉を目にしない日はないといっても過言ではありません。(ちょっと言いすぎかも…)ただ、クライアント/デスクトップアプリケーション開発を行なっている方にはあまり馴染みがないらしく、上記ソフトウェアがオープンソースで公開されていることを話した時に驚いていました。

というわけでマイクロソフトのオープン/オープンソース戦略について喋って欲しいという依頼を(酔っている状態で)受けて、現在に至ります。とは言ってもサイトに載せていただいた説明文や上記文章を読んでも何を話すのかわからないと思います。なので、手元のメモを載せておきます。これを見ると何を喋るのか何となくでもわかっていただけるのではないでしょうか。

  • 「オープン」とは
    • オープンであること
    • オープンソース
  • オープンな製品/サービス
    • Web
    • Cloud
    • Not Microsoft
  • 1.Web
    • Intenet Explorer
    • ASP.NET MVC
    • ASP.NET MVCに同梱されるOSS
    • WebPlatform Installer
    • Nuget
  • Internet Explorer
    • オープンな標準(HTML,CSS,ECMAScript)に準拠
  • ASP.NET MVC
    • バージョン1からオープンソース
    • MVC4はGitHubで公開
    • Pull Request可能
  • ASP.NET MVCに同梱されるOSS
    • jQuery / jQuery UI / jQuery Validate
    • jQuery Mobile
    • JSON.NET
    • Entity Framework
  • WebPlaform Installer
    • VWD, SQL Server Express, 各種SDKなどWeb開発に必要なものをインストール
    • 各種OSSもインストール可能
  • Nuget
    • 開発に必要なライブラリ、OSSを入手可能
  • 2.Cloud
    • Windows Azure SDK
    • Windows Azure Virtual Machines
    • AzureをサポートするOSSサービス
    • インストールマニアックス
  • Windows Azure SDK
    • for .NET /for Java /for Node.js /for php /for Python
    • 様々な言語で作成したアプリケーションがAzure上で動作
    • GitHubで公開され、Pull Requestが可能
    • RailsもNougakuDo
  • Windows Azure Virtual Machines
    • WindowsだけでなくLinuxが仮想マシンとして動作
    • Windows Server 2008 R2 /2012 RC
    • CentOS / SUSE / Ubuntu
  • AzureをサポートするOSS
    • WordPress, Orchard, Umbraco etc
    • MongoDB, Redis, Memcached? etc
    • Node.jsは非WindowsからWindowsをサポートするようになった事例として有名
  • 3.Not Microsoft
    • Mono / Mono for iOS / Mono for Android
    • PhoneGap
    • Xobot (AndroidのC#実装)
  • C#ってオープンなんですよ
    • ※何をもってオープンと言っているのか忘れたので調べる
  • Mono / Mono for iOS / Mono for Android
    • C#がMac/Linux/iOS/Androidで動作する
    • MonoDevelop,
    • Play Station Suite SDK
  • PhoneGap
    • HTML+JavaScript
    • iOS/Android/WindowsPhone用ネイティブアプリを作成可能
  • Xobot (AndroidのC#実装)
    • AndroidOSをC#で書きなおしたら7倍速くなった
  • マイクロソフトが作成したソフトウェアのソースをなぜ公開するのか
    • ASP.NET MVC, Windows Azure SDK などを公開
    • たぶん赤シャツさんが推進してる
    • ※ここから先はじっくり考えて書く

オマエマイクロソフトの社員かよ!

って言いたくなる内容ですよねw ええ、マイクロソフトの社員の方が伝えようとしているメッセージを自分なりに解釈して話す予定です。これだけでもプレゼンテーションが70枚くらいになりますね...どこかをカットしないと…orz .NETラボのエースとMVVMの神様もスピーカーを担当するのでみんなこの2人を目当てで来るでしょうから、得意のステルススピーカーに徹します。

【書評】Windows Azureテクニカルハンドブック

4月のC#ユーザー会でいただいた(じゃんけんで勝ち取った)「Windows Azureテクニカルハンドブック」をやっと読みました。いただいてから約2ヶ月もかかってしまいすみません。

IMG_20120407_180443

日本マイクロソフトのエバンジェリストが監修し、AzureMVP3名が内容を書くというこれ以上ない贅沢な布陣です。Windows Azure全体をほぼ網羅しながら、自称中級者の自分が読んでも内容が薄いと感じることはありませんでした。日常的にWindows Azureを使用し・試行錯誤しているからこそ、それぞれの技術的要素の抑えておくべきポイントを把握しているからかもしれません。Windows Azureを知り尽くしているスーパーエンジニアという理由だけでなく、MVPは初心者・中級者を中心にコミュニティで情報をアウトプットしていることを評価されているため、Windows Azureの何をどのように伝えるべきかについて日本では右に出る者がない贅沢な著者陣による本になっています。

以下、本書を読み終わっての個人的な感想を書きます。

本書の対象:

Windows Azureについて初めて学ぶ初級、または断片的な知識を整理して理解したい中級エンジニア(開発者、インフラエンジニアに関係なく)

「クラウドサービスとは?」「Windows Azure Platformとは?」から始まり、1通りWindows Azureの備える機能を網羅しており、初心者から中級者まで活用できる内容になっています。補足・中級者向けの内容は注を使用して解説しており、流れを妨げることなく補足的な内容も合わせて確認することができます。

ポイント:

開発者・インフラエンジニア・運用エンジニア向け:

Windows AzureはPaaSであるため、クラウド上で実行されるサービスを作成する開発者だけでなく、スケーラビリティ・リソースの効率的利用、カットオーバー後の監視・運用を行うエンジニア向けの内容も充実しています。「6章 アプリケーションの運用」は、まさに開発者以外も必見の内容になっています。

.NET以外のテクノロジーの解説:

基本的にサンプルコードはC#で書かれていますが、Windows AzureはJava,PHPなどで書かれたアプリケーションもサポートしています。「5章 アプリケーション開発」ではJavaからJDBC経由、Hibernate経由でSQL Azureへアクセスするサンプルコードが載っています。

事例:

Windows Azure上で稼働している「MSN産経フォト」のアーキテクチャ、開発、運用事例が掲載されています。クラウド上のサービスがどのようなアーキテクチャで稼働しているのか、開発体制は何が変わって何が変わらないのか、インスタンス数増減の運用、オンプレミスでの運用と比較して削減できたコストなど、技術のみを学んでいても知ることのできない非常に貴重な生の事例を見ることができます。

最新情報のキャッチアップ:

Windows Azureは短いサイクルで新機能がリリースされるため、半年前の最新情報が最新でなくなることも珍しくありません。しかし、正式リリースされた機能が根本的に変更されることは考えにくく、内部の造詣に深く、頻繁に情報のアウトプットを行なっている方々によって書かれた本書によってWindows Azureの本質を理解することで、新機能へのキャッチアップも行いやすくなると思います。新機能も現行機能の延長上、現行機能では不足している部分を補うためにリリースされるのであり、現行の1バージョン前の情報をきちんと抑えていくことで、新機能の目的・利用シーンを想像しやすくなります。本書でもWindows Azure管理ポータルは英語版のキャプチャーが掲載されていますが、現在は日本語版を利用することができます。また、SQL Azureの管理用画面も、現在は本書の掲載内容と一部異なっていますが、クラウド上のRDBという本来の役割・目的は何も変わっておらず、これまでできなかったこと、やりにくかったことができるようになっておりやや古くなった情報であっても問題はないと思います。

クラウドのサービスはめまぐるしく新機能が発表され、文字通り日進月歩でサービス内容が進化(変更ではなく)しています。ある時点での最新情報を網羅的に理解し、差分情報を自分で探して学ぶことの重要性が他の分野以上に高まっています。「7章 最新情報」には、未来の新機能をキャッチアップするための場(URL)が記載されており、エンジニアとして書籍、Webページで学んで終了ではなく、常に最新情報をキャッチアップすることの重要さにも触れています。

最後に:

2012/6/8にWindows Azureの大きな新機能が発表されました。IaaSやWebロールよりももっと手軽にWebサイトを構築できる機能が利用可能になっています(Preview版ですが)。現在(2012/06/10)が「Windows Azure 2.0」とするならば、本書に記載されている内容は「Windows Azure 1.0」です。ただし、新機能「Virtual Machines」は「VM Role」の発展版、「Web Sites」はWebロールよりも手軽にサイトを公開するために、AmazonのBeanstalk,Herokuに対抗したサービスであり、「Windows Azure 2.0」は「Windows Azure 1.0」の延長上にあります。新機能が発表されたからといっても、既存機能はこれまでどおり利用可能であり、本書の記載内容が風化するわけではありません。新機能の目的・役割を理解する上でもこれまでのWindows Azureを理解することは非常に重要だと思います。

Windows Azure上にたった3時間でサービスを公開してみた

Windows Developer Daysの2日目の基調講演で公開された映像、「Through the Window」は約1分半しかありません。いわゆる「Shortバージョン」と呼ばれる長さです。おそらく作成されてはいないのでしょうが、フルバージョンを見たいという思いがありました。自分と同じようにフルバージョンの動画を見たいと思っている人はいるはずなので、その人たちのコメントを集めるサイトを作ってみました。

http://david9142.cloudapp.net/TTW/

image

実はこのサイトを作ろうと計画していたわけではなく、5/1の朝Twitterでリツイートされた @metamon30 さんのツイートをみてほぼ衝動的に作りました。ところどころハマりましたが、ほぼ3時間でサイトを公開することができたので、「Windows Azureならたった3時間でサイトを公開できる」みたいな感じで記録を残しておきます。

前提

まったくのゼロからサイトの作成を始めたわけではなく、クラウド(Windows Azure)上のサブスクリプションとローカルの開発環境は整備済みでした。具体的には以下の環境は事前に構築済みです。

  • Windows Azure上にホステッドサービス・ストレージサービスが作成済みで、いつでもアプリケーションがデプロイ可能な状態になっている
  • Visual Studio 2010 (Visual Web Developer 2010)とWindows Azure SDKがインストール済み

プロジェクトの新規作成

Visual Web Developerで新規プロジェクトを作成します。テンプレートは「Windows Azureプロジェクト」、ロールは「ASP.NET MVC4」を選択し、MVC4のインターネットアプリケーションテンプレートを使用しました。

モデルの作成

コメントを登録する機能を実装していきます。EntiryFrameworkのCodeFirst機能を使用する予定なので、コメント用のも出るクラスを作成します。本当に単純なクラスです。

    public class CommentModels

    {

        public int ID { get; set; }

 

        public string Name { get; set; }

 

        public string Comment { get; set; }

    }

コントローラー、ビューの作成(スキャフォールディング)

スキャフォールディング+EntityFramework(CodeFirst)の機能を利用して一気にControllerクラス、Viewを作成します。Controllersの追加から、以下のように指定して一気に自動生成させます。

image

実はここで少しハマりました。コントローラーを作成すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と表示され、エラーになってしまいました。NugetでEntityFrameworkをアップデートしたら発生しなくなりました、なぜかはよくわかっていません。

これでコメントを登録・削除・編集する機能が一気に自動生成されました。単純なCRUD操作をするだけならあっという間に完成してしまうので、本当にスキャフォールディングの機能は便利です。

ビューの修正

ビュー(*.cshtml)を修正します。コメント機能に関して、以下の変更を行なっています。

  • トップページ(/Home/Index)から、コメント一覧画面(/Comment/Index)へのリンクを追加
  • コメント一覧画面からコメントを編集・削除するためのリンクを削除
  • コメント一覧画面に現在のコメント件数を表示

コメントは一覧・登録機能だけを提供することにしました。トップページのデザインを作成するのと、コメント一覧へのリンクをつけています。ASP.NET MVC4のインターネットアプリケーションテンプレートをそのまま利用しているので、分かる人には「あぁ、MVC4つかってるんだな」とバレてしまうと思います。

これでアプリケーションは完成です(笑) F5キーからAzureエミュレータを起動し、Webブラウザからコメントを登録すると、ローカルのSQL Server Expressにデータベース・テーブルが自動的に作成され、データが登録されます。CodeFirst機能の素晴らしいところはRDBMSのスキーマを意識せず、コードに集中できる点ですね。モデルの定義以外は自動生成コードしか使用していないので、動作確認もあっさり終了です。

SQL Azureサーバーの作成

ローカルにあるSQL Server Expressで動作確認を行ってきましたが、アプリケーションはWindows Azure上にデプロイするのでデータベースもクラウド(Windows Azure上)に用意する必要があります。SQL Azureサーバーの作成はウィザードに従えば一瞬です。他のWindows Azureサービスからアクセスできるようにファイヤーウォールを構成します。ファイヤーウォール設定の適用に約5分かかるところは注意点です。Web.configの接続文字列を変更しつつ待ちます。

image

Windows Azure上へのデプロイ

もう最後のプロセスです、ここまでの経過時間は約2時間です。アプリケーションをWindows Azureへデプロイします、自分はVisual Web Developerからパッケージを作成し、Windows Azure管理ポータルから「新規運用環境へのデプロイ」で行う派です。デプロイ実行後、Twitterで「デプローーーイ!!」とつぶやきます。(ここ重要)デプロイ完了後wktkしてページを確認すると、文字化けが...しかも、_Layout.cshtmlとHome/Index.cshtmlのみ文字化けしているようです。@normalianさんからアドバイスを頂いて文字コードを確認してみると、なぜかこの2つのファイルのみsjisになっていました。なぜかは分かりませんが。

テキストエディターを使って文字コードをutf-8に変更し、再デプロイします。次はコメント登録時に名前は登録されるのに、コメントの内容が登録されない現象が...コメント入力テキストボックスの長さを変更した時に、<input>のname属性を変更していました...name属性を自動生成値のまま、テキストボックスの長さを変更するように変更して、再々デプロイします。ここまでの経過時間は約2時間半です。

完成

サイト完成です!ここまでの経過時間は約3時間です。そのうちデプロイ後の修正・再デプロイを2回行なっているので、2時間半でのサイト構築も可能だと思います。WindowsAzureはもちろんですが、ASP.NET MVC4, EntityFrameworkの恩恵に預かる部分も大きいと思います。

このサイトのソースはこちらで公開しています、「TTWAzure.zip」をダウンロードしてください。ソリューションを開くにはVisual Web Developer 2010, ASP.NET MVC4 Beta, Windows Azure SDKが必要です。

【日本語訳】Building Windows Azure Applications with the Caching Service part13

このエントリーはMSDNのチュートリアル「Building Windows Azure Applications with the Caching Service」の「Task4 – Configuring the Application for Caching」の日本語訳になります。このコンテンツ、日本語訳全体については、こちらのエントリーを参照してください。

Task4 – Configuring the Application for Caching

このエントリーでは商品情報データソースをインスタンス化するデータソースファクトリーを使用するためにアプリケーションを変更します。キャッシュ層のセットアップを完了させるには、キャッシュプロバイダーを指定するための設定を行う必要があります。

1.ControllerフォルダにあるHomeController.csを開き、Indexメソッドへ移動します。メソッド内にてローカル変数productRepositoryを初期化する行を、以下のようにIProductRepositoryインスタンスを取得するためにDataSourceFactoryを使用するように変更します。

public ActionResult Index()

{

    bool enableCache = (bool)this.Session["EnableCache"];

 

    // retrieve product catalog from repository and measure the elapsed time

    //Services.IProductRepository productRepository =

    //    new Services.ProductsRepository();

    Services.IProductRepository productRepository =

        MVCAzureStore.Services.DataSourceFactory.GetProductsRepository(enableCache);

 

    Stopwatch stopWatch = new Stopwatch();

    stopWatch.Start();

2.DataSourceFactoryの設定を行います、Web.configファイルを開き、以下のappSettingセクションを追加します。追加位置はconfigSection要素のあと、configuration要素の子要素となります。

<configuration>

  <configSections>

    <section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core"

             allowLocation="true" allowDefinition="Everywhere"/>

  </configSections>

  <appSettings>

    <add key="CacheService.Provider" value="InMemory"/>

  </appSettings>

Note: アプリケーションを1インスタンスで稼働させている場合は、インメモリキャッシュが適しているかもしれません。

3.「default」とう名前のdataCacheClientセクションに移動し、[SERVICE-HOST-NAME]部分をこのチュートリアルの最初で設定したWindows Azure Cachingのエンドポイントのホスト名に置き換えます。(例:your-namespace.cache.windows.net) [AUTHORIZATION_INFO]の部分を、Windows Azure Cachingの設定ページからコピーした認証トークン情報に置き換えます。

4.F5キーを押下し、アプリケーションをビルド・コンピュートエミュレーター上で実行して拡張キャッシュ機能のテストを行います。

5.アプリケーション開始時、初期状態ではキャッシュは無効になっています。商品情報のキャッシュ機能を有効化するために[Yes]リンクをクリックして、ページの更新します。キャッシュを有効にする最初のリクエストはデータの取得とキャッシュへの登録を行うため、オーバーヘッドが発生します。

6.[Products]をクリック、または、再度ページの更新を行なってください。今度はアプリケーションがデータの取得をキャッシュから行い、処理時間が短くなっているはずです。.NET Frameworkが提供しているインメモリを使用している場合は、処理時間がミリ秒未満となるでしょう。

7.それではWeb.configファイルのappSettingセクションに移動し、CacheService.Providerを「Azure」に設定しましょう。

  <appSettings>

    <add key="CacheService.Provider" value="Azure"/>

  </appSettings>

Note: アプリケーションを複数のインスタンスで動作させている場合、インメモリキャッシュは最適な選択肢ではなくなります。その代わり、Windows Azure Cachingの分散キャッシュ昨日が有効な選択肢となります。

8.Web.configファイルを保存します。

9.コンピュートエミュレーター上で[Suspend]と[Run]を実行し、設定を反映させます。

10.ブラウザからページを2回更新し、データがキャッシュされるようにします。インメモリキャッシュからWindows Azure Cachingへ変更したため、処理時間が長くなっていることに気づくと思います。(ネットワーク経由のアクセスのため)

【日本語訳】Building Windows Azure Applications with the Caching Service part12

このエントリーはMSDNのチュートリアル「Building Windows Azure Applications with the Caching Service」の「Task3 – Creating a Data Source Factory Class」の日本語訳になります。このコンテンツ、日本語訳全体については、こちらのエントリーを参照してください。

Task3 – Creating a Data Source Factory Class

このエントリーではデータソースのインスタンスを返すファクトリークラスを作成します。ファクトリークラスはアプリケーション設定からどのキャッシュプロバイダーを使用するか決定し、選択されたキャッシュプロバイダーを使用するように適切に設定されたデータソースを返します。

1.「Source\Assets」フォルダにある「AzureCacheProvider.cs」をプロジェクトの「Service\Caching」フォルダへコピーし、MVCAzureStoreプロジェクトへ追加します。

Note: AzureCacheProviderクラスはWindows Azure Cache ServiceをラップしてObjectCacheを実装しています。

2.MVCAzureStoreプロジェクトのServiceフォルダに、クラスファイル「DataSourceFactory.cs」を追加します。

3.新規クラスファイルに、名前空間「System.Configuration」、「System.Runtime.Caching」、「MVCAzureStore.Services.Caching」のインポート設定を追加します。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Configuration;

using System.Runtime.Caching;

using MVCAzureStore.Services.Caching;

4.そして、以下のDataSourceFactoryのコンストラクタと、キャッシュプロバイダーへの参照情報を保持する静的メンバーを追加します。

public class DataSourceFactory

{

    private static readonly ObjectCache cacheProvider;

 

    static DataSourceFactory()

    {

        string provider = ConfigurationManager.AppSettings["CacheService.Provider"];

        if (provider != null)

        {

            switch (ConfigurationManager.AppSettings["CacheService.Provider"].ToUpperInvariant())

            {

                case "AZURE":

                    cacheProvider = new AzureCacheProvider();

                    break;

                case "INMEMORY":

                    cacheProvider = MemoryCache.Default;

                    break;

            }

        }

    }

}

Note: クラスのコンストラクタは設定ファイルから「CacheService.Provider」を読み込み、設定されている値をもとにキャッシュプロバイダーを初期化します。この例では設定のうち2つの値で判断しています、1つはWindows Azure Cachingで、もう1つは.NET4で提供されるデフォルトのメモリキャッシュプロバイダーです。

5.次に、設定されたキャッシュサービスプロバイダーを返す以下のプロパティを追加します。

public static ObjectCache CacheProvider

{

    get { return cacheProvider; }

}

6.最後にキャッシュサービスプロバイダーで初期化されたIProductRepositoryデータソースのインスタンスを返すメソッドを追加します。

public static IProductRepository GetProductsRepository(bool enableCache)

{

    var dataSource = new ProductsRepository();

    if (enableCache && CacheProvider != null)

    {

        return new CachedProductsRepository(dataSource, cacheProvider);

    }

    return dataSource;

}

次は「Task4 – Configuring the Application for Caching」です。

【日本語訳】Building Windows Azure Applications with the Caching Service part11

このエントリーはMSDNのチュートリアル「Building Windows Azure Applications with the Caching Service」の「Task2 – Building a Caching Product Catalog Repository」の日本語訳になります。このコンテンツ、日本語訳全体については、こちらのエントリーを参照してください。

Task2 – Building a Caching Product Catalog Repository

前回はデータソースのデータをキャッシュする抽象クラスを作成しました、今回はProductsRepositoryクラスの代わりとなるキャッシュ機能を提供する派生クラスを作成します。このエントリーではCachedDataSourceクラスを使用してキャッシュ層を作成する際の一般的な手順について説明します。

1.MVCAzureStoreプロジェクトの「Services\Caching」フォルダに、「CachedProductsRepository.cs」という名前の新規クラスを作成します。

2.新規作成クラスに「System.Runtime.Caching」名前空間のインポート設定を追加します。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Runtime.Caching;

3.CachedProductsRepositoryクラスの宣言部分を変更し、「CachedDataSource」、「IProductRepository」から派生させます。

public class CachedProductsRepository : CachedDataSource, IProductRepository

{

}

Note: データソースをキャッシュするクラスはCachedDataSourceから派生してキャッシュ用のメソッドを提供し、また、オリジナルのデータソースと同じ振る舞いを実装します。

4.以下のコードを追加して、コンストラクタと元からあるデータソースへの参照を保持するメンバーを定義します。

public class CachedProductsRepository : CachedDataSource, IProductRepository

{

    private readonly IProductRepository repository;

 

    public CachedProductsRepository(IProductRepository repository, ObjectCache cacheProvider) :

        base(cacheProvider, "Products")

    {

        this.repository = repository;

    }

}

Note: CachedProductsRepositoryコンストラクタは引数で受け取ったキャッシュプロバイダーを使用して基底クラスを初期化し、引数で受け取った元からあるデータソースをメンバーにセットします。このクラスではキャッシュリージョン「Products」を定義します。

5.最後に、以下の通りGetProductsメソッドを実装してIProductRepositoryの振る舞いを定義します。

public List<string> GetProducts()

{

    return RetrieveCachedData(

            "allproducts",

            () => this.repository.GetProducts(),

            new CacheItemPolicy { AbsoluteExpiration = DateTime.UtcNow.AddMinutes(1) });

}

Notes: GetProductsメソッドは基底クラスでRetrieveCachedDataメソッドを呼び出しています。その時の引数には、キャッシュされるアイテムを一意に識別するキー(この場合は”allproducts”)、オリジナルのデータソースのGetProdctsメソッドを呼び出しているラムダ式のデリゲート、有効期間を1分間とするCachedItemPolicyを渡しています。

IProductRepositoryの振る舞いが非常に簡単なため、キャッシュ機能の実装に必要なコードは上記の通りです。一般的にソースコードは1つ以上のメソッドが定義されていますが、今回同じパターンをコピーすることでそれぞれのメソッドを実装することができます。基本的なアプローチは変わりません。

次は「Task3 – Creating a Data Source Factory Class」です。

【日本語訳】Building Windows Azure Applications with the Caching Service part10

このエントリーはMSDNのチュートリアル「Building Windows Azure Applications with the Caching Service」の「Task1 – Implementing a Caching Data Source Base Class」の日本語訳になります。このコンテンツ、日本語訳全体については、こちらのエントリーを参照してください。

Task1 – Implementing a Caching Data Source Base Class

このエントリーではキャッシュ用データソースクラスの基本となる抽象クラスを作成します。キャッシュ層を必要とするどんなプロジェクトでもこの汎化クラスの恩恵を受けることができます。

1.Visual Studio 2010を管理者として起動します。

2.「Source\Ex3-ReusableCachingImplementation\Begin」ディレクトリにある、Beginソリューションを開きます。

Note: 【重要】ソリューションを実行する前に、スタートアッププロジェクトが設定されていることを確認してください。MVCプロジェクトでスタートページは空白に設定されていなければなりません。

スタートアッププロジェクトの設定は、ソリューションエクスプローラーで AzureStoreService プロジェクトを右クリックし、[スタートアッププロジェクトに設定]を選択します。

スタートページの設定は、ソリューションエクスプローラーでMVCAzureStoreプロジェクトを右クリックし、[プロパティ]を選択します。プロパティウィンドウにて[Web]タグを選択し、[スタートアクション]で[特定のページ]を選択し、値を空白に設定します。

3.Web.configファイルでNorthwindEntities接続文字列があなたのデータベースを指定するように更新します。[YOUR-SQL-AZURE-SERVER-ADDRESS]、[SQL-AZURE-USERNAME]、[SQL-AZURE-PASSWORD]をそれぞれセットアップの手順でポータルからデータベースを作成した際に登録したSQL Azureのサーバー名、管理者ユーザー名、管理者パスワードに置き換えてください。

Note: Northwind2データベースのコピーをSQL Azureアカウントに作成し、ファイやウォール設定を行った手順を確認してください。

4.MVCAzureStoreプロジェクトにSystem.Runtime.Cachingアセンブリへの参照を追加します。

5.MVCAzureStoreプロジェクトのServiceフォルダに、「Caching」という名前のフォルダを作成します。

6.前手順で作成したCachingフォルダ内にCachedDataSource.csクラスを新規作成します。

7.新規作成したファイルに、System.Runtime.Caching名前空間のインポート設定を追加します。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Runtime.Caching;

8.抽象クラスを表す修飾子を、CachedDataSourceクラスに付加します。

public abstract class CachedDataSource

{

}

9.以下のフィールドをクラスに追加します。

public abstract class CachedDataSource

{

    private readonly ObjectCache cacheProvider;

    private readonly string regionName;

}

10.そしてObjectCacheとリージョン名を引数とする以下のコンストラクタを定義します。

public CachedDataSource(ObjectCache cacheProvider, string regionName)

{

    if (cacheProvider == null)

    {

        throw new ArgumentNullException("cacheProvider");

    }

    if (cacheProvider is MemoryCache)

    {

        regionName = null;

    }

 

    this.cacheProvider = cacheProvider;

    this.regionName = regionName;

}

Note: CachedDataSourceのコンストラクタはObjectCacheインスタンスを引数として受け取ります、このObjectCacheはキャッシュにアクセスするためのメソッドやプロパティを提供します。また、リージョン名とはキャッシュオブジェクトを使用してキャッシュオブジェクトをまとめるために使用する識別情報です。

11.次にキャッシュからデータを取得する以下のコードを追加します。

protected T RetrieveCachedData<T>(string cacheKey, Func<T> fallbackFunction, CacheItemPolicy cachePolicy) where T : class

{

    var data = this.cacheProvider.Get(cacheKey, this.regionName) as T;

    if (data != null)

    {

        return data;

    }

 

    data = fallbackFunction();

    if (data != null)

    {

        this.cacheProvider.Add(new CacheItem(cacheKey, data, this.regionName), cachePolicy);

    }

    return data;

}

Note: RetrieveCachedDataメソッドは引数で受け取ったキー情報(cacheKey)を使用してキャッシュからコピーを取得しています。キャッシュが利用可能であればそのまま返しますが、そうでなければ引数で受け取ったfallbackデリゲートを使用してデータソースからデータを取得し、引数で受け取ったキャッシュ有効期間ポリシーをもとにデータをキャッシュします。

12.最後にキャッシュからアイテムを削除するメソッドを追加します。

protected void RemoveCachedData(string cacheKey)

{

    this.cacheProvider.Remove(cacheKey, this.regionName);

}

13.CachedDataSource.csファイルを保存します。

次は「Task2 – Building a Caching Product Catalog Repository」です。

【日本語訳】Building Windows Azure Applications with the Caching Service part9

このエントリーはMSDNのチュートリアル「Building Windows Azure Applications with the Caching Service」の「Exercise3: Creating a Reusable and Extensible Caching Layer」の日本語訳になります。このコンテンツ、日本語訳全体については、こちらのエントリーを参照してください。

Exercise 3: Creating a Reusable and Extensible Caching Layer

前回、データアクセスクラスのメソッドを直接編集してデータをキャッシュ・取得するというWindows Azure Cachingの基礎的な内容について学習しました。このアプローチでもキャッシュのメリットを得ることができますが、キャッシュを有効にするには各データアクセスメソッドを変更する必要があります。既存のデータアクセスクラスを変更しないもう一つのアプローチを今回は学習します。

このエントリーでは既存のデータアクセスクラスの上にキャッシュ層を構築し、簡単な設定変更によって異なるキャッシュプロバイダーを利用できるように、また、キャッシュを使用しないように変更できるようにします。

このキャッシュ層用に CachedDataSource という名前のキャッシュ用抽象クラスを作成し、キャッシュへのデータ保存・削除機能を提供します。そして、派生クラスを実装してアプリケーションのどんなデータソースも同じようにキャッシュできるようにします。必要なことはデータへアクセスする方法を実装することだけです。キャッシュの抽象クラスがキャッシュプロバイダーをカプセル化しているため、コンストラクターでプロバイダーを指定し、キャッシュを操作するメソッドを実装するだけで構いません。

キャッシュ用クラスのデータ取得メソッドはキャッシュされたデータ、データソースからデータを取得するデリゲート、キャッシュをいつ破棄するかというポリシーを一意に識別するキーを受け取ります。このメソッドは、まずキャッシュからデータを検索し、コピーが見つからなければデータソースからのデータ取得を行い、キャッシュに保存するという古典的なキャッシュのパターンで実装されています。

この CachedDataSource は再利用可能なように実装されており、仕様に応じて様々なキャッシュプロバイダーを利用することができます。キャッシュプロバイダーを指定するには、コンストラクタに ObjectCache インスタンスを渡します。ObjectCacheクラスはSystem.Runtime.Caching名前空間の一部で、すべてのアプリケーションにキャッシュ機能を提供数rために.NET Framework 4から導入されました。この抽象クラスはオブジェクトのキャッシュを表しており、もととなるキャッシュにアクセスするための抽象メソッド・プロパティを提供しています。.NET Frameworkではこれを計測したクラス(MemoryCache)を提供しており、ローカルのメモリ上のキャッシュへアクセスする昨日を実装しています。

CachedDataSource から派生したクラスで提供されるキャッシュ機能を使用するには、特定のキャッシュプロバイダーに対応した ObjectCache の実装を提供する必要があります。よいアプローチとしては、仕様にあったキャッシュ実装を選択できるようにデータソースファクトリーを作成することです。設定ファイルの変更によって、簡単にキャッシュプロバイダーを変更できるようにします。

現時点では Windows Azure Caching は独自の ObjectCache 実装を提供していません。しかし、ラッパークラスを独自に作成することはできます。「BuildingAppWithCacheService\Source\Assets」フォルダにあるAzureCacheProviderはそのような実装例のサンプルです。このクラスは ObjectCache クラスから派生しており、Windows Azure Cachingのサービスを公開しています。

Azure Storeアプリケーションでこのきゃっしゅの独自実装の利点を得るためには、ProductRepositoryクラスにに対応するキャッシュクラスを作成する必要があります。このProductepositoryはIProductRepositoryインターフェースを1つのGetProductsメソッドで実装しており、SQL Azureから商品情報を取得しています。商品情報をキャッシュするソースを作成するには以下の手順で実装を行います。

  • CachedDataSourceを継承したCachingProductsRepositoryクラスを作成する
  • 新規クラスにキャッシュではないデータソースのインスタンスであるIProductRepository型と、キャッシュプロバイダーのインスタンスであるObjectCache型の引数を受け取るコンストラクタを作成します
  • 基本クラスでRetrievedCachedDataメソッドを呼び出し、元となるデータソースクラスを呼び出すデリゲートを提供することで、IProductRepositoryインターフェースの各メソッドの実装を提供します

次は「Task1 – Implementing a Caching Data Source Base Class」です。