« 2008年9月 | トップページ | 2011年2月 »

2010年4月25日 (日)

SQL Azureに接続する場合の注意点

SQL Azureに接続する方法は、①Windows Azure上に配置したアプリケーションから接続する方法と、②ローカルの開発環境などAzure以外の環境から接続する方法の2通りがあります。

今回①の方でちょっとだけひっかかりました。うまくSQL Azureに接続できないのです。

本当はどちらの場合も同じで、AzureのWeb画面に表示される接続文字列を指定してアクセスするだけなのですが、注意点として以下の2つがあります。

注意点1.SQL Azure側のFirewallの設定で、クライアント側(※1)のIPアドレスを許可すること。

注意点2.普通は接続文字列から「Encrypt=True;」は省くこと。

※1:アプリケーションが動作している環境のこと。ブラウザが動作している環境ではないです。

②のローカルの開発環境から接続する場合はこれでやっていましたが、①は「SQL AzureとWindows AzureのAzure同士なんだからいけるだろう」と勝手に思い込んで、見事にエラーになってしまいました。

で、Windows Azureに配置するものはリリースビルドなのでエラーメッセージとかもでないようにしてあります。だから①の設定が必要なんだと気が付くのにちょっと(10分くらい)時間がかかりました。

このことに気が付けば簡単かというとそうではなく、「じゃあWindows AzureのIPアドレスって何?」という問題になります。

一度デバッグビルドをAzureに配置するなどしてエラーメッセージを見ればエラーメッセージ中に親切に許可すべきIPアドレスが表示されるのでわかるのですが、再配置するとIPアドレスが変ってしまいます。

どうすればいいんでしょうか?私はとりあえず、自分のAzureのURLにローカルからPingをうってみました。Ping自体は拒否されるようですが、IPアドレスは表示されたのでなんとかなりました。

もっとスマートな方法がありそうな気がします。

ちなみにSQL Azureのファイアーウォールの設定は変更後5分程度待たないと反映されないときがあるというようなメッセージがでますが、いまのところ、5秒~20秒くらいですぐ反映されるようです。

■補足

●注意点①を守らなかった場合のエラーメッセージ

一部 xxx にしてあります。

Cannot open server 'xxxxxxxxxx' requested by the login. Client with IP address 'xxx.xxx.xxx.xxx' is not allowed to access the server.  To enable access, use the SQL Azure Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range.  It may take up to five minutes for this change to take effect.
Login failed for user 'xxxxxxxx'.

●注意点②を守らなかった場合のエラーメッセージ

サーバーとの接続を正常に確立しましたが、ログイン前のハンドシェイク中にエラーが発生しました。 (provider: SSL プロバイダ, error: 0 - 証明書の CN 名が渡された値と一致しません。)

| | コメント (0) | トラックバック (0)

2010年4月24日 (土)

キリマンジャロはSQL Azureを救う

以前からひきつづき掲示板プログラムのAzure環境への移行をやってます。

今回はいよいよSQL Azureにデータベースを移行しようとしたのですが、いやいや面倒です。

というか、現時点ではツールがでそろってないです。2010年5月にSQL Server 2008 R2がリリースされればだいぶ楽になりそうでした。

というのもSQL Azureのデータベース作成はWeb画面から簡単にできて、その画面にはプログラムから接続する場合の接続文字列まで表示してくれるので、「これは楽勝でいけるかな?」と思っていたのですが、いざ、テーブルを作成したりデータを移行する段階になると手段がよくわからないのです。

まず、手元にあったSQL Server 2008のManagement StudioではSQL Azureに接続できませんでした。エラーになります。Webで検索すると実はエラーがでても接続自体はできていてクエリ機能だけは使えるらしいのですがこれでは不便です。

次にVisual Studio 2010のサーバーエクスプローラで接続してみたところ、うまくいったように見えましたが、こちらのクエリウィンドウはSELECT文が前提になっており非常に使いにくいです。

で、結局どうしたかというと、SQL Server 2008 R2 ベータ版(正確には2009年11月のCTP版)のManagement Studioを落としてきてそこから接続しました。これならいけます。

…が、普通のSQL Serverよりはできることが少ないみたいです。SQL Azure自体がSQL Serverより機能が少ないということもありますが、それよりもManagement StudioがSQL Azureに対応していない部分が多い印象でした。たとえば、テーブルのデザイン変更がGUIでできないです…。5月リリースの製品版ではいけるんでしょうか?

とはいえ、 親切機能もついています。たとえば、スクリプト生成時にSQL Azure向けスクリプトを生成する機能がありました。これは楽チンです。

SQL Server 2008 R2でSQL Azure向けスクリプトの生成

ちなみにManagement Studioを使って、SQL Azureに接続するときのサーバー名は、SQL AzureのWeb画面に表示されているサーバー名のxxxx.database.windows.netです。

ユーザー名とパスワードは自分で設定したものを入力するとして、注意点としてAzure側のファイアーウォールの設定をしていないと接続できません。

さいわい、ファイアーウォールが原因で接続に失敗している場合は、エラーメッセージにIPアドレスが表示されてわかりやすくなっていますので、SQL AzureのWebの設定画面でFirewall Settingsを選び、表示されたIPアドレスを含むIPアドレス範囲を許可してあげます。

たとえば、IPアドレス100.200.210.220がエラーメッセージに表示されている場合、Firewall Settingsには次のような設定をします。

Rule Name    IP Address Range

MicrosoftServices    100.200.210.220 - 100.200.210.220

SQL AzureとSQL Serverでは違いもあるのでプログラム修正が必要になる部分もあります。たとえば時間が全部GMTになるとか、照合順序とか、マルチバイトの文字列を指定する場合は N' ' にするとかです。

忘れてました。参考になるわかりやすい資料をマイクロソフトが公開していますのでリンクしておきます。私もこれを見ました。

http://www.microsoft.com/japan/sqlserver/2008/r2/technology/self-learning.mspx

これの一番下の「SQL Azure 入門」です。

| | コメント (0) | トラックバック (0)

2010年4月23日 (金)

ちょっと乗り遅れたけど部分メソッド(パーシャルメソッド)って良さそう

VB2010がリリースされました。新機能を眺めていて部分メソッド(パーシャルメソッド)が目に付きました。

部分メソッドは2008から導入されたので、2010の新機能というわけではありませんが、今までほとんどスルーしていていました。

今回、VB2010リリースを気に改めて試してみると「結構良いのでは?」と思えたので紹介します。

もう使っているかもしれませんが、基本から説明すると、部分メソッドとは空のメソッドを宣言だけしておいて、その中身は別の場所にプログラム(実装)するという手法、機能のことです。

Public Class Business

    Public Sub DoBusiness()

        WriteLog(CreateMessage)

    End Sub

    Partial Private Sub WriteLog(ByVal message As String)
    End Sub

    Private Function CreateMessage() As String
        Return "ログです。"
    End Function

End Class

この例ではWriteLogが部分メソッドです。ただの空のメソッドだと本当に単なるダミーになってしまうのですが、キーワードPartialをつけて、中身は別の場所でプログラムするということを明示します。

Partialをつけてるのに、ここでメソッドの中身を書くとエラーになります。

で、ここから重要です。

このプログラムを実行してDoBusinessメソッドを実行すると、CreateMessageメソッドは呼び出されません。

WriteLogメソッドも呼び出されないのですが、そこはそれほど驚きはなく、CreateMessageメソッドが呼び出されないのが私にとっての驚きです。

WriteLogメソッドの実装がみつからないので、WriteLogメソッドの呼び出しはコンパイル時点で省かれてしまうのです。そのため、引数を生成するためのCreateMessageメソッドの呼び出しも省かれます。

これはすごいと思いました。従来、似たような実装をしても呼び出しは行われてしまうのでCreateMessageメソッドは実行されてしまいます。

部分メソッドにしておけば、実装を省くと呼び出し自体が行われなくなるので、多少コストのかかる処理でも部分メソッドにしておいてじゃんじゃん書いてOKということになります。

システムを作っている真っ最中はプログラム中にいろいろとログをしかけて挙動を確認したり、デバッグしたりしたいものですが、あまり大量に仕込むとパフォーマンスに影響しますし、後でその部分を削除するのも大変です。

ログ書き込みメソッドの中だけ後で空にするという方法もありますが、呼び出し自体は行われるのでコスト的には不利です。特にログ書き込みメソッド本体よりも、そのログの内容を生成するための呼び出しが気になります。

逐一#If Debugなどをつけてデバッグ時のみに限定して動作させる技もありますが、これはプログラムが汚くなる上に量が多いとモチベーションが下がります。

部分メソッドは完全にコストがゼロになるので完成時のことをそれほど考慮しないで、開発やデバッグのためだけにいろいろとログを仕込むことが出来ます。

しかも、このまま本番にリリースしてからバグが出た場合、実装部分を含んだリリースビルドを提供すれば開発時に使用していた詳細なデバッグログを本番でも出力することが出来て問題解決の役に立ちそうです。

このように必要なときと必要じゃないときを切り替えて、実行コストで不利にならないように出来るというのが魅力と思いました。

実装部分のコードも載せておきます。実装部分は別ファイルでよいのです。(同じファイルでもよいですが)

Partial Public Class Business
    Private Sub WriteLog(ByVal message As String)
        Debug.WriteLine(message)
    End Sub
End Class

それにしても、部分メソッドで名前が良くないですね。「部分」ってゆーよりはダミーという感じがします。宣言と実装を分離できる、「分離メソッド」なんて言う名前でもいいかもしれません。

「部分」メソッドなどといわれると、1つのメソッドの内容をあっちに書いたり、こっちに書いたり出来るのかと思ってしまいます。

あと、念のため。別にログのためにある機能ではありません。私はまっさきにログで使ったらいいんじゃないかと思っただけで他にも使えるシーンはたぶんあると思います。

| | コメント (0) | トラックバック (0)

2010年4月18日 (日)

Visual StudioでAzureプログラミングをするときの基本的なエラーメッセージ

いくつか疑問はあるものの、SQL Azureも構築し、順調にAzureの調査は進んでいます。

Visual Studio 2008でテストアプリを作るときに遭遇したメッセージを2つだけですが、メモっておきます。もしはまっている人がいて参考にしてくれればと思います。日本語訳は英語が苦手な私の訳なんであまり期待しないでください。

あと、私もまともに本も読まずかなり適当にAzureをやっていますので、ここで出している情報もまぁそのくらいの品質と思ってください。

■メッセージ1:「管理者として実行」する必要がある。

Windows Azure Tools for Microsoft Visual Studio

The Development Fabric be run elevated. Please restart Visual Studio in elevated administrator mode in order to run the project

日本語訳

開発ファブリックを起動する必要があります。プロジェクトを実行するにはVisual Studioを管理者として実行してください。

意味と解決方法

Windows Azure Cloud Serviceプロジェクトで作成したプログラムを実行するには、Visual Studioを管理者として実行する必要があるようです。このメッセージがでたらVisual Studioを一度終了して、あらためて、Visual Studioのアイコンを右クリックし「管理者として実行」をしてみてください。

■メッセージ2:SQL Server Expressが必要です。

Windows Azure Tools for Microsoft Visual Studio

Failed to initialize the Development Storage service. See output window for more information

日本語訳

開発ストレージサービスの初期化に失敗しました。出力ウィンドウのメッセージを見てください。

意味と解決方法

出力ウィンドウのメッセージによるのだとは思いますが、私の場合はSQL Server Express Editionを起動し忘れていてこのメッセージがでていました。SQL Server Express Editionを実行していないとアプリケーションを開始できないんですね。

ちなみにこのとき出力ウィンドウに表示されていたメッセージです。

Windows Azure Tools: Failed to initialize the Development Storage service. Unable to start Development Storage. Failed to start Development Storage: the SQL Server instance ‘localhost\SQLExpress’ could not be found.   Please configure the SQL Server instance for Development Storage using the ‘DSInit’ utility in the Windows Azure SDK.

| | コメント (0) | トラックバック (0)

2010年4月16日 (金)

Azure挑戦

Visual Basic 中学校の掲示板は私がVBでプログラムしたものなのですが、無料のホスティングサービスが終わってしまったためにWeb上で公開できなくなってしまいました。

再開するには別のサービスを探すか、自分でサーバーを立てる必要があるのですが、ちょうどマイクロソフトが今年からAzure(アジュール)という名のホスティングサービスを開始したのでAzureに初挑戦してみました。

従来のホスティングサービスとは要は単なるレンタルサーバーのことで、自分がVBで作ったWebアプリケーションをFTPなどでコピーするとそれにURLがついてみんなで使えるようになるというものだったのでAzureも似たようなものだろうと思っていたのですが、ちょっと違いますね。

正直まだ考え方とかがよくわかってなくてつらいです。とりあえずHelloWorld的なアプリケーションを公開するところまでできました。

■契約編

まず最初の契約がわかりにくくて困りました。英語です…。

https://mocp.microsoftonline.com/Site/ProductCatalogPostSignIn.aspx

なんとか契約したものの何から手をつければいいのかも??です。

とりあえず、ホスティング(自分がVBで作ったWebアプリをマイクロソフトが管理しているサーバー上で動かしてURLをつけてWebに公開すること)がしたいので、「New Service」をクリックし「Hosted Service」を選択しました。これで取得したいURLや、サーバーの場所を選択すればとりあえずガラは完成のようです。

※サーバーの場所は日本はないです。一番近そうなEast Asiaにしておきました。たぶん、上海?

■環境構築編

あと、Visual StudioでAzureを簡単に利用するため(?)の追加のツールをインストールする必要があるので注意してください。Visual Studio 2010ならはじめからこのツールが入っていると思います。

http://www.microsoft.com/downloads/details.aspx?familyid=5664019E-6860-4C33-9843-4EB40B297AB6&displaylang=en

念のために書いておきますが、このツールはVisual Studio用のツールなのでVisual Studioが入っていることが前提です。無料版のVisual Web Developer Expressでも使えますが、Visual StudioのStandard Editionはダメらしいです。

OSはVista以上必須です。

あと、もう1つ要件としてSQL Server Express Editionが必要です!

■プログラム編

それで、あとはここに日本語のチュートリアルがあるからなんとかなるかなと思っていました。

http://msdn.microsoft.com/ja-jp/azure/dd172099.aspx

が、ちょっと情報が古い&肝心なところがよくわからないでやや苦労しました。

はじめの「Windows Azure Tools for Microsoft Visual Studio の操作方法の概要」はわかりやすく書いてあり環境さえととのっていれば中学生でもいける感じでした。

ただ1箇所だけ途中ででてくるサンプルの中の RoleManager.WriteToLog はベータ版でのみ有効なものらしくエラーになってしまいます。ここでテンションが下がりました。(書いてあるとおりにやってるのにエラーになるとテンション下がりますよね。)

Webで調べた結果 System.Diagnostics.Trace.WriteLine に置き換えればいいことがわかったのでなんとか突破できました。なお、System.Diagnostics. は省略しちゃだめです。

■配置編

完成したかる~いプログラムをとりあえずAzure上で動かして一般公開してみようとしましたが、う~ん。あまりお手軽ではないですし、チュートリアルの「Windows Azure へのサービスの配置」がすごくわかりにくいです。というかいまだによくわかりません。

とりあえず、こうしたらできたというのを書いておきます。

1.Visual StudioのソリューションエクスプローラーでCloudService1を右クリックして「発行」。発行すると設定用のWeb画面も開くのでログインしておく。

2.設定用Web画面で、Summaryページで設定したHosted Serviceをクリックする。

3.Productionという立方体が表示されるので、その右にある矢印(?)をクリックする。

4.Stagingという立方体が表示されるので、その下にある「Deploy」をクリックする。

5.配置するファイルを選択する画面になるので、上のファイルに拡張子がcspkgのファイル、下のファイルに拡張子がcscfgのファイルを入力、Deployをクリック。(このファイルは1の「発行」時に生成されたもの。このファイルのあるフォルダーは発行時に自動的に開く)

6.ちょっと待つと配置が完了する風の表示が出るので、今度はProductionの方のDeployをクリックする。

7.ちょっと待つと配置が完了する風の表示が出るので、今度はProductionのRunをクリックする。

8.10分くらい待つ。

9.表示がReadyになれば完了!その下にあるURLにアクセスすると自分が作成したアプリにアクセスできる。

■感想

書いて疲れました。早く掲示板を配置したいですがもうちょっとかかりそうな雰囲気です。

| | コメント (0) | トラックバック (0)

« 2008年9月 | トップページ | 2011年2月 »