2011年5月15日 (日)

Split考

■2つのSplit

文字列を区切ってくれる便利なSplitメソッドには実は2種類あって、1つがStrings.Split, もう1つがString.Splitです。(紛らわしいですがスペル的にはStringが複数形か単数形かの違いです。)

VBではStringsモジュールは省略可能なので、Strings.Splitを使っている人は普段は単にSplitと書いていて、Stringsモジュールを使っていることを意識していないことと思います。

それぞれの例

Strings.Splitの例

Dim value As String = "A,B,C"
Dim items() As String = Split(value, ",")

String.Splitメソッドの例

Dim value As String = "A,B,C"
Dim items() As String = value.Split(",")

■それぞれの違い

で、このどちらを使うかですが、昔何か面倒なことがあって私はずっとStrings.Splitの方を使っています。

ところが時が経つにつれて「何か面倒なこと」の内容を忘れてしまい、最近は「何でこっちがいいんだったろうか?」などと思いながらプログラムする日々が続いていました。

それを久しぶりに思い出したのでブログに書いておきます。知っている人にはつまらない話だと思います。

実はString.Splitはそのままでは区切り文字を1文字しか指定できないのに対し、Strings.Splitの方は何文字でも指定でき、区切り文字が2文字以上の時の書き方に差が出るのです。

どういうことかというと、

まず、Strings.Splitで区切り文字が2文字の場合、

Dim value As String = "AXYBXYC"
Dim items() As String = Split(value, "XY")

これは結果は "A", "B", "C"になります。

ところが、

同じことをそのままString.Splitで書くと、

Dim value As String = "AXYBXYC"
Dim items() As String = value.Split("XY")

これの結果は "A", "YB", "YC"になります。

String.Splitの方でこのような書き方をすると先頭の1文字だけ(上の例だと"X"だけ)を区切り文字として扱い、2文字目以降は無視されるのです。

■違いの理由

これは、上記のString.Splitの第1引数はChar型であって、String型でないことによります。"XY"はString型なので、上のような呼び出しを行うとChar型に自動的に変換されます。ところがChar型は1文字しか表せない方なので"X"だけが採用されるのです。

String.Splitを使って複数文字の区切り文字を扱いたい場合、文字列型ではなく、文字列型の配列にするとうまくいきます。

次のように書きます。

Dim value As String = "AXYBXYC"
Dim items() As String = value.Split({"XY"}, StringSplitOptions.None)

多分、これが面倒で統一的な書き方ができるStrings.Splitを私は使い続けていたのでしょう。

なお、Option Strict Onの状態ではvalue.Split("XY")はそもそもエラーになって実行できません。

■補足

ついでに念のため補足。Option Strict Onの状態だとこれもエラーにされます。

Dim items() As String = value.Split(",")

これを解決する一番簡単な方法は次のように書くことです。

Dim items() As String= value.Split(","c)

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

2011年5月 8日 (日)

さようなら、ByVal

2011年3月にVisual Studio 2010 SP1では、いくつかの機能追加と変更、バグの修正が行われています。

http://support.microsoft.com/kb/983509/ja

この中で、見落としていたのですがVBでプロシージャを作ると自動的にパラメーターの前につくByValが自動ではつかなくなったのをご存じだったでしょうか?

私は最近気が付きました。

■具体例

たとえば、

private sub test (x as integer)

と書いて、[Enter]キーを押すと、従来は次のようにXの前にByValが自動的に付きました。

Private Sub test(ByVal x As Integer)

それがSP1を入れると大文字小文字が変換される以外特に変化なしです。

Private Sub test(x As Integer)

xの前に何も書かなかった場合、ByValと同じ意味になりますので機能上の変更はないです。

イベントプロシージャでも変わりました。フォームをダブルクリックすると従来は次のコードが生成されていました。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

SP1を入れるとこうなります。

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

■変更の背景

このことは上にあげたリンク先の変更点の一覧にも書いてあります。

さらにそこからリンクをたどっていくともとはユーザーからの提案だったようです。

https://connect.microsoft.com/VisualStudio/feedback/details/542271#details

引用

>At this point, repeating ByVal everywhere is just noise.

私訳:こうやって見ると、どこにでもいちいちByValってでるのはうざいです。

■Visual Basic 開発チームへの提案は誰でもできる

日本語でも提案をすることはできますので、普段思っていることがある方は提案してくださいね。(VB中学校よりもレベルは高いので、「こんなこと提案していいのかな」と思ったらまずはVB中学校掲示板で相談してみて下さい。)

マイクロソフトへの提案サイト(日本語版。バグ報告もあり。)

https://connect.microsoft.com/VisualStudioJapan/Feedback

Visual Basic中学校掲示板

http://rucio.cloudapp.net/ThreadList.aspx

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

2011年4月 3日 (日)

例外が発生してもデバッグで停止しない現象

今まで気が付きませんでしたが、例外が発生してもデバッガが停止してくれないというバグがVisual Studioにはあったのです。

64ビット版のWindowsで開発していると、FormのLoadイベント実行中に例外が発生しても実行が停止せず、フォームが表示されます。

たとえば次のコードで再現できます。

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer = CInt("ASDF")
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Integer = CInt("ASDF")
    End Sub
End Class

このコード、どうみてもFormのLoadイベントで型変換エラー(InvalidCastException)が発生するはずなのですが、見事にスルーされ、普通にフォームが表示されます。Button1をクリックした場合は期待通り例外が発生し、デバッガにより処理が中断されます。

実はどちらの場合も例外自体は発生しているようなのですが、その行で黄色く表示されて処理を停止するという部分がうまく動かないようです。

なお、Loadイベントで例外発生行より下にコードがある場合、それらのコードは実行されません。

ためにしVisual Studio 2010 SP1を入れてみたんですが、この現象は直っていませんでした…。こまりますねぇ。

■対象1:Shownイベント

お手軽に対処するにはLoadイベントではなくShownイベントを使うという手があります。Shownイベントではこの現象は発生しません。ただ、LoadとShownは発生するタイミングが違うので代替できない場合もあります。

■対処法2:Stop

他には、Stopを使った停止は可能なので、このようなプログラムを書くことでかわせる場合もあるでしょう。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        On Error Resume Next

        Dim i As Integer = CInt("ASDF")

        If Err.Number <> 0 Then
            Stop
        End If
    End Sub

■対処法3:例外発生時に停止

あと、Expressでは使えない手ですが、[デバッグ] メニュー- [例外]の設定で、Common Language Runtime Exceptions の「スローされるとき」にチェックをするという方法もあります。こうするとLoadイベント実行中の例外でも停止してくれるようになりますが、他のTryとかOn Errorとかやっているところでも例外発生時にいちいち停止するようになってしまうので、万能ではありません。

Loadeventbug

参考

http://blogs.msdn.com/b/debugger/archive/2010/05/12/visual-studio-debugger-fails-to-catch-unhandled-exception-for-a-windows-form-or-wpf-application.aspx

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

2011年2月24日 (木)

無料でVisual Basicを使ったWebプログラミングをするには

無料でVBというと、Visual Basic Expressがすぐに浮かびます。これを筆頭にあげるのは正しいことと思います。

Visual Basic 2010 Expressを使うと、以下の種類のアプリケーションが作成できます。

  • Windows フォーム アプリケーション(Windows上で動くふつうのアプリ)
  • WPF アプリケーション(Windows上で新しいグラフィックスエンジンを使って動くアプリ)
  • コンソールアプリケーション(黒いコマンドプロンプト上で動くアプリ)
  • クラスライブラリ(単独では動作せず、ほかのアプリから呼び出されるライブラリ)
  • WPF ブラウザー アプリケーション (WPFアプリケーションと同じだが、Webブラウザー上で動作するもの)

しかし、Visual Web Developer 2010 Expressを使うと、さらに以下の種類のアプリケーションをVBでプログラムすることができるのです。しかも無料です。

  • ASP.NET Web アプリケーション (VBでプログラムされたWebサイト)
  • ASP.NET MVC 2 Web アプリケーション (上記と同じようなもの)
  • Silverlight アプリケーション (Webブラウザー上で動作するVBのアプリケーション)
  • WCF サービス アプリケーション
  • Windows Azure Project (クラウド上で動作するVBのWebサイトなどのアプリケーション)

このほかにも作れるものが若干あります。

もし、VBで作るWebアプリケーションに興味がある場合は、Visual Basic 2010 Expressだけでなく、Visual Web Developer 2010 Expressも入手したほうが良いです。

インストール方法

http://rucio.cocolog-nifty.com/blog/2011/02/post-bf62.html

ちなみに有償の方のVisual Basicを買うとさらにいくつかの種類のアプリケーションを作成できますが、私はほとんど作らないようなレアな種類です。

Office アプリケーションやワークフローなどが作成できます。(活用している人はいるとは思いますが、私は縁がありません。)

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

2011年2月19日 (土)

SuperPreviewレビュー

昨今は多種多様なWebブラウザーが普及していて、WebアプリケーションやWebサイトのテストを難しいものにしています。

IEだけみても6, 7, 8, 9と4つのバージョンがテスト候補であり、さらにFirefoxや、場合によってはSfariやChromeでのテストが必要です。

こんなときありがたいソフトがマイクロソフトのSuperPreviewですがみなさんはご存知でしょうか?SuperPreviewを使うと選択した2つのブラウザを並べて違いを発見することができます。ただ並べるだけではなく、違いを検査するための機能が充実していますし、シンプルでさくさく動いていくれるのがうれしいです。あ、でもURLやファイル名を指定して最初に表示されるまではちょっと待たされます。

Expression Webをインストールすると使用可能になります。Expression Webのバージョンまでは把握していませんが、私が使っているExpression Web 4はOKです。

無償版もあり、この無償版とExpression Webに付属している版の違いはわかりません。

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=8e6ac106-525d-45d0-84db-dccff3fae677&displaylang=en

で、従来からときどきはこのSuperPreviewで私のVisual Basic 中学校をチェックしていましたが、現在、このSuperPreviewにまだベータ版という扱いですがオンラインというものが加わっていて、さきほど初めて試してみました。(オンラインサービスといっても、ローカルにSuperPreviewがインストールされていることが前提)

Superpreview

これはSuperPreviewのブラウザー選択画面です。ローカル状態ではIE6, 7, 8とFirefoxが選択できますが、オンラインサービスを利用してリモートブラウザーとしてIE9, Safari, Chromeも選択できるようになりました。嬉しいです。

これらのブラウザーは実際にインストールしなくてもSuperPreviewはちゃんとプレビューを表示してくれます。また、リモートブラウザーを選択しても、動作が重たくなることはなく、あいかわらずさくさく動いてくれます。

ただ、SuperPreviewは見かけの比較ができるだけで入力したり、クリックしたりといった動作の比較はできません。なのでアプリケーションの動作をテストしたい場合はやはり本物のブラウザーインストールしてテストすることになります。

見た目だけ見ればいい場合はSuerPreviewに勝るツールはないでしょう。

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

2011年2月17日 (木)

プログラムのあるフォルダーを開く

掲示板に同じような質問もあったので、画像アップついでにブログにも書いておきます。

Visual StudioでVBやC#をプログラムにしているときに、画面上部のタブを右クリックして、「このアイテムのフォルダーを開く」を選択すると、編集中のファイルがあるフォルダーをエクスプローラーで開くことができます。

Openfolder

昔はこの機能がなくていちいちフォルダー開くのが面倒だったのですが、楽になりました。

ちなみにExpress以外のエディションの場合で、ソリューションにフォルダーを追加している場合は、ソリューションエクスプローラーでそのフォルダーを右クリックして、「エクスプローラーでフォルダーを開く」でそのフォルダーを開くこともできます。

この機能はExpressにはなく小さな差別になっています。

もうひとつ余談。最近は「フォルダ」と書かずに「フォルダー」と書くというのはご存知ですか?もちろん個人の自由ではありますが、実際の発音に即した表記法をすべきであるということらしいです。これは確か国語審議会の見解で、マイクロソフトはこれに従っています。最近のWindowsやマイクロソフト製のソフトではそのように表記されています。

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

2011年2月13日 (日)

いじわるしてる?なんというわかりにくさ。

Visual Basic 2010 Expressを使用すれば無料でVBのプログラミングができることはみなさんご存知かと思います。

これのWeb版のVisual Web Developer 2010 Express(以下VWD)というやはり無料のソフトがあり、これを使うと、VBやC#でWebアプリの作成ができるようになります。具体的にはASP.NET, Silverlight, Windows Azureのプログラムができます。

ところが、このインストールがあまりにもわかりにくく、インストールしてほしくないのかと思うほどだったのでブログに載せることにしました。

まず、ダウンロードページはVB Expressと共通のページです。

http://www.microsoft.com/japan/msdn/vstudio/express/

ここからリンクをクリックすればVB同様簡単にインストールできるかと思いきや、なぜかMicrosoft Web Platform Installer 3.0なるもののダウンロードページに飛ばされます。

それでも、これを入れればVWDが入るのかなと思いダウンロードしてインストールしようとするとこのような画面が表示されました。

Capture01

インストール対象(?)の一覧になにやら見慣れないものが4つ表示されていますが、肝心のVWDがないのです…。念のため左の「アプリケーション」、「製品」などをクリックしてみてもこの4つの中からフィルタリングされた結果が出てくるだけでした。

よくわからないけど4つとも入れればVWDが入るのかなと一瞬思いましたが、それにしてもこの4つの名前がそれっぽくないのでしばらく悩みましたがとうとう発見しました。

実は既定では画面上部の「おすすめ」が選択された状態になっていたのです。画面上部の「製品」をクリックするとちゃんとVWDがでてきました。

Capture03

上がクリックできるってなかなか気が付けないですよ…。言葉もちょうど「おすすめ製品アプリケーション」になっていて、若干不自然だけど1つの言葉みたいになってますし…。なお、右上の検索窓から検索もできます。

これでめでたくVWDがインストールできました。ついでにWindows Azure SDK v1.3もインストールできるみたいだったので一緒にインストールしました。

このMicrosoft Web Platform Installer 3.0というインストーラーはマイクロソフトのWeb関連の製品やツールを統合してインストールできるようになっているみたいで、それ自体はいいと思います。なにしろ、Azureプログラミングをやろうと思っただけでもあちこちからツールをダウンロードしてくる必要があるのがこれ1つでよいとなるわけですから(多分)。

でもVWDをインストールしようと思った人にもあまりにも不親切なUIだなと思いました。

実際、VWDをやろうと思ったけどこれがわからなくて断念した人がいるんじゃないでしょうか?!

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

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)

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