読者です 読者をやめる 読者になる 読者になる

Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Azure SDK for Java 1.0.0-beta2 VM編

Azure ARM Java SDK

今回は、よくあるVMの操作についてです。

一覧

AzureインスタンスからVM一覧を取得できます。各プロパティが、getter/setterではなくて、単なるname()とか、computerName()とかになってます。 前々から不便だったresource group を取得するメソッドも増えました。GroupbalResourceというインタフェースが増えたみたいです。

        Azure azure = Azure.authenticate(new File("my.azureauth")).withDefaultSubscription();

        for (VirtualMachine vm : azure.virtualMachines().list()) {
            System.out.println(vm.name());
            System.out.println(vm.computerName());
            System.out.println(vm.resourceGroupName());
        }

VMの作成

VMの作成もFluent Interfaceで楽に記述できるようになってます。よくある構成は以下のコードでさくっとできてしまいます。

良くなった点として

  • イメージの宣言が容易されている
  • 同じくインスタンスサイズも
  • 一々関連リソースを手続き的に作成しなくてもよくなった

感じでしょうか。宣言は最初から用意しておけよというかんじですし、ARM APIとしては採取的にARM Templateに準拠したJSONが投げられるだけなので、 いままでが冗長すぎた感じでしょうか。

    public static void CreateVM(Azure azure, String password) throws Exception {
    
        VirtualMachine linuxVM = azure.virtualMachines().define("myLinuxVM")
                .withRegion(Region.ASIA_EAST)
                .withNewResourceGroup("testfromjava")
                .withNewPrimaryNetwork("10.0.0.0/28")
                .withPrimaryPrivateIpAddressDynamic()
                .withNewPrimaryPublicIpAddress("mylinuxvmdns")
                .withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER)
                .withAdminUserName("azureuser")
                .withPassword(password)
                .withSize(VirtualMachineSizeTypes.STANDARD_A1)
                .create();
    }

というわけで、今回は以上。いままでのAPIと.NET 側がどうなったか少しきになりますね。

Azure Java SDK 1.0.0-beta2

Azure Java ARM SDK

Azure Java SDK が 少し新しくなって、 1.0.0-beta2 となりました。まだ全てのリソースに対応していませんが、APIが少し変わったので試してみます。基本、以下のGitHubにつらつらと書かれているものです。

github.com

認証

以前は、つらつらとコードを記述しなくてはいけませんでしたが、プロパティファイルに対応してます。例のごとく以下の情報が必要です。

  • サブスクリプションID
  • テナントID
  • アプリケーションID(クライアントID) Azure ADで登録する
  • アプリケーションキー(クライアントキーだったり、パスワード) Azure ADで登録する
  • 各種URL

詳細は、以下の Authentication in Azure Management Libraries for Java を参照のこと。 azure-sdk-for-java/AUTH.md at master · Azure/azure-sdk-for-java · GitHub

subscription=########-####-####-####-############
client=########-####-####-####-############
key=XXXXXXXXXXXXXXXX
tenant=########-####-####-####-############
managementURI=https\://management.core.windows.net/
baseURL=https\://management.azure.com/
authURL=https\://login.windows.net/

各種URLは、中国とか内部的なテストサイトもあるでしょうし、メンドウならが毎度指定する必要があります。

サブスクリプション情報を取得するには、以下で完了です。

Azure azure = Azure.authenticate(new File("my.azureauth")).withDefaultSubscription();

今回、Azureというクラスを基点に各種APIを呼び出せるようになります。一例として、リソースグループ一覧を取り出したい場合、

azure.resourceGroups().list().forEach(rg -> System.out.println(rg.name()));

Java8と組み合わせると、だいぶスッキリ記述できる予感ですので、もう少し掘り下げたいと思います。

以上

Javaから Cognitive Service Face APIを使う

Java

Project Oxford 改め、Cognitive Service の Face APIを Javaから使ってみましょう。

www.microsoft.com

使うまでの登録とかキーの取得とかは割愛します。

ソース

クライアントSDKは、以下のGithubで公開されています。その中からFace APIを参照しますと、Android/iOS/Windows の3つのプラットフォームしかサポートされてません。Mavenに登録されているSDKもAndroid 専用のようです。

https://github.com/Microsoft/ProjectOxford-ClientSDK

多分、Pure Javaでそのままコンパイルできると思ってやってみました。

ProjectOxford-ClientSDK/Face/Android/ClientLibrary at master · Microsoft/ProjectOxford-ClientSDK · GitHub

Androidのフォルダからsrc/main 配下をCopyして任意のIDEに持ってきます。

元は、gradleなんですけど、ちょっと慣れてないので、Maven向けにPom.xmlを用意します。以下抜粋ですけど、

  • Java8 でコンパイル(7でもいいのかも)
  • Apache Http Components
  • Google Gson

の環境となっております。

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
                    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.3.1</version>
        </dependency>
    </dependencies>

これでさくっとコンパイルできるかとおもいます。

実行

次に実行してみます。顔画像をInputStreamにして、detect を呼び出すと認識してくれます。 ちょっとAPIがJavaっぽくなくて、Public Fieldの使い方とかちょっとアレだなぁと思います。 Android向けなのでそんなもの?と思ったけど、そんなことないですよねぇ。NETのプロパティをそのままフィールド変数にしてるだけかとは思いますが。

 public static void main(String[] args) {

        // Clientを生成 (要認証キ-)
        FaceServiceRestClient client = new FaceServiceRestClient(key);

        // 画像を読む
        try (FileInputStream imageStream = new FileInputStream(image)) {

            // 取得したい属性の配列
            FaceAttributeType[] faceAttributeTypes = { FaceAttributeType.Age, FaceAttributeType.Smile,
                    FaceAttributeType.Gender };

            Face[] detect = client.detect(imageStream, false, true, faceAttributeTypes);

            for (Face face : detect) {
                System.out.println("age    : " + face.faceAttributes.age);
                System.out.println("gender : " + face.faceAttributes.smile);
                System.out.println("simple : " + face.faceAttributes.gender);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

実行結果はこんな感じ。

age    : 35.7
gender : 0.008
simple : male

以上、さらっと使った結果でした。