テスターですが何か?

ホビープログラマ略してHPです

【日本語訳】Exploring Windows Azure Storage part22

leave a comment »

このエントリーはMSDNのチュートリアル「Exploring Windows Azure Storage」の「Task3 – Creating a New Drive in the Cloud」の日本語訳になります。このコンテンツ、日本語訳全体については、こちらのエントリーを参照してください

 

Task3 – Creating a New Drive in the Cloud

このエントリーでは、アプリケーションを変更してクラウド上に新しいドライブを作成し、マウントし、コンテンツのコピーを行います。

1.ソリューションエクスプローラーから Default.aspx を右クリックし、[マークアップの表示]を選択します。

2.以下のマークアップをページの body 部分、<h1>タグと<h2>タグの間にに追加します。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-06-MountedDrives Panel)

<body>
    <form id="form1" runat="server">
    <div>
        <h1>PhotoAlbum</h1>
            <asp:Panel ID="SelectDrive" runat="server" Visible="false">
            <asp:LinkButton ID="NewDrive" runat="server" Text="New Drive" onclick="NewDrive_Click" CssClass="newdrive" />
            Mounted Drives:
            <asp:DropDownList ID="MountedDrives" runat="server" AutoPostBack="true"
                        DataTextField="Name" DataValueField="Value"
                        OnSelectedIndexChanged="MountedDrives_SelectedIndexChanged" />
            </asp:Panel>
        <h2>Image Store Drive: (<%=this.CurrentPath%>)</h2>

Note: 追加したマークアップは、新しくWindows Azure Driveを作成するトリガーとなるボタンと、Webロールがマウントしたドライブの一覧をドロップダウンリストで表示します。

3.ソリューションエクスプローラーから、Default.aspx を右クリックし、[コードの表示]を選択してコードビハインドファイルを表示します。

4.ファイルの先頭に以下の名前空間宣言を追加します。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-07-AzureNamespaces-CS)

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;

(コードスニペット – ExploringWindowsAzureStorage-Ex04-07-AzureNamespaces-VB)

Imports Microsoft.WindowsAzure
Imports Microsoft.WindowsAzure.Diagnostics
Imports Microsoft.WindowsAzure.ServiceRuntime
Imports Microsoft.WindowsAzure.StorageClient

5.Page_PreRender メソッドへ移動し、メソッドの最後に以下のコードを追加します。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-08-Page_PreRender-CS)

        protected void Page_PreRender(object sender, EventArgs e)
        {
            GridView1.Columns[GridView1.Columns.Count - 1].Visible = (this.CurrentPath != Global.ImageStorePath);

            if (RoleEnvironment.IsAvailable)
            {
                MountedDrives.DataSource = from item in CloudDrive.GetMountedDrives()
                                           select new
                                           {
                                               Name = item.Key + " => " + item.Value,
                                               Value = item.Key
                                           };
                MountedDrives.DataBind();
                MountedDrives.SelectedValue = this.CurrentPath;
                SelectDrive.Visible = true;
                NewDrive.Text = MountedDrives.Items.Count < 2 ? "New Drive" : "Delete Drive";
            }
        }

(コードスニペット – ExploringWindowsAzureStorage-Ex04-08-Page_PreRender-VB)

    Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreRender
        GridView1.Columns(GridView1.Columns.Count - 1).Visible = (Me.CurrentPath <> Global_asax.ImageStorePath)

        If RoleEnvironment.IsAvailable Then
            MountedDrives.DataSource = From item In CloudDrive.GetMountedDrives() _
                                       Select New With {.Name = item.Key & " => " & item.Value.ToString(), .Value = item.Key}
            MountedDrives.DataBind()
            MountedDrives.SelectedValue = Me.CurrentPath
            SelectDrive.Visible = True
            NewDrive.Text = IIf(MountedDrives.Items.Count < 2, "New Drive", "Delete Drive")
        End If

    End Sub

Note: 上記コードは Webロールでマウントされたドライブの一覧をドロップダウンリストに表示します。ページBlob URIとマウントされたドライブ文字をマッピングして表示します。

6.「New Drive」リンクボタンのイベントハンドラーを実装します。以下のコードを _Default クラスに貼り付けます。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-09-NewDrive_Click-CS)

        protected void NewDrive_Click(object sender, EventArgs e)
        {
            if (RoleEnvironment.IsAvailable)
            {
                // retrieve storage account
                CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
                
                // build page blob URI for the new cloud drive by changing the extension in the original URI
                string imageStoreBlobUri = RoleEnvironment.GetConfigurationSettingValue("ImageStoreBlobUri");
                string cloneStoreBlobUri = Path.ChangeExtension(imageStoreBlobUri, "bak");
                
                // create drive and its associated page blob
                CloudDrive clonedDrive = account.CreateCloudDrive(cloneStoreBlobUri);
                if (MountedDrives.Items.Count < 2)
                {
                    try
                    {
                        clonedDrive.Create(16);
                    }
                    catch (CloudDriveException)
                    {
                        // cloud drive already exists
                    }
                    
                    // mount the drive and retrieve its path
                    LocalResource cache = RoleEnvironment.GetLocalResource("LocalDriveCache");
                    string clonedStorePath = clonedDrive.Mount(cache.MaximumSizeInMegabytes / 2, DriveMountOptions.None);
                    
                    // copy the contents from the original drive to the new drive                
                    foreach (string sourceFileName in Directory.GetFiles(Global.ImageStorePath, "*.*").Where(name => name.EndsWith(".jpg") || name.EndsWith(".png")))
                    {
                        string destinationFileName = Path.Combine(clonedStorePath, Path.GetFileName(sourceFileName));
                        File.Copy(sourceFileName, destinationFileName, true);
                    }
                    SelectImageStore(clonedStorePath);
                }
                else
                {
                    clonedDrive.Unmount();
                    clonedDrive.Delete();
                    SelectImageStore(Global.ImageStorePath);
                }
            }
        }

(コードスニペット – ExploringWindowsAzureStorage-Ex04-09-NewDrive_Click-VB)

    Protected Sub NewDrive_Click(ByVal sender As Object, ByVal e As EventArgs)

        If RoleEnvironment.IsAvailable Then

            ' retrieve storage account
            Dim account As CloudStorageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString")

            ' build page blob URI for the new cloud drive by changing the extension in the original URI
            Dim imageStoreBlobUri As String = RoleEnvironment.GetConfigurationSettingValue("ImageStoreBlobUri")
            Dim cloneStoreBlobUri As String = Path.ChangeExtension(imageStoreBlobUri, "bak")

            ' create drive and its associated page blob
            Dim clonedDrive As CloudDrive = account.CreateCloudDrive(cloneStoreBlobUri)

            If (MountedDrives.Items.Count < 2) Then
                Try
                    clonedDrive.Create(16)
                Catch e1 As CloudDriveException
                    ' cloud drive already exists
                End Try

                ' mount the drive and retrieve its path
                Dim cache As LocalResource = RoleEnvironment.GetLocalResource("LocalDriveCache")
                Dim clonedStorePath As String = clonedDrive.Mount(cache.MaximumSizeInMegabytes / 2, DriveMountOptions.None)

                ' copy the contents from the original drive to the new drive                
                For Each sourceFileName As String In Directory.GetFiles(Global_asax.ImageStorePath, "*.*").Where(Function(name) name.EndsWith(".jpg") Or name.EndsWith(".png"))
                    Dim destinationFileName As String = Path.Combine(clonedStorePath, Path.GetFileName(sourceFileName))
                    File.Copy(sourceFileName, destinationFileName, True)
                Next
                SelectImageStore(clonedStorePath)
            Else
                clonedDrive.Unmount()
                clonedDrive.Delete()
                SelectImageStore(Global_asax.ImageStorePath)
            End If
        End If
    End Sub

Note: 上記コードは2番目のドライブがマウントされているかどうかを確認します、マウントされていなければ NTFS フォーマットをクラウドドライブを新規作成し、ページBlobに関連付けます。そして、最初にマウントしたドライブのコンテンツを2番目のドライブにコピーします。2番目のドライブが存在する場合は、アンマウント後にドライブを削除します。

7.最後に、マウントされたドライブを表示するドロップダウンリストのイベント SelectedIndexChanged を実装します。以下のメソッドを _Default クラスに追加します。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-10-MountedDrives_SelectedIndexChanged-CS)

        protected void MountedDrives_SelectedIndexChanged(object sender, EventArgs e)
        {
            SelectImageStore(MountedDrives.SelectedValue);
        }

(コードスニペット – ExploringWindowsAzureStorage-Ex04-10-MountedDrives_SelectedIndexChanged-VB)

Protected Sub MountedDrives_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
  SelectImageStore(MountedDrives.SelectedValue)
End Sub

Note: 上記コードはページのコンテンツを更新するトリガーとなり、新しく選択したドライブの内容を表示します。

8.これまでのソリューションの変更をテストする準備ができました。F5キーを押下し、コンピュートエミュレーターでアプリケーションを起動します。アプリケーションが開始すると、Mounted Driveドロップダウンリストには割り当てされたクラウドドライブのドライブ文字と、それに対応したページBlobのURIが表示されます。

image

図46.マウントされたドライブを表示

9.「New Drive」リンクをクリックして、新しいドライブを作成してドライブにコンテンツをコピーしてください。ドライブを作成すると、ページが更新され新規作成したドライブのコンテンツが表示されます。Mounted Driveドロップダウンリストには2番目のドライブの情報が表示されています。

image

図.47 新規作成したドライブを表示

10.[Delete]リンクをクリックし、新規作成したドライブのファイルを削除してください。

image

図.48 2番目のドライブのファイルを削除

11.そして、ドロップダウンリストからオリジナルのドライブを選択し、コンテンツが削除されていないことを確認してください。

12.最後に、[Delete Drive]をクリックし、ドライブをアンマウントし、対応するページBlobを削除します。

image

図.49 ドライブをアンマウントし、削除

Note: このアクションは2番目のドライブのみを削除します、オリジナルのドライブは影響を受けません。

13.ブラウザを閉じます。次にアプリケーションをWindows Azureへでデプロイし、テストを行います。

 

次は「Task4 – Creating an NTFS Formatted VHD on Your Local Machine」です。

Written by david9142

2011年12月28日 @ 1:03 AM

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。