Azureの小ネタ (改)

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

Azure REST API Specifications をパースしてモデル情報を見てみる

以前、手書き(UMLツール)で以下を作図したんですが、手書きで書き起こすのはちょっとシンドイです。

statemachine.hatenablog.com

この手の物には、機械可読可能なメタモデル的な定義があるわけでして、それが何かというと以下だったりします。

GitHub - Azure/azure-rest-api-specs: The source for REST API specifications for Microsoft Azure.

これはSwagger のJSONスキーマで定義されているので、パースすれば何らかのモデル情報を読み出せると思ったので試してみました。

当初の目論見では、

  1. JSONをパース
  2. パースした内容をEMF(Eclipseメタモデルフレームワーク)でモデリングするPGを書く。EcoreでもUMLモデルでもどちらでも。
  3. 生成したモデルをGUIエディタにD&DするとDiagramができあがり。

なんてことを夢想しましたが、まだ出来ていません。

パース

Swaggerのツールセットは以下にあります。Swagger謹製のフレームワークもいくつかあります。

Open Source Integrations – Swagger

とりあえず、JavaのSwagger Parserを使ってみます。

github.com

ちなみにAzure ARM APIで使っているAutoRestも列挙されています。

パースはとても簡単で、以下を実行するだけです。リンクを直接読んでくれます。リンク先は、Azure ARM API Computeのスキーマです。

String url = "https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-compute/2015-06-15/swagger/compute.json";

SwaggerParser parser = new SwaggerParser();
Swagger swagger = parser.read(url);

swagger.getDefinitions() から定義されたモデル情報が取得できますので、適当にたどって表示させてみましょう。 例えば、VirtualMachinePropertiesというモデルのプロパティを表示させると、以下のようなプロパティ群を持つことが分かります。

** VirtualMachineProperties **
desc  : Describes the properties of a Virtual Machine.
  hardwareProfile      : ref -> #/definitions/HardwareProfile
  storageProfile       : ref -> #/definitions/StorageProfile
  osProfile            : ref -> #/definitions/OSProfile
  networkProfile       : ref -> #/definitions/NetworkProfile
  diagnosticsProfile   : ref -> #/definitions/DiagnosticsProfile
  availabilitySet      : ref -> #/definitions/SubResource
  provisioningState    : string              
  instanceView         : ref -> #/definitions/VirtualMachineInstanceView
  licenseType          : string        

なんか良い感じです。タブン、頂点のVirtualMachineモデルからたどって行けばなんとか行けそうです。

allOf

で、VirtualMachineモデルのパースがうまくいきません。スキーマとして allOfを持っているとこちらが望んだ形でパースされないことがわかりました。スキーマの該当部分は以下です。properitesをパースしてくれない感じでした。

    "VirtualMachine": {
      "properties": {
        "plan": {
          "$ref": "#/definitions/Plan",
          "description": "Gets or sets the purchase plan when deploying virtual machine from VM Marketplace images."
        },
        "properties": {
          "x-ms-client-flatten": true,
          "$ref": "#/definitions/VirtualMachineProperties"
        },
        "resources": {
          "readOnly": true,
          "type": "array",
          "items": {
            "$ref": "#/definitions/VirtualMachineExtension"
          },
          "description": "Gets the virtual machine child extension resources."
        }
      },
      "allOf": [
        {
          "$ref": "#/definitions/Resource"
        }
      ],
      "description": "Describes a Virtual Machine."
    },

ソースみたり原因さぐっていると、以下のIssueが見つかりました。どうも、そういうスキーマっぽい感じです。

Swagger is not parsing definitions with properties along with allOf · Issue #141 · swagger-api/swagger-parser · GitHub

AutoRestにも言及されていて、AutoRestのほうはヨロシクパースしてくれるんでしょうね、きっと。

というわけで、道半ばではありますが、備忘録変わりにBlogっておきます。Parserに手を入れて続けてみようかと。

Visual Studio Emacs Extension を入れた後にすること

2016/06/23 追記あり

以前、こんな記事を書きましたが、いくつかカスタマイズした備忘録として。

statemachine.hatenablog.com

CTRL-K

Kill line の挙動が微妙です。二段階で消えるのが好みなのですが、何か文字があってもいきなり行が削除され、1行詰められてしまいました。

以下のPull Requestが取り込まれたので幾分ましになったような気がします。

Merge pull request #4 from genegoykhman/master · zbrad/EmacsKeys@c9ec52d · GitHub

がまだ不完全ぽくて、空の行が消えてくれません。

2016/06/23 追記 以下のPull Requestを取り込むと好みの挙動になりました。

Correct Ctrl-K behavior by lachlanorr · Pull Request #9 · zbrad/EmacsKeys · GitHub

Home/End

Homeでファイル先頭、Endでファイル末尾に移動してしまいます。ここの挙動はWindows慣れしてしまっているので、CTRL-A、CTRL-Eと同じ動きをしてくれた方が自分好みです。オプションから適当に変更します。

Enter

Enter(改行)が「Emacs.編集の改行」に割り当たっています。このままだと、NugetのPowershellコンソールとかで、Enterが聞かなくなってしまいます。原因はよくわかってませんが。

なので、テキストエディターから、「Emacs.改行」のキーアサインを削除し、「編集.改行」へアサインしなおします。

f:id:StateMachine:20160425221100p:plain

とりあえず以上

Javaポケットリファレンス 改訂版

Javaポケットリファレンス改訂版を頂いたので書評です。Azure界隈にいますが、Azure Java SDKとか追っかけてますし Java > NET な感じの最近です。ポケットリファレンスとは名乗っていますが、順調にポケットに入らないサイズに育っているような気がします。

http://ecx.images-amazon.com/images/I/51bGuMwMu3L.SL75.jpg

[改訂新版]Javaポケットリファレンス

[改訂新版]Javaポケットリファレンス

  • 作者: WINGSプロジェクト,?江賢,山田祥寛
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/03/18
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

改訂版ですので、Java 8 の範囲までサポートされています。ライブラリのリファレンスメインですが、1章に簡単なJavaの歴史やEclipseの話、2章でも文法的な話が逆引きリファレンスとして掲載されていて一読をお勧めします。

目次はざっと以下の通りですが、

  1. Javaを始めるために
  2. 基本文法
  3. 基本API
  4. コレクション
  5. 入出力(I/O)
  6. ネットワーク
  7. データベース
  8. ユーティリティ

細かい目次は以下のURLで紹介されています。

http://gihyo.jp/book/2016/978-4-7741-8030-4

自分なりの読み方

リファレンスというと、分からないときに逆引きするイメージで机の上に置いておくことが多いかと思いますが、まずはざっと目を通して頭のなかに本の内容のインデックスを作成しておくことをお勧めします。意外と知らない発見があったりしたり、そんな機能があったなと復習にもなったりします。

標準ライブラリを知らないと損することも多いです。よくあるのは、そのAPIの存在を知らなかったばっかりに、よろしくないコードを書き散らすパターンとか。何度も目撃していますし、自分でも、こんなライブラリがあったんだと気づいたことが何度か。

現在でもグーグル先生とかピンポイントで知りたい情報にあたることもできますが、書籍としてまとまっているのはやはり強いです。こんな機能あったはずだという記憶さえ有ればポケリを当たればささっと解決することができると思います。

補足

Javaの場合標準ライブラリだけでは不足することもあるので、他の有用なライブラリとかにも目を通しておくとよいかもしれません(現場で使えないことも多いけどw)