Red Hat を Microsoft Azure (IaaS v2) で動かす

[2016/02/18 追記] Red Hat Enterprise が Azure Marketplace (Gallery) から選択可能になったので、今後はこれを使用できます ! (以下の投稿は、Red Hat の Repository から Image を持ち込んで使う方法を記載)

azure_redhat

Red Hat Enterprise が Microsoft Azure にようやく対応したが、Azure Resource Manager (ARM) ベースの仮想マシンで動かす方法に悩んだのでメモしておく。(いま動かすなら、当然、v2 で動かしたい。)

なお、下記の細かなコマンドの中身などは、概ね、「Prepare a Red Hat-based Virtual Machine for Azure」に記載されているので、ここではどのようなことするかステップややっていることを述べておく。

まず必ず最初にハマるポイントだが、現在、Azure Marketplace (Gallery) に Red Hat のイメージはない。(今後提供される予定のようだが、少なくとも 2016 年 01 月時点では。。。)
後述する Document や Channel 9 (動画) で紹介されているが、自分で image を取得して構成し、Azure 上に展開する必要がある。

下記は、Linux の Host (Client) から作業している想定で記載する。

  1. Red Hat Enterprise のイメージを取得する
    (例えば、https://access.redhat.com/ から KVM Guest Image などを取得すると良い)
  2. 上記で取得した Red Hat の Virtual Machine (image) を起動して接続 (ログイン) する。
  3. まず、構成ファイルなどを編集して Network 関連の構成をおこなう。
    詳細は「Prepare a Red Hat-based Virtual Machine for Azure」に書かれているので参考にしてほしい。
  4. 下記の手順で Azure Linux VM Agent (WALinuxAgent) のインストールをおこなう。
    1. そのために、まず Package のインストールができるよう、Red Hat Enterprise を Subscribe しておく
      (sudo subscription-manager register)
    2. EPEL Repository の取得と有効化をおこなう
    3. Azure Linux VM Agent (WALinuxAgent) をインストールする (yum コマンド)
    4. Red Hat Enterprise を UnSubscribe する
      (sudo subscription-manager unregister)
  5. インストールした Azure Linux VM Agent を使って Generalize (Azure の展開に備えた Clean-up) を実行
    (sudo waagent -force -deprovision)
  6. Virtual Machine を shutdown する
  7. 上記で作成されたマシン イメージ ( .raw .qcow2 .vmdk など) を qemu-img コマンドを使って .vhd ファイルに変換する (qemu-img コマンドの -O オプションに vpc と指定する)。
    ただし、Azure に展開する vhd の Virtual Size は 1 MB で Round されている必要があるので要注意。.qcow2 などの場合、いったん .raw に変換した後で、qemu-img resize コマンドで 1 MB 単位に Round して、そのあとで .vhd に変換する。(Hyper-V などで作ったイメージの Virtual Size は必ず Round されているが、Linux 上の VM はそうとは限らない。)
  8. Azure CLI や Azure Resource Manager (ARM) の template を使って、上記のカスタム イメージ (vhd ファイル) を Azure に配置し、ARM ベースの Virtual Machine (VM v2) を作成する。
    この具体的手順や注意点は「Azure Resource Manager の template の How-to」の「custom image の利用」に書かれているようなので参考。(上記のように作成した vhd を、この方法で展開することが可能。)
  9. さいごに、展開された Red Hat Enterprise の VM (v2 image) にログインして Subscribe
    (sudo subscription-manager register)

結論を書くと、 上記の 8 以外 (上記の 1 – 7, 9) はドキュメントや Channel9 でも紹介されている内容と同じ。要は、作った .vhd を ただ ARM Base で展開すれば良いということのようだ。

 

※ 参考情報

Document : Prepare a Red Hat-based Virtual Machine for Azure

Channel9 : Uploading a Red Hat Enterprise Linux (RHEL) 7.1 image to Microsoft Azure

 

Office Add-ins の add-in command (カスタム Ribbon ボタン)

de:code 2015 の「Office 開発/Office 365 開発の新機能紹介」でもデモしていたアドイン コマンド (リボン コマンド) が、まずは Outlook の Mail Add-in で試せるようになったので紹介したい。

追記 : Office Add-in Command は、Excel Add-in、Word Add-in、PowerPoint Add-in でも可能になった。Outlook 以外で追加した場合、「個人用アドイン」(My Add-in) に登録されている間、常にアプリ (Excel、Word、PowerPoint) に表示される。(ドキュメント単位ではなく、アプリ単位の挿入。)
PowerPoint Add-in の “Pickit Presentation Images” などで確認できるので、是非試してみてほしい。

平たく書くと、Office Add-ins の Mail Add-ins (Mail Add-in for Outlook) で下図のような ribbon command (ボタンを押すと実行できる処理) が使えるようになったというもので、動作させるには、今のところ Windows 版の Outlook 2016 (現在 Preview) が必要だ。(いずれ Outlook Web App やその他の Native の Outlook などでも対応されるだろう。)

addin_command

これまでの Mail Add-ins では、一度、Taskpane などの形で何某かの Window (Pane) を表示して、そこに必要なボタンなどのコントロールを配置してアプリを作るしかなかったが、こうした Window (Pane) が不要なストレートな処理は、今後は上述の Add-in Command を使って作ることが可能だ。

Manifest の記述方法

今回の新機能では、Manifest (Office Add-ins で作成する .xml ファイル) の記述も大幅に拡張されているが、Office Add-ins (および、JavaScript Library) 自体のバージョンがあがるわけではなく、既存のバージョンの拡張として実装されているらしく、上述の通り、この機能が使えないプラットフォームもあるという点に注意が必要だ。例えば、Outlook 2013 から使用した際に、不明な XML 要素によりエラーが発生するようなケースは避ける必要がある。

そこで、Manifest 作成のアプローチとして、そのまま Add-in Command 用の記述を入れるのではなく、いったん過去のプラットフォーム互換な Manifest を作成し、新しいプラットフォーム (Outlook 2016 など) で使用された場合には、その内容を override するというアプローチで Manifest を記述する。

この際 必要になるのが、VersionOverrides 要素だ。
Manifest には下記の通り記述し、この VersionOverrides の中に Add-in Command 用の設定を書いていく。(この中身は、このあと作成する。)

<?xml version="1.0" encoding="UTF-8"?>
<OfficeApp
  xmlns="http://schemas.microsoft.com/office/appforoffice/1.1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"
  xmlns:mailappor="http://schemas.microsoft.com/office/mailappversionoverrides"
  xsi:type="MailApp">
  <Id>{9AADFD5D-49A0-47C8-897F-1BB59D5116B5}</Id>
  <Version>1.0</Version>
  <ProviderName>Microsoft</ProviderName>
  <DefaultLocale>en-us</DefaultLocale>
  <DisplayName DefaultValue="My App Test"></DisplayName>
  <Description DefaultValue="This is a test"></Description>
  <Requirements>
    <Sets DefaultMinVersion="1.1">
      <Set Name="Mailbox" />
    </Sets>
  </Requirements>
  <FormSettings>
    <Form xsi:type="ItemRead">
      <DesktopSettings>
        <SourceLocation
          DefaultValue="https://addintest01.azurewebsites.net/app1.html" >
        </SourceLocation>
        <RequestedHeight>150</RequestedHeight>
      </DesktopSettings>
    </Form>
    <Form xsi:type="ItemEdit">
      <DesktopSettings>
        <SourceLocation
          DefaultValue="https://addintest01.azurewebsites.net/app2.html" >
        </SourceLocation>
      </DesktopSettings>
    </Form>
  </FormSettings>
  <Permissions>ReadWriteItem</Permissions>
  <Rule xsi:type="RuleCollection" Mode="Or">
    <Rule xsi:type="ItemIs"
      ItemType="Message"
      FormType="Edit" />
    <Rule xsi:type="ItemIs"
      ItemType="Appointment"
      FormType="Edit" />
  </Rule>
  <DisableEntityHighlighting>true</DisableEntityHighlighting>
  <VersionOverrides
    xmlns="http://schemas.microsoft.com/office/mailappversionoverrides"
    xsi:type="VersionOverridesV1_0">
    <!-- we will write here later -->
  </VersionOverrides>
</OfficeApp>

例えば、ボタンを押したら、ある JavaScript 関数を実行する場合は、以下の通りプログラミングする。

まず、下記の JavaScript 関数を含む html ファイルをどこかインターネット上の見える場所に配置しておく。(今回、これを myfunc.html という名前で公開する。)
なお、下記では単にメールの返信画面を起動しているが、JavaScript API for Office の Mail 関連の API では、アイテム変更 (Compose の際)、EWS の呼び出しなど多くのことが可能なので、COM アドインに匹敵する細かな処理を記述することが可能だ。

<meta http-equiv="X-UA-Compatible" content="IE=9" >
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
  <title>My Test Page</title>
  <script type="text/javascript"
    src="https://appsforoffice.microsoft.com/lib/1.1/hosted/office.debug.js">
  </script>
  <script type="text/javascript">
  Office.initialize = function (reason) 
  {
    //// you can initialize here
    //_Om = Office.context.mailbox;
    //_Item = _Om.item;
    //_UserProfile = _Om.userProfile;
  }

  function showTest(event)
  {
    //// if you need source control, do below
    //var buttonId = event.source.id;

    // if in compose, displayReplyForm does not work ...
    Office.context.mailbox.item.displayReplyForm('reply test !');
	
    //// when compose mode, you can do below
    //
    //_Item.setSubjectAsync('Hello World!');
    //
    //Office.context.mailbox.item.body.prependAsync(
    //  'test!',
    //  {
    //    coercionType: Office.CoercionType.Text,
    //    asyncContext: { ... }
    //  },
    //  function(asyncResult) {
    //    event.completed(true);
    //  });
    
    event.completed();
  }
  </script>
</head>
<body>
</body>
</html>

そして、前述の Manifest 内の VersionOverrides に以下の通り記述する。
ここでは、Ribbon Button を配置し、このボタンが押された際に、上記の関数 showTest を呼び出している。

<VersionOverrides
  xmlns="http://schemas.microsoft.com/office/mailappversionoverrides"
  xsi:type="VersionOverridesV1_0">

  <Description resid="residDesc" />

  <Requirements>
    <bt:Sets DefaultMinVersion="1.3">
      <bt:Set Name="Mailbox" />
    </bt:Sets>
  </Requirements>

  <Hosts>
    <Host xsi:type="MailHost">

      <DesktopFormFactor>
        <FunctionFile resid="residFuncUrl" />

        <ExtensionPoint xsi:type="MessageReadCommandSurface">
          <OfficeTab id="TabDefault">
            <Group id="msgreadTabMessage.grp1">
              <Label resid="residLabel" />
              <Tooltip resid="residLabelTip" />
 
              <Control xsi:type="Button" id="button1id">
                <Label resid="residUILessButton" />
                <Tooltip resid="residTip" />
                <Supertip>
                  <Title resid="residSuperTipTitle" />
                  <Description resid="residSuperTipDesc" />
                </Supertip>
                <Icon>
                  <bt:Image size="16" resid="icon1" />
                  <bt:Image size="32" resid="icon2" />
                  <bt:Image size="80" resid="icon3" />
                </Icon>
                <Action xsi:type="ExecuteFunction">
                  <FunctionName>showTest</FunctionName>
                </Action>
              </Control>

            </Group>
          </OfficeTab>
        </ExtensionPoint>
      </DesktopFormFactor>
    </Host>
  </Hosts>

  <Resources>
    <bt:Images>
      <bt:Image id="icon1"
        DefaultValue="https://addintest01.azurewebsites.net/myimg16.bmp" >
      </bt:Image>
      <bt:Image id="icon2"
        DefaultValue="https://addintest01.azurewebsites.net/myimg32.bmp" >
      </bt:Image>
      <bt:Image id="icon3"
        DefaultValue="https://addintest01.azurewebsites.net/myimg80.bmp">
      </bt:Image>
    </bt:Images>
    <bt:Urls>
      <bt:Url id="residFuncUrl"
        DefaultValue="https://addintest01.azurewebsites.net/myfunc.html" >
      </bt:Url>
    </bt:Urls>
    <bt:ShortStrings>
      <bt:String id="residLabel"
        DefaultValue="Test App">
      </bt:String>
      <bt:String id="residUILessButton"
        DefaultValue="Do Func">
      </bt:String>
      <bt:String id="residSuperTipTitle"
        DefaultValue="SuperTip Title">
      </bt:String>
    </bt:ShortStrings>
    <bt:LongStrings>
      <bt:String id="residDesc"
        DefaultValue="This is an add-in test.">
      </bt:String>
      <bt:String id="residLabelTip"
        DefaultValue="This is an add-in test.">
      </bt:String>
      <bt:String id="residTip"
        DefaultValue="Run Test app">
      </bt:String>
      <bt:String id="residSuperTipDesc"
        DefaultValue="Run Test App">
      </bt:String>
    </bt:LongStrings>
  </Resources>

</VersionOverrides>

この Add-in を登録して Outlook 2016 で開くと、下図の通り、Mail の Read の際に Custom の Button が表示される。

execute01

このボタンをクリックすると、下図の通り、選択したメールの Reply 画面が起動する。

mail_popup

ExtensionPoint の type に指定している MessageReadCommandSurface は、「Mail の Read の画面にボタンを配置」という意味だ。ここに別の type を指定することで、Compose (メール作成・変更) の画面にボタンを配置したり、予定 (Appointment) の作成や閲覧の画面にボタンを配置することが可能だ。
また、command button ではなく、従来通りの custom pane を配置する場合、今後は、この type に CustomPane と指定して内容を記述できるようになっている。(過去のバージョンにも対応させる場合は、上述のような VersionOverrides の外の定義と、この定義の両方を書いておく必要があるだろう。)

また、Action の type に注目してほしい。
上記では ExecuteFunction を指定しているが、ここに下記の通り ShowTaskpane と指定すると、ボタンを押した際に Taskpane を表示させることが可能だ。

<VersionOverrides
  xmlns="http://schemas.microsoft.com/office/mailappversionoverrides"
  xsi:type="VersionOverridesV1_0">

  <!-- skip here ... (same as above) -->

  <Hosts>
    <Host xsi:type="MailHost">

      <DesktopFormFactor>
        <FunctionFile resid="residFuncUrl" />

        <ExtensionPoint xsi:type="MessageReadCommandSurface">
          <OfficeTab id="TabDefault">
            <Group id="msgreadTabMessage.grp1">
              <Label resid="residLabel" />
              <Tooltip resid="residLabelTip" />
 
              <Control xsi:type="Button" id="button1id">
                <Label resid="residUILessButton" />
                <Tooltip resid="residTip" />
                <Supertip>
                  <Title resid="residSuperTipTitle" />
                  <Description resid="residSuperTipDesc" />
                </Supertip>
                <Icon>
                  <bt:Image size="16" resid="icon1" />
                  <bt:Image size="32" resid="icon2" />
                  <bt:Image size="80" resid="icon3" />
                </Icon>
                <Action xsi:type="ExecuteFunction">
                  <FunctionName>showTest</FunctionName>
                </Action>
              </Control>

              <Control xsi:type="Button" id="button2id">
                <Label resid="residTaskpaneButton" />
                <Tooltip resid="residTip" />
                <Supertip>
                  <Title resid="residSuperTipTitle" />
                  <Description resid="residSuperTipDesc" />
                </Supertip>
                <Icon>
                  <bt:Image size="16" resid="icon1" />
                  <bt:Image size="32" resid="icon2" />
                  <bt:Image size="80" resid="icon3" />
                </Icon>
	              <Action xsi:type="ShowTaskpane">
	                <SourceLocation resid="residTaskpaneUrl" />
	              </Action>
              </Control>
              
            </Group>
          </OfficeTab>
        </ExtensionPoint>
      </DesktopFormFactor>
    </Host>
  </Hosts>

  <Resources>
    <bt:Images>
      <bt:Image id="icon1"
        DefaultValue="https://addintest01.azurewebsites.net/myimg16.bmp" >
      </bt:Image>
      <bt:Image id="icon2"
        DefaultValue="https://addintest01.azurewebsites.net/myimg32.bmp" >
      </bt:Image>
      <bt:Image id="icon3"
        DefaultValue="https://addintest01.azurewebsites.net/myimg80.bmp">
      </bt:Image>
    </bt:Images>
    <bt:Urls>
      <bt:Url id="residFuncUrl"
        DefaultValue="https://addintest01.azurewebsites.net/myfunc.html" >
      </bt:Url>
      <bt:Url id="residTaskpaneUrl"
        DefaultValue="https://addintest01.azurewebsites.net/mypane.html" >
      </bt:Url>
    </bt:Urls>
    <bt:ShortStrings>
      <bt:String id="residLabel"
        DefaultValue="Test App">
      </bt:String>
      <bt:String id="residUILessButton"
        DefaultValue="Do Func">
      </bt:String>
      <bt:String id="residTaskpaneButton"
        DefaultValue="Show Pane">
      </bt:String>
      <bt:String id="residSuperTipTitle"
        DefaultValue="SuperTip Title">
      </bt:String>
    </bt:ShortStrings>
    <bt:LongStrings>
      <bt:String id="residDesc"
        DefaultValue="This is an add-in test.">
      </bt:String>
      <bt:String id="residLabelTip"
        DefaultValue="This is an add-in test.">
      </bt:String>
      <bt:String id="residTip"
        DefaultValue="Run Test app">
      </bt:String>
      <bt:String id="residSuperTipDesc"
        DefaultValue="Run Test App">
      </bt:String>
    </bt:LongStrings>
  </Resources>

</VersionOverrides>

[Show Pane] ボタンを押すと、下図の通り、指定した Url のページが Pane として表示される。
もちろん、この Web ページに、これまでの Mail Add-in のように、メールや予定と連携して動作する何某かの処理 (JavaScript) を埋め込んで使うことが可能だ。

execute02

最終的に作成した Manifest のサンプルを以下に掲載しておくので、コピーして、是非試してみていただきたい。(ただし、下記の Id などは変更しておくこと。)

なお、つい最近、この新機能に関する ドキュメントがリリースされたようなので、是非、参考にされたし !

Office Dev Center : Overview of add-in commands for mail

Office Dev Center : Create a manifest for add-in commands

<?xml version="1.0" encoding="UTF-8"?>
<OfficeApp
  xmlns="http://schemas.microsoft.com/office/appforoffice/1.1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"
  xmlns:mailappor="http://schemas.microsoft.com/office/mailappversionoverrides"
  xsi:type="MailApp">
  <Id>{9AADFD5D-49A0-47C8-897F-1BB59D5116B5}</Id>
  <Version>1.0</Version>
  <ProviderName>Microsoft</ProviderName>
  <DefaultLocale>en-us</DefaultLocale>
  <DisplayName DefaultValue="My App Test"></DisplayName>
  <Description DefaultValue="This is a test"></Description>
  <Requirements>
    <Sets DefaultMinVersion="1.1">
      <Set Name="Mailbox" />
    </Sets>
  </Requirements>

  <FormSettings>
    <Form xsi:type="ItemRead">
      <DesktopSettings>
        <SourceLocation
          DefaultValue="https://addintest01.azurewebsites.net/app1.html" >
        </SourceLocation>
        <RequestedHeight>150</RequestedHeight>
      </DesktopSettings>
    </Form>
    <Form xsi:type="ItemEdit">
      <DesktopSettings>
        <SourceLocation
          DefaultValue="https://addintest01.azurewebsites.net/app2.html" >
        </SourceLocation>
      </DesktopSettings>
    </Form>
  </FormSettings>
  <Permissions>ReadWriteItem</Permissions>
  <Rule xsi:type="RuleCollection" Mode="Or">
    <Rule xsi:type="ItemIs"
      ItemType="Message"
      FormType="Edit" />
    <Rule xsi:type="ItemIs"
      ItemType="Appointment"
      FormType="Edit" />
  </Rule>
  <DisableEntityHighlighting>true</DisableEntityHighlighting>

  <VersionOverrides
    xmlns="http://schemas.microsoft.com/office/mailappversionoverrides"
    xsi:type="VersionOverridesV1_0">

    <Description resid="residDesc" />

    <Requirements>
      <bt:Sets DefaultMinVersion="1.3">
        <bt:Set Name="Mailbox" />
      </bt:Sets>
    </Requirements>

    <Hosts>
      <Host xsi:type="MailHost">

        <DesktopFormFactor>
          <FunctionFile resid="residFuncUrl" />

          <ExtensionPoint xsi:type="MessageReadCommandSurface">
            <OfficeTab id="TabDefault">
              <Group id="msgreadTabMessage.grp1">
                <Label resid="residLabel" />
                <Tooltip resid="residLabelTip" />
 
                <Control xsi:type="Button" id="button1id">
                  <Label resid="residUILessButton" />
                  <Tooltip resid="residTip" />
                  <Supertip>
                    <Title resid="residSuperTipTitle" />
                    <Description resid="residSuperTipDesc" />
                  </Supertip>
                  <Icon>
                    <bt:Image size="16" resid="icon1" />
                    <bt:Image size="32" resid="icon2" />
                    <bt:Image size="80" resid="icon3" />
                  </Icon>
                  <Action xsi:type="ExecuteFunction">
                    <FunctionName>showTest</FunctionName>
                  </Action>
                </Control>
                
                <Control xsi:type="Button" id="button2id">
                  <Label resid="residTaskpaneButton" />
                  <Tooltip resid="residTip" />
                  <Supertip>
                    <Title resid="residSuperTipTitle" />
                    <Description resid="residSuperTipDesc" />
                  </Supertip>
                  <Icon>
                    <bt:Image size="16" resid="icon1" />
                    <bt:Image size="32" resid="icon2" />
                    <bt:Image size="80" resid="icon3" />
                  </Icon>
	                <Action xsi:type="ShowTaskpane">
	                  <SourceLocation resid="residTaskpaneUrl" />
	                </Action>
                </Control>

              </Group>
            </OfficeTab>
          </ExtensionPoint>
        </DesktopFormFactor>
      </Host>
    </Hosts>

    <Resources>
      <bt:Images>
        <bt:Image id="icon1"
          DefaultValue="https://addintest01.azurewebsites.net/myimg16.bmp" >
        </bt:Image>
        <bt:Image id="icon2"
          DefaultValue="https://addintest01.azurewebsites.net/myimg32.bmp" >
        </bt:Image>
        <bt:Image id="icon3"
          DefaultValue="https://addintest01.azurewebsites.net/myimg80.bmp">
        </bt:Image>
      </bt:Images>
      <bt:Urls>
        <bt:Url id="residFuncUrl"
          DefaultValue="https://addintest01.azurewebsites.net/myfunc.html" >
        </bt:Url>
        <bt:Url id="residTaskpaneUrl"
          DefaultValue="https://addintest01.azurewebsites.net/mypane.html" >
        </bt:Url>
      </bt:Urls>
      <bt:ShortStrings>
        <bt:String id="residLabel"
          DefaultValue="Test App">
        </bt:String>
        <bt:String id="residUILessButton"
          DefaultValue="Do Func">
        </bt:String>
        <bt:String id="residTaskpaneButton"
          DefaultValue="Show Pane">
        </bt:String>
        <bt:String id="residSuperTipTitle"
          DefaultValue="SuperTip Title">
        </bt:String>
      </bt:ShortStrings>
      <bt:LongStrings>
        <bt:String id="residDesc"
          DefaultValue="This is an add-in test.">
        </bt:String>
        <bt:String id="residLabelTip"
          DefaultValue="This is an add-in test.">
        </bt:String>
        <bt:String id="residTip"
          DefaultValue="Run Test app">
        </bt:String>
        <bt:String id="residSuperTipDesc"
          DefaultValue="Run Test App">
        </bt:String>
      </bt:LongStrings>
    </Resources>

  </VersionOverrides>
</OfficeApp>

Add-in for Outlook.com (旧 Hotmail における Web Add-in 対応)

既に春にアナウンスされたが、outlook.com (旧 Hotmail) でも Mail Add-in (旧 App for Outlook の Mail App) が扱えるようになる。

Hotmail_App

Option メニューから [Manage Add-in] を選択すると Add-in の管理画面が表示され、

Manage_Addin

通常の (Exchange 版 Outlook の) Mail Add-in 同様、ここから Add-in のファイル (拡張子 .app) やオンライン上で公開されている URL を入力すれば登録が可能だ。
(正式リリースの際には、おそらく、ストアからのダウンロードも可能になるのだろう。)

Add_Addin

outlook.com で扱えるようになったことによる、もう 1 つの隠れたメリット (開発者のメリット) として、Napa で動かしやすくなったことだ。

このブログでも紹介したように、Tenant-less Napa を使うと Microsoft Account だけで Office Add-in が簡単に開発できるが、これまで、Mail Add-in (Add-in for Outlook) の展開 (配置) の際には Exchange (Exchange Online 含む) に登録する必要があり、再度、Office 365 のアカウントなどで入りなおす必要があった。
これが、この outlook.com の Add-in 対応で、Microsoft Account でログインしたまま、Add-in の動作確認まで可能になった

なお、現時点では、Preview に申し込んだ Developer のみが試せるようになっている。

Browser Only, Office 365 不要の Office Add-in 開発 – Tenant-less Napa

「Napa」という名前のブラウザ ベースの Office Add-in 開発環境があるが、これまで、Napa を使うには以下の面倒な手続きが必要だった。

  1. Office 365 アカウントを取得する (お金がかかるので、1 ヶ月試用版など)
  2. Office 365 にログインして、SharePoint の developer site を構築する
  3. 作成した site の Site Contents として、Office Store から Napa をインストールする
  4. ようやく Napa を使える

特に、昨今、Mac を利用している人も多いので Napa のような Browser ベースの開発環境は重宝するが、ただ Office Add-in 開発をするだけなのに、1 ヶ月限定の Office 365 trial を契約し、SharePoint の使い方をおぼえるなど、意味のないハードルを超える必要があった。

今後は、Napa だけ使うなら、Office 365 や SharePoint が不要で Microsoft Account さえあれば、将来に渡ってタダで利用可能 になった。(厳密には、Napa は、Live Services のアプリとして提供されるようになった。)
以下にアクセスして Microsoft Account で SignIn すれば、すぐに Napa を使い始めることができる。

Tenant-less Napa
https://www.napacloudapp.com

napa

Visual Studio Online “Monaco” さながらの Browser Editor で開発をおこなえる。

edit

そして、Run Project] を実行すると、アプリに応じて、Excel Online、Word Online、Outlook Web App などが起動して動作をすぐに確認できる。
裏側では OneDrive が使用されている

run

完成したら、Visual Studio のプロジェクトとして出力も可能だ。

Add-in for Outlook (旧 メール・アプリ) の場合のみ、「@IT – Office 用アプリの作り方と、できること/できないこと」で解説したように Exchange (サーバー) が必要となるため、結局、実行時に Office 365 アカウントにログインする必要があるが、今後 (もうすぐ)、Add-in for Outlook も Outlook.com (旧 Hotmail) で動かすことができるので、こうなると、すべての Add-in 開発で Office 365 へのログインは不要になる。(この Outlook.com 対応は、現在、限定的な Preview として提供されている。)

Office Add-in Context Highlighting

最近開催された MS の大きなイベント (BUILD, Ignite) にあわせて、Office Add-ins (旧 App for Office) にいくつか Preview を含む機能が追加されている。
そんなわけで、ちょっと自分の整理のためにも、ここ数か月で Update された Office Add-ins の内容についてメモしておきたい。

まず、少し前に提供された OWA の Context Highlighting について。

「Office用アプリ」の作り方と、できること/できないこと』で解説したように、Mail Add-ins for Outlook (旧 メール アプリ) では正規表現などの Rule (ItemHasKnownEntity, ItemHasRegularExpressionMatch を使用した Rule) を持つ Contextual Add-in では、その条件 (正規表現など) とマッチングしている場合に下図の通り Add-ins のリンクが表示されるが、まあ正直、これに気付いてクリックしてくれる人は実際なかなかいなかったのではないかと思う。。。

dt-officestoreapp_01_10

今後は、Outlook Web App で参照した際に、マッチングしている箇所に下図の通りリンクが表示されて、このリンクをクリックすることで Add-ins (アプリ) がポップアップで表示されるようになった。(下図のような感じ)

Click 前
Content_Highlighting01

Click 後
Content_Highlighting02

この機能 (Context Highlighting) は、下記のいずれかの条件に合致する場合には適用されない (その場合には、従来通りの表示方法になる) ので注意してほしい。

  • ItemHasKnownEntity として、Url か EmailAddress の Entity が使われた場合
  • type が ItemHasRegularExpressionMatch で、Property が NameBodyAsHTML か SenderSMTPAddress の Rule がある場合
  • 以下の条件に合致する OR の RuleCollection がある場合
    • 最初の Rule の type が ItemIs で、itemType が Appointment か Message
    • 次の Rule の type が ItemHasKnownEntity か ItemHasRegularExpressionMatch
  • e-mail の body が複雑な場合

例えば、下記のような Rule では、下図のように表示される。

<Rule xsi:type="RuleCollection" Mode="And">
  <Rule xsi:type="ItemIs" ItemType="Message" FormType="Read" />
  <Rule xsi:type="ItemHasRegularExpressionMatch" 
    PropertyName="BodyAsPlaintext" RegExName="highlighttest"
    RegExValue="This is [a-zA-Z0-9_-]*" />
</Rule>

Custom_Sample

Redis のすべての key と value を確認する

Redis に入っているすべての key と value を表示する PHP のサンプル コードを掲載。(自分の備忘録用)
下記では、ライブラリーとして Predis を使用した。

<?php
require "vendor/autoload.php";
Predis\Autoloader::register();

$r = new Predis\Client("tcp://test.redis.cache.windows.net:6379");
$r->auth("PcDPRkroG6M...");

// when using prefix
//$pre = $r->getOptions()->__get('prefix')->getPrefix();

$keys = $r->keys("*");
foreach ($keys as $key) {
//  if (substr($key, 0, strlen($pre)) == $pre) {
//    $key = substr($key, strlen($pre));
//  }
  $val = $r->get($key);
  echo 'key=' . $key . '; val=' . $val . '<br />';
}

$r->close();
echo 'list-up complete !';
?>

簡単に試したいなら、Azure Redis Cache + Visual Studio Online “Monaco” (Azure Web App) がおすすめ。
ブラウザーだけを使って (ローカル環境を汚さずに)、タダで動かせる!(上記は、実際に Azure で動かしたサンプル。Azure Redis Cache については こちら を参照。)

Azure VM (Ubuntu) の MySQL 環境構築

Azure Virtual Machine (Azure 仮想マシン) の Ubuntu (LINUX) を使って、MySQL 環境 (リモート接続環境、データベース作成まで) を構築する手順のメモ MySQL のインストール Azure Virtual Machine を構築したら、まずは、MySQL をインストール。 SSH, Putty などのターミナルから (リモートで) ログインをおこない、以下のコマンドを入力すれば OK。

sudo -s
sudo apt-get install mysql-server

下記の通り入力 (MySQL に root でログイン) して、正しくインストールされたかどうか確認。

// login to mysql
mysql -u root -p
// check status
mysql> status

MySQL の停止と起動は下記の通り入力する。

sudo service mysql stop
sudo service mysql start
(または sudo service mysql restart)

Database の作成 つぎに、MySQL にログインして Database を作成する。

// login to mysql
mysql -u root -p
// create database
mysql> create database testdb character set utf8;

作成されたデータベースを確認するには以下の通り。

mysql> show databases;

Remote 接続の設定 つぎに、MySQL Workbench、コマンドユーティリティ (mysql コマンド等) からリモートで管理できるように、リモート接続の設定をおこなう。 まず、作成した Azure Virtual Machine で [Settings] – [Endpoints] を選択し、MySQL の Port 番号 3306 の Endpoint を追加する。(この Endpoint を開けておく。) set_endpoints つぎに、MySQL 側でリモート接続ができるように、vi /etc/mysql/my.cnf  で下記の箇所を編集 (変更) する。 Host (Server) の IP Address は、ifconfig で確認できる。(inet addr と書かれている箇所) 変更前

bind-address = 127.0.0.1

変更後

bind-address = [Host の IP Address]

MySQL にログインし、今回は root で Remote Access できるように、下記の通り権限付与しておきます。 今回は、root に、すべてのホストからのすべての権限を付与しています。

grant all privileges on testdb.* to root@"%" identified by
  '[root password]' with grant option;

下記を実行すると、mysql.user テーブルに root@% が登録されているのがわかります。

select user, host from mysql.user;

+-------+-----------------+
| user  | host            |
+-------+-----------------+
| root  | %               |
| root  | 127.0.0.1       |
| root  | ::1             |
| root  | localhost       |
| ...   | ...             |
|       |                 |
+-------+-----------------+

以上で、Remote の環境から、MySQL のコマンド ユーティリティ (mysql コマンド等) や MySQL Workbench を使って接続できるようになります。 例えば、下記の通り入力して、あるデータベースから、別のデータベースに、オブジェクト (テーブル、データなど) を移行できます。

cd [mysql dir]/bin
mysqldump -u [username] -p[password] -h[hostname] [database name]
  --add-drop-table > [save file path]
mysql -u[username] -p[password] -h[hostname] --default-character-set=utf8
  [database name] < [read file path]
cd C:\Program Files\MySQL\MySQL Server 5.6\bin
mysqldump -u root -pP@ssw0rd -hmyserver01.cloudapp.net testdb01
  --add-drop-table > C:\tmp\db.sql
mysql -uroot -pP@ssw0rd -hmyserver02.cloudapp.net
  --default-character-set=utf8 testdb02 < C:\tmp\db.sql