Microsoft Graph API Library for Go

Y
Microsoft Graph API Library for Go
2019-10-28 Takeshi Yaegashi
Go Conference 2019 Autumn
自己紹介
八重樫 剛史 Takeshi Yaegashi
● 株式会社バンダイナムコスタジオ所属
● Linux・Unix・OSS・低レベルなことが好きなエンジニア
● ホームページ・ブログ https://l0w.dev
● Go のお仕事
○ Raspberry Pi を使った IoT 案件
○ スマホゲームアプリのサーバ
● Go のお話
○ golang.tokyo #25「golang binary hacks」
○ golang.tokyo #26「Raspberry Pi + Go で IoT した話」
本日のお話
msgraph.go
● https://github.com/yaegashi/msgraph.go
● Microsoft Graph の紹介
● msgraph.go の使用方法とアプリケーション、デモ (動画)
● Go 言語用クライアントライブラリの状況
● msgraph.go の実装と工夫した点
● 今後の計画
Microsoft Graph の紹介
Microsoft Graph API とは
● Microsoft のクラウドサービス (Office 365 など) を扱う統合 API
https://docs.microsoft.com/ja-jp/graph/overview
● 次のようなリソースを操作するアプリを作成できる
○ ユーザー・グループ・デバイス・ライセンス (Azure Active Directory)
○ メール・連絡先・予定表・チャット (Outlook, Teams)
○ ストレージ・ファイル・サイト (OneDrive, SharePoint)
● Office 365 を導入している会社や個人にとって利用価値が高い API
Microsoft Graph API プログラミング
● 共通のエンドポイントを使用する REST API セット
○ API Endpoint (v1.0): https://graph.microsoft.com/v1.0
○ API Reference: https://docs.microsoft.com/ja-jp/graph/api/overview
● 各言語・処理系用のクライアントライブラリ (SDK)
https://microsoftgraph.github.io/msgraph-sdk-design/
○ .NET(C#), Java, JavaScript, Objective C, PHP, Ruby, Python, …
○ 2019年10月現在、公式のGo言語用ライブラリはまだない
Go 言語用のクライアントライブラリの状況
● GitHub をリポジトリ検索してみると…
○ https://github.com/search?l=Go&q=msgraph&type=Repositories
○ go-msgraph, msgraph-go, msgoraph, … 未完のプロジェクトが多数
● msgraph.go = 今回紹介するライブラリ
○ https://github.com/yaegashi/msgraph.go
○ 2019年7月に開発開始
○ msgraph.go という名前は既存のライブラリとの衝突を避けた結果
msgraph.go 使用法とアプリの例
msgraph.go 使用法:Graph Client の作成
import "github.com/yaegashi/msgraph.go/auth"
import msgraph "github.com/yaegashi/msgraph.go/v1.0"
// Create HTTP client with Azure AD OAuth2 device authorization grant
m := auth.NewTokenManager()
t, err := m.DeviceAuthorizationGrant(tenantID, clientID, scope, nil)
if err != nil { /*...*/ }
httpClient := t.Client(context.Background())
// Create MS Graph client
graphClient := msgraph.NewClient(httpClient)
● 最初に Graph Client を作成する
● Azure Active Directory に対して OAuth2 認証を行う http.Client が必要
https://github.com/yaegashi/msgraph.go/tree/master/auth
msgraph.go 使用法:REST API 発行
// Get current user’s information
// "GET https://graph.microsoft.com/v1.0/me" -> *msgraph.User
user, err := graphClient.Me().Request().Get()
if err != nil { /*...*/ }
// Get current user's OneDrive root folder items
// "GET https://graph.microsoft.com/v1.0/me/drive/root/children" -> []msgraph.DriveItem
items, err := graphClient.Me().Drive().Root().Children().Request().Get()
if err != nil { /*...*/ }
// Create new group
// "POST https://graph.microsoft.com/v1.0/groups" -> *msgraph.Group
newGroup := &msgraph.Group{ /*...*/ }
createdGroup, err := graphClient.Groups().Request().Add(newGroup)
if err != nil { /*...*/ }
● メソッド呼び出しの連結で REST API の HTTP リクエストが出せる
レスポンスの JSON に対応するモデルの struct が返される
msgraph.go 使用法:REST API 対応コード
REST API msgraph.go 説明
GET /users users, err := cli.Users().Request().Get() 全ユーザー取得
POST /users
u := &msgraph.User{/*...*/}
user, err := cli.Users().Request().Add(u)
ユーザー作成
GET /users/XXX user, err := cli.Users().ID("XXX").Request().Get() ユーザー取得
PATCH /users/XXX
u := &msgraph.User{/*...*/}
err := cli.Users().ID("XXX").Request().Update(u)
ユーザー更新
DELETE /users/XXX err := cli.Users().ID("XXX").Request().Delete() ユーザー削除
● 各リソースコレクションの操作メソッドとモデル struct 定義が利用可能
msgraph.go 使用法:IDE による補完の活用
● REST API 仕様が Go 言語化されており IDE による補完が活用できる
● ただし Visual Studio Code は知恵熱を出して沈黙することがあり
たまに Restart Language Server する必要がある
msgraph.go アプリケーションの例:SharePoint ファイル共有アクセス
● SharePoint (OneDrive) ファイル共有のファイルを編集
● Microsoft Flow で CI ジョブ開始 msgraph.go でファイルをダウンロード
● ファイル共有上の Excel ブックの中身を直接編集する API もある
msgraph.go アプリケーションの例:msgraph-sshpubkey
● https://github.com/yaegashi/msgraph.go/tree/master/cmd/msgraph-sshpubkey
● SSH 公開鍵を User の extensions で管理できる (オープン拡張機能)
● sshd_config の AuthorizedKeysCommand で実行してユーザー認証
● サイズ 5.6MB の実行ファイルで導入が容易
AuthorizedKeysCommand /usr/bin/msgraph-sshpubkey -config /etc/msgraph-sshpubkey.json -login %u
AuthorizedKeysCommandUser root
$ cat /etc/msgraph-sshpubkey.json
{
"tenant_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"client_id": "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY",
"client_secret": "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
"login_map": {
"yaegashi": "yaegashi@l0wdev.onmicrosoft.com"
}
}
msgraph.go の実装
クライアントライブラリの実装戦略 = コード生成
● 膨大な MS Graph の機能をカバーするにはコード生成が必須
● OData v4 の REST API の定義 (XML) から自動生成する
● https://graph.microsoft.com/v1.0/$metadata
<EntityType Name="user" BaseType="microsoft.graph.directoryObject" OpenType="true">
<Property Name="userPrincipalName" Type="Edm.String" />
<Property Name="displayName" Type="Edm.String" />
<Property Name="passwordProfile" Type="microsoft.graph.passwordProfile" />
...
</EntityType>
<ComplexType Name="passwordProfile">
<Property Name="password" Type="Edm.String" />
<Property Name="forceChangePasswordNextSignIn" Type="Edm.Boolean" />
<Property Name="forceChangePasswordNextSignInWithMfa" Type="Edm.Boolean" />
</ComplexType>
2 種類のコードジェネレータの存在
● MSGraph SDK Code Generator
https://github.com/microsoftgraph/MSGraph-SDK-Code-Generator
○ Microsoft 公式 MS Graph SDK コードジェネレータ
○ C# および .NET Framework による実装 (開発に Windows が必要)
○ C# (.NET Core), Java, JavaScript, Objective-C, Python
● msgraph.go コードジェネレータ
https://github.com/yaegashi/msgraph.go/gen
○ Pure Go による実装
なぜ MSGraph SDK Code Generator があるのに msgraph.go を?
● 実は MSGraph SDK Code Generator の存在を知らなかった
○ C# (.NET) 用のライブラリを参考に msgraph.go を作り始めて
しばらく経ってから気づいた
○ 現在の msgraph.go は MSGraph SDK Code Generator を
パクったリスペクトしたコード生成を行う
● MSGraph SDK Code Generator はクロスプラットフォームでない
○ 新しい言語の対応を追加するには Windows の開発環境が必要
○ C# よくわからない
msgraph.go のコード生成
● go generate ./gen
○ metadata XML のダウンロードとコード生成を行う
○ v1.0 と beta の 2 つの API バージョンのコードを生成する
○ text/template によりテンプレートファイルからコードを生成する
○ 生成したファイルに goimports を実行して整形・import 解決
package gen
//go:generate go run msgraph-download.go -pretty -baseURL https://graph.microsoft.com/v1.0 -out metadata-v1.0.xml
//go:generate go run msgraph-download.go -pretty -baseURL https://graph.microsoft.com/beta -out metadata-beta.xml
//go:generate go run msgraph-generate.go -baseURL https://graph.microsoft.com/v1.0 -in metadata-v1.0.xml -out ../v1.0
//go:generate go run msgraph-generate.go -baseURL https://graph.microsoft.com/beta -in metadata-beta.xml -out ../beta
msgraph.go の生成ファイル
種類 生成ファイル名 v1.0 beta
定数 <EnumType> 〜Enum.go 188 528
モデル <EntityType> <ComplexType> 〜Model.go 638 1684
リクエスト 〜Request.go 247 645
アクション <Action> 〜Action.go 59 134
合計 1132 2991
● 型名・メソッド名・ファイル名は C# (.NET) 版ライブラリに倣っている
● 生成ファイルの数が多すぎ?のため godoc.org で正しく表示できない
生成コードの例:モデル struct の定義
type User struct {
DirectoryObject
UserPrincipalName *string `json:"userPrincipalName,omitempty"`
DisplayName *string `json:"displayName,omitempty"`
PasswordProfile *PasswordProfile `json:"passwordProfile,omitempty"`
/*...*/
}
type PasswordProfile struct {
Object
Password *string `json:"password,omitempty"`
ForceChangePasswordNextSignIn *bool `json:"forceChangePasswordNextSignIn,omitempty"`
ForceChangePasswordNextSignInWithMFA *bool `json:"forceChangePasswordNextSignInWithMfa,omitempty"`
}
● encoding/json の利用を前提としたフィールド名とタグがつけられる
● 基本型 (int, string, bool, etc.) や構造体はすべてポインタ型となる
● struct 埋め込みによりモデル継承、全モデルは Object struct をひとつ含む
struct埋め込み
JSON に含まれる追加データ
● API が返す JSON には、モデル struct のフィールドで定義されていない
"@odata.context" のような追加データが含まれることがよくある
● これらを単に encoding/json で Unmarshal すると失われてしまう
GET https://graph.microsoft.com/v1.0/me/
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity",
"businessPhones": [],
"displayName": "八重樫 剛史",
"givenName": "剛史",
"jobTitle": null,
"mail": "yaegashi@l0wdev.onmicrosoft.com",
"mobilePhone": null,
"officeLocation": null,
"preferredLanguage": null,
"surname": "八重樫",
"userPrincipalName": "yaegashi@l0wdev.onmicrosoft.com",
"id": "6764eb11-841c-444e-b770-0e0d8748ea0a"
}
Object / AdditionalData / jsonx による追加データの対応
type Object struct {
AdditionalData map[string]interface{} `json:"-" jsonx:"true"`
}
func (o *Object) SetAdditionalData(key string, val interface{}) {/*...*/}
func (o *Object) GetAdditionalData(key string) (interface{}, bool) {/*...*/}
user, err := graphClient.Me().Request().Get()
if err != nil { /*...*/ }
if context, ok := user.GetAdditionalData("@odata.context"); ok {
fmt.Println(context)
// -> https://graph.microsoft.com/v1.0/$metadata#users/$entity
}
● Object の AdditionalData がいわゆる catch-all 動作で追加データを格納する
● encoding/json を改造・拡張した jsonx により実現
https://github.com/yaegashi/msgraph.go/tree/master/jsonx
まとめ
msgraph.go 開発の進捗と今後の計画
● これまでの進捗
○ Go 言語で簡単な Microsft Graph アプリが作成できる段階
● 今後の計画
○ 未対応機能実装:<Function>、バッチリクエスト、長時間操作、etc.
○ 開発インフラ整備:ユニットテスト、CI/CD
○ ドキュメント:godoc.org 使えん問題解決、Graph API ドキュメント
○ ライブラリ API の安定化
公式コードジェネレータとの関わりについて
● Microsoft Graph SDKs - Requirements and Design
https://microsoftgraph.github.io/msgraph-sdk-design/
● 公式 MSGraph SDK Code Generator を Go 言語に対応させたい
○ 今後のライブラリの保守を考えると、公式コードジェネレータに Go に対応して
もらったほうが望ましいと思われる
○ msgraph.go のコード生成の経験 (jsonx とか) が生かせるはず
おわり
msgraph.go ぜひ使ってみてください
プルリクエストもお待ちしております!
1 of 27

Recommended

SIZMA TESTLERİNDE BİLGİ TOPLAMA by
SIZMA TESTLERİNDE BİLGİ TOPLAMASIZMA TESTLERİNDE BİLGİ TOPLAMA
SIZMA TESTLERİNDE BİLGİ TOPLAMABGA Cyber Security
16.3K views70 slides
INTERNET VE YEREL AĞ SIZMA TESTLERİ by
INTERNET VE YEREL AĞ SIZMA TESTLERİ INTERNET VE YEREL AĞ SIZMA TESTLERİ
INTERNET VE YEREL AĞ SIZMA TESTLERİ BGA Cyber Security
5.6K views21 slides
[AKIBA.AWS] EC2の基礎 - パフォーマンスを100%引き出すオプション設定 - by
[AKIBA.AWS] EC2の基礎 - パフォーマンスを100%引き出すオプション設定 -[AKIBA.AWS] EC2の基礎 - パフォーマンスを100%引き出すオプション設定 -
[AKIBA.AWS] EC2の基礎 - パフォーマンスを100%引き出すオプション設定 -Shuji Kikuchi
10.5K views38 slides
PORT TARAMA ve KEŞİF ÇALIŞMALARI by
PORT TARAMA ve KEŞİF ÇALIŞMALARI PORT TARAMA ve KEŞİF ÇALIŞMALARI
PORT TARAMA ve KEŞİF ÇALIŞMALARI BGA Cyber Security
20.7K views34 slides
Pentest Çalışmalarında Kablosuz Ağ Güvenlik Testleri by
Pentest Çalışmalarında Kablosuz Ağ Güvenlik TestleriPentest Çalışmalarında Kablosuz Ağ Güvenlik Testleri
Pentest Çalışmalarında Kablosuz Ağ Güvenlik TestleriBGA Cyber Security
8.1K views70 slides
Beyaz Şapkalı Hacker (CEH) Lab Kitabı by
Beyaz Şapkalı Hacker (CEH) Lab KitabıBeyaz Şapkalı Hacker (CEH) Lab Kitabı
Beyaz Şapkalı Hacker (CEH) Lab KitabıBGA Cyber Security
42.1K views300 slides

More Related Content

What's hot

tcpdumpとtcpreplayとtcprewriteと他。 by
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。(^-^) togakushi
11.9K views20 slides
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 10, 11, 12 by
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 10, 11, 12Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 10, 11, 12
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 10, 11, 12BGA Cyber Security
27.8K views202 slides
Beyaz Şapkalı Hacker başlangıç noktası eğitimi by
Beyaz Şapkalı Hacker başlangıç noktası eğitimiBeyaz Şapkalı Hacker başlangıç noktası eğitimi
Beyaz Şapkalı Hacker başlangıç noktası eğitimiKurtuluş Karasu
3.6K views261 slides
Git入門 by
Git入門Git入門
Git入門小川 昌吾
2K views73 slides
flaws.cloudに挑戦しよう! by
flaws.cloudに挑戦しよう!flaws.cloudに挑戦しよう!
flaws.cloudに挑戦しよう!zaki4649
9.8K views90 slides
ロードバランスへの長い道 by
ロードバランスへの長い道ロードバランスへの長い道
ロードバランスへの長い道Jun Kato
13.6K views20 slides

What's hot(20)

tcpdumpとtcpreplayとtcprewriteと他。 by (^-^) togakushi
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
(^-^) togakushi11.9K views
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 10, 11, 12 by BGA Cyber Security
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 10, 11, 12Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 10, 11, 12
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 10, 11, 12
BGA Cyber Security27.8K views
Beyaz Şapkalı Hacker başlangıç noktası eğitimi by Kurtuluş Karasu
Beyaz Şapkalı Hacker başlangıç noktası eğitimiBeyaz Şapkalı Hacker başlangıç noktası eğitimi
Beyaz Şapkalı Hacker başlangıç noktası eğitimi
Kurtuluş Karasu3.6K views
flaws.cloudに挑戦しよう! by zaki4649
flaws.cloudに挑戦しよう!flaws.cloudに挑戦しよう!
flaws.cloudに挑戦しよう!
zaki46499.8K views
ロードバランスへの長い道 by Jun Kato
ロードバランスへの長い道ロードバランスへの長い道
ロードバランスへの長い道
Jun Kato13.6K views
Hyper-V ネットワークの基本 by Syuichi Murashima
Hyper-V ネットワークの基本Hyper-V ネットワークの基本
Hyper-V ネットワークの基本
Syuichi Murashima275.1K views
基礎から学ぶ? EC2マルチキャスト by Noritaka Sekiyama
基礎から学ぶ? EC2マルチキャスト基礎から学ぶ? EC2マルチキャスト
基礎から学ぶ? EC2マルチキャスト
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理 by Yuki Hattori
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Yuki Hattori5.1K views
3分でわかる Azure Managed Diskのしくみ by Toru Makabe
3分でわかる Azure Managed Diskのしくみ3分でわかる Azure Managed Diskのしくみ
3分でわかる Azure Managed Diskのしくみ
Toru Makabe9.1K views
Using ngx_lua / lua-nginx-module in pixiv by Shunsuke Michii
Using ngx_lua / lua-nginx-module in pixivUsing ngx_lua / lua-nginx-module in pixiv
Using ngx_lua / lua-nginx-module in pixiv
Shunsuke Michii20K views
[AKIBA.AWS] VPN接続とルーティングの基礎 by Shuji Kikuchi
[AKIBA.AWS] VPN接続とルーティングの基礎[AKIBA.AWS] VPN接続とルーティングの基礎
[AKIBA.AWS] VPN接続とルーティングの基礎
Shuji Kikuchi14.1K views
ウェブセキュリティのありがちな誤解を解説する by Hiroshi Tokumaru
ウェブセキュリティのありがちな誤解を解説するウェブセキュリティのありがちな誤解を解説する
ウェブセキュリティのありがちな誤解を解説する
Hiroshi Tokumaru5.3K views

Similar to Microsoft Graph API Library for Go

ヒカルのGo 資料 Webアプリケーションの作り方 by
ヒカルのGo 資料 Webアプリケーションの作り方ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方Yosuke Furukawa
25.9K views43 slides
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力 by
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
6.6K views98 slides
20130315 abc firefox_os by
20130315 abc firefox_os20130315 abc firefox_os
20130315 abc firefox_osTomoaki Konno
2.2K views29 slides
2013.01.18 G*Workshop GGX 2012 Report by
2013.01.18 G*Workshop GGX 2012 Report2013.01.18 G*Workshop GGX 2012 Report
2013.01.18 G*Workshop GGX 2012 ReportYu Sudo
1.9K views78 slides
Ginとbindataで作るシングルバイナリWebApp by
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppAkihiko Horiuchi
4.5K views18 slides
Sphinx customization for OGP support at SphinxCon JP 2018 by
Sphinx customization for OGP support at SphinxCon JP 2018Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018Takayuki Shimizukawa
2.9K views34 slides

Similar to Microsoft Graph API Library for Go(20)

ヒカルのGo 資料 Webアプリケーションの作り方 by Yosuke Furukawa
ヒカルのGo 資料 Webアプリケーションの作り方ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa25.9K views
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力 by ThinReports
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports6.6K views
20130315 abc firefox_os by Tomoaki Konno
20130315 abc firefox_os20130315 abc firefox_os
20130315 abc firefox_os
Tomoaki Konno2.2K views
2013.01.18 G*Workshop GGX 2012 Report by Yu Sudo
2013.01.18 G*Workshop GGX 2012 Report2013.01.18 G*Workshop GGX 2012 Report
2013.01.18 G*Workshop GGX 2012 Report
Yu Sudo1.9K views
Ginとbindataで作るシングルバイナリWebApp by Akihiko Horiuchi
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
Akihiko Horiuchi4.5K views
Sphinx customization for OGP support at SphinxCon JP 2018 by Takayuki Shimizukawa
Sphinx customization for OGP support at SphinxCon JP 2018Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018
C#で作成するfacebookアプリ mvp community camp by Shinichi Hirauchi
C#で作成するfacebookアプリ mvp community campC#で作成するfacebookアプリ mvp community camp
C#で作成するfacebookアプリ mvp community camp
Shinichi Hirauchi4.1K views
Metahub for github by Suguru Oho
Metahub for githubMetahub for github
Metahub for github
Suguru Oho8K views
Gocon2017:Goのロギング周りの考察 by 貴仁 大和屋
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
貴仁 大和屋14.4K views
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto by Shoot Morii
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Shoot Morii20.2K views
Data apiで実現 進化するwebの世界 by Yuji Takayama
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
Yuji Takayama2.2K views
DjangoでさくっとWeb アプリケーション開発をする話 by Nakazawa Yuichi
DjangoでさくっとWeb アプリケーション開発をする話DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話
Nakazawa Yuichi23.7K views
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話 by Takuya Ueda
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
Takuya Ueda3.6K views
msgraph: Terraform provider for Microsoft Graph by yaegashi
msgraph: Terraform provider for Microsoft Graphmsgraph: Terraform provider for Microsoft Graph
msgraph: Terraform provider for Microsoft Graph
yaegashi71 views
初めての Data API CMS どうでしょう - 仙台編 - by Yuji Takayama
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
Yuji Takayama4.8K views
Microsoft Graph APIを活用した社内アプリケーション開発 by Yuki Hattori
Microsoft Graph APIを活用した社内アプリケーション開発Microsoft Graph APIを活用した社内アプリケーション開発
Microsoft Graph APIを活用した社内アプリケーション開発
Yuki Hattori23.3K views
KituraとサーバーサイドSwift by YUSUKE MORIZUMI
KituraとサーバーサイドSwiftKituraとサーバーサイドSwift
KituraとサーバーサイドSwift
YUSUKE MORIZUMI1.7K views

More from yaegashi

Terraforming Windows Virtual Desktop Infrastructure on Azure by
Terraforming Windows Virtual Desktop Infrastructure on AzureTerraforming Windows Virtual Desktop Infrastructure on Azure
Terraforming Windows Virtual Desktop Infrastructure on Azureyaegashi
127 views18 slides
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD by
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CDAzure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CDyaegashi
204 views57 slides
Customazed CLI: カスタムVMイメージ作成支援ツール by
Customazed CLI: カスタムVMイメージ作成支援ツールCustomazed CLI: カスタムVMイメージ作成支援ツール
Customazed CLI: カスタムVMイメージ作成支援ツールyaegashi
678 views16 slides
Goで作って配布するAzureコマンドラインユーティリティ by
Goで作って配布するAzureコマンドラインユーティリティGoで作って配布するAzureコマンドラインユーティリティ
Goで作って配布するAzureコマンドラインユーティリティyaegashi
226 views16 slides
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築 by
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築yaegashi
156 views27 slides
go generate 完全入門 by
go generate 完全入門go generate 完全入門
go generate 完全入門yaegashi
1.6K views13 slides

More from yaegashi(13)

Terraforming Windows Virtual Desktop Infrastructure on Azure by yaegashi
Terraforming Windows Virtual Desktop Infrastructure on AzureTerraforming Windows Virtual Desktop Infrastructure on Azure
Terraforming Windows Virtual Desktop Infrastructure on Azure
yaegashi127 views
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD by yaegashi
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CDAzure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
yaegashi204 views
Customazed CLI: カスタムVMイメージ作成支援ツール by yaegashi
Customazed CLI: カスタムVMイメージ作成支援ツールCustomazed CLI: カスタムVMイメージ作成支援ツール
Customazed CLI: カスタムVMイメージ作成支援ツール
yaegashi678 views
Goで作って配布するAzureコマンドラインユーティリティ by yaegashi
Goで作って配布するAzureコマンドラインユーティリティGoで作って配布するAzureコマンドラインユーティリティ
Goで作って配布するAzureコマンドラインユーティリティ
yaegashi226 views
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築 by yaegashi
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
yaegashi156 views
go generate 完全入門 by yaegashi
go generate 完全入門go generate 完全入門
go generate 完全入門
yaegashi1.6K views
msgraph.go: Go言語で Microsoft Graph プログラミング by yaegashi
msgraph.go: Go言語で Microsoft Graph プログラミングmsgraph.go: Go言語で Microsoft Graph プログラミング
msgraph.go: Go言語で Microsoft Graph プログラミング
yaegashi1.1K views
AnsibleでAzureの インフラを管理する話 + α by yaegashi
AnsibleでAzureの インフラを管理する話 + αAnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + α
yaegashi477 views
msgraph-sshpubkey by yaegashi
msgraph-sshpubkeymsgraph-sshpubkey
msgraph-sshpubkey
yaegashi205 views
Raspberry Pi + Go で IoT した話 by yaegashi
Raspberry Pi + Go で IoT した話Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話
yaegashi3.1K views
golang binary hacks by yaegashi
golang binary hacksgolang binary hacks
golang binary hacks
yaegashi2.8K views
StackExchangeで見たシステムプログラミング案件 by yaegashi
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
yaegashi434 views
Ansible モジュール 作成・配布・貢献 by yaegashi
Ansible モジュール 作成・配布・貢献Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献
yaegashi2.1K views

Recently uploaded

光コラボは契約してはいけない by
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけないTakuya Matsunaga
25 views17 slides
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...NTT DATA Technology & Innovation
151 views42 slides
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PC Cluster Consortium
23 views36 slides
定例会スライド_キャチs 公開用.pdf by
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdfKeio Robotics Association
132 views64 slides
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PC Cluster Consortium
45 views12 slides

Recently uploaded(12)

光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga25 views
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by PC Cluster Consortium
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by PC Cluster Consortium
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda453 views
The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.76 views
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4380 views
Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka90 views

Microsoft Graph API Library for Go

  • 1. Microsoft Graph API Library for Go 2019-10-28 Takeshi Yaegashi Go Conference 2019 Autumn
  • 2. 自己紹介 八重樫 剛史 Takeshi Yaegashi ● 株式会社バンダイナムコスタジオ所属 ● Linux・Unix・OSS・低レベルなことが好きなエンジニア ● ホームページ・ブログ https://l0w.dev ● Go のお仕事 ○ Raspberry Pi を使った IoT 案件 ○ スマホゲームアプリのサーバ ● Go のお話 ○ golang.tokyo #25「golang binary hacks」 ○ golang.tokyo #26「Raspberry Pi + Go で IoT した話」
  • 3. 本日のお話 msgraph.go ● https://github.com/yaegashi/msgraph.go ● Microsoft Graph の紹介 ● msgraph.go の使用方法とアプリケーション、デモ (動画) ● Go 言語用クライアントライブラリの状況 ● msgraph.go の実装と工夫した点 ● 今後の計画
  • 5. Microsoft Graph API とは ● Microsoft のクラウドサービス (Office 365 など) を扱う統合 API https://docs.microsoft.com/ja-jp/graph/overview ● 次のようなリソースを操作するアプリを作成できる ○ ユーザー・グループ・デバイス・ライセンス (Azure Active Directory) ○ メール・連絡先・予定表・チャット (Outlook, Teams) ○ ストレージ・ファイル・サイト (OneDrive, SharePoint) ● Office 365 を導入している会社や個人にとって利用価値が高い API
  • 6. Microsoft Graph API プログラミング ● 共通のエンドポイントを使用する REST API セット ○ API Endpoint (v1.0): https://graph.microsoft.com/v1.0 ○ API Reference: https://docs.microsoft.com/ja-jp/graph/api/overview ● 各言語・処理系用のクライアントライブラリ (SDK) https://microsoftgraph.github.io/msgraph-sdk-design/ ○ .NET(C#), Java, JavaScript, Objective C, PHP, Ruby, Python, … ○ 2019年10月現在、公式のGo言語用ライブラリはまだない
  • 7. Go 言語用のクライアントライブラリの状況 ● GitHub をリポジトリ検索してみると… ○ https://github.com/search?l=Go&q=msgraph&type=Repositories ○ go-msgraph, msgraph-go, msgoraph, … 未完のプロジェクトが多数 ● msgraph.go = 今回紹介するライブラリ ○ https://github.com/yaegashi/msgraph.go ○ 2019年7月に開発開始 ○ msgraph.go という名前は既存のライブラリとの衝突を避けた結果
  • 9. msgraph.go 使用法:Graph Client の作成 import "github.com/yaegashi/msgraph.go/auth" import msgraph "github.com/yaegashi/msgraph.go/v1.0" // Create HTTP client with Azure AD OAuth2 device authorization grant m := auth.NewTokenManager() t, err := m.DeviceAuthorizationGrant(tenantID, clientID, scope, nil) if err != nil { /*...*/ } httpClient := t.Client(context.Background()) // Create MS Graph client graphClient := msgraph.NewClient(httpClient) ● 最初に Graph Client を作成する ● Azure Active Directory に対して OAuth2 認証を行う http.Client が必要 https://github.com/yaegashi/msgraph.go/tree/master/auth
  • 10. msgraph.go 使用法:REST API 発行 // Get current user’s information // "GET https://graph.microsoft.com/v1.0/me" -> *msgraph.User user, err := graphClient.Me().Request().Get() if err != nil { /*...*/ } // Get current user's OneDrive root folder items // "GET https://graph.microsoft.com/v1.0/me/drive/root/children" -> []msgraph.DriveItem items, err := graphClient.Me().Drive().Root().Children().Request().Get() if err != nil { /*...*/ } // Create new group // "POST https://graph.microsoft.com/v1.0/groups" -> *msgraph.Group newGroup := &msgraph.Group{ /*...*/ } createdGroup, err := graphClient.Groups().Request().Add(newGroup) if err != nil { /*...*/ } ● メソッド呼び出しの連結で REST API の HTTP リクエストが出せる レスポンスの JSON に対応するモデルの struct が返される
  • 11. msgraph.go 使用法:REST API 対応コード REST API msgraph.go 説明 GET /users users, err := cli.Users().Request().Get() 全ユーザー取得 POST /users u := &msgraph.User{/*...*/} user, err := cli.Users().Request().Add(u) ユーザー作成 GET /users/XXX user, err := cli.Users().ID("XXX").Request().Get() ユーザー取得 PATCH /users/XXX u := &msgraph.User{/*...*/} err := cli.Users().ID("XXX").Request().Update(u) ユーザー更新 DELETE /users/XXX err := cli.Users().ID("XXX").Request().Delete() ユーザー削除 ● 各リソースコレクションの操作メソッドとモデル struct 定義が利用可能
  • 12. msgraph.go 使用法:IDE による補完の活用 ● REST API 仕様が Go 言語化されており IDE による補完が活用できる ● ただし Visual Studio Code は知恵熱を出して沈黙することがあり たまに Restart Language Server する必要がある
  • 13. msgraph.go アプリケーションの例:SharePoint ファイル共有アクセス ● SharePoint (OneDrive) ファイル共有のファイルを編集 ● Microsoft Flow で CI ジョブ開始 msgraph.go でファイルをダウンロード ● ファイル共有上の Excel ブックの中身を直接編集する API もある
  • 14. msgraph.go アプリケーションの例:msgraph-sshpubkey ● https://github.com/yaegashi/msgraph.go/tree/master/cmd/msgraph-sshpubkey ● SSH 公開鍵を User の extensions で管理できる (オープン拡張機能) ● sshd_config の AuthorizedKeysCommand で実行してユーザー認証 ● サイズ 5.6MB の実行ファイルで導入が容易 AuthorizedKeysCommand /usr/bin/msgraph-sshpubkey -config /etc/msgraph-sshpubkey.json -login %u AuthorizedKeysCommandUser root $ cat /etc/msgraph-sshpubkey.json { "tenant_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "client_id": "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY", "client_secret": "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ", "login_map": { "yaegashi": "yaegashi@l0wdev.onmicrosoft.com" } }
  • 16. クライアントライブラリの実装戦略 = コード生成 ● 膨大な MS Graph の機能をカバーするにはコード生成が必須 ● OData v4 の REST API の定義 (XML) から自動生成する ● https://graph.microsoft.com/v1.0/$metadata <EntityType Name="user" BaseType="microsoft.graph.directoryObject" OpenType="true"> <Property Name="userPrincipalName" Type="Edm.String" /> <Property Name="displayName" Type="Edm.String" /> <Property Name="passwordProfile" Type="microsoft.graph.passwordProfile" /> ... </EntityType> <ComplexType Name="passwordProfile"> <Property Name="password" Type="Edm.String" /> <Property Name="forceChangePasswordNextSignIn" Type="Edm.Boolean" /> <Property Name="forceChangePasswordNextSignInWithMfa" Type="Edm.Boolean" /> </ComplexType>
  • 17. 2 種類のコードジェネレータの存在 ● MSGraph SDK Code Generator https://github.com/microsoftgraph/MSGraph-SDK-Code-Generator ○ Microsoft 公式 MS Graph SDK コードジェネレータ ○ C# および .NET Framework による実装 (開発に Windows が必要) ○ C# (.NET Core), Java, JavaScript, Objective-C, Python ● msgraph.go コードジェネレータ https://github.com/yaegashi/msgraph.go/gen ○ Pure Go による実装
  • 18. なぜ MSGraph SDK Code Generator があるのに msgraph.go を? ● 実は MSGraph SDK Code Generator の存在を知らなかった ○ C# (.NET) 用のライブラリを参考に msgraph.go を作り始めて しばらく経ってから気づいた ○ 現在の msgraph.go は MSGraph SDK Code Generator を パクったリスペクトしたコード生成を行う ● MSGraph SDK Code Generator はクロスプラットフォームでない ○ 新しい言語の対応を追加するには Windows の開発環境が必要 ○ C# よくわからない
  • 19. msgraph.go のコード生成 ● go generate ./gen ○ metadata XML のダウンロードとコード生成を行う ○ v1.0 と beta の 2 つの API バージョンのコードを生成する ○ text/template によりテンプレートファイルからコードを生成する ○ 生成したファイルに goimports を実行して整形・import 解決 package gen //go:generate go run msgraph-download.go -pretty -baseURL https://graph.microsoft.com/v1.0 -out metadata-v1.0.xml //go:generate go run msgraph-download.go -pretty -baseURL https://graph.microsoft.com/beta -out metadata-beta.xml //go:generate go run msgraph-generate.go -baseURL https://graph.microsoft.com/v1.0 -in metadata-v1.0.xml -out ../v1.0 //go:generate go run msgraph-generate.go -baseURL https://graph.microsoft.com/beta -in metadata-beta.xml -out ../beta
  • 20. msgraph.go の生成ファイル 種類 生成ファイル名 v1.0 beta 定数 <EnumType> 〜Enum.go 188 528 モデル <EntityType> <ComplexType> 〜Model.go 638 1684 リクエスト 〜Request.go 247 645 アクション <Action> 〜Action.go 59 134 合計 1132 2991 ● 型名・メソッド名・ファイル名は C# (.NET) 版ライブラリに倣っている ● 生成ファイルの数が多すぎ?のため godoc.org で正しく表示できない
  • 21. 生成コードの例:モデル struct の定義 type User struct { DirectoryObject UserPrincipalName *string `json:"userPrincipalName,omitempty"` DisplayName *string `json:"displayName,omitempty"` PasswordProfile *PasswordProfile `json:"passwordProfile,omitempty"` /*...*/ } type PasswordProfile struct { Object Password *string `json:"password,omitempty"` ForceChangePasswordNextSignIn *bool `json:"forceChangePasswordNextSignIn,omitempty"` ForceChangePasswordNextSignInWithMFA *bool `json:"forceChangePasswordNextSignInWithMfa,omitempty"` } ● encoding/json の利用を前提としたフィールド名とタグがつけられる ● 基本型 (int, string, bool, etc.) や構造体はすべてポインタ型となる ● struct 埋め込みによりモデル継承、全モデルは Object struct をひとつ含む struct埋め込み
  • 22. JSON に含まれる追加データ ● API が返す JSON には、モデル struct のフィールドで定義されていない "@odata.context" のような追加データが含まれることがよくある ● これらを単に encoding/json で Unmarshal すると失われてしまう GET https://graph.microsoft.com/v1.0/me/ { "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity", "businessPhones": [], "displayName": "八重樫 剛史", "givenName": "剛史", "jobTitle": null, "mail": "yaegashi@l0wdev.onmicrosoft.com", "mobilePhone": null, "officeLocation": null, "preferredLanguage": null, "surname": "八重樫", "userPrincipalName": "yaegashi@l0wdev.onmicrosoft.com", "id": "6764eb11-841c-444e-b770-0e0d8748ea0a" }
  • 23. Object / AdditionalData / jsonx による追加データの対応 type Object struct { AdditionalData map[string]interface{} `json:"-" jsonx:"true"` } func (o *Object) SetAdditionalData(key string, val interface{}) {/*...*/} func (o *Object) GetAdditionalData(key string) (interface{}, bool) {/*...*/} user, err := graphClient.Me().Request().Get() if err != nil { /*...*/ } if context, ok := user.GetAdditionalData("@odata.context"); ok { fmt.Println(context) // -> https://graph.microsoft.com/v1.0/$metadata#users/$entity } ● Object の AdditionalData がいわゆる catch-all 動作で追加データを格納する ● encoding/json を改造・拡張した jsonx により実現 https://github.com/yaegashi/msgraph.go/tree/master/jsonx
  • 25. msgraph.go 開発の進捗と今後の計画 ● これまでの進捗 ○ Go 言語で簡単な Microsft Graph アプリが作成できる段階 ● 今後の計画 ○ 未対応機能実装:<Function>、バッチリクエスト、長時間操作、etc. ○ 開発インフラ整備:ユニットテスト、CI/CD ○ ドキュメント:godoc.org 使えん問題解決、Graph API ドキュメント ○ ライブラリ API の安定化
  • 26. 公式コードジェネレータとの関わりについて ● Microsoft Graph SDKs - Requirements and Design https://microsoftgraph.github.io/msgraph-sdk-design/ ● 公式 MSGraph SDK Code Generator を Go 言語に対応させたい ○ 今後のライブラリの保守を考えると、公式コードジェネレータに Go に対応して もらったほうが望ましいと思われる ○ msgraph.go のコード生成の経験 (jsonx とか) が生かせるはず