2015年10月20日火曜日

EWS(Exchange Web Service)接続仕様解説

はじめに

本ドキュメントはEWS(Exchange Web Service)を使用して、
スケジュールの取得、更新、削除の方法を解説する。
また、スケジュールのカスタムフィールドを埋め込んで予定を作成する方法も解説する。
EWSではスケジュールの他に連絡先、メールなどの取得機能がありますが、スケジュールに関するに機能にのみに絞って説明する。
Exchange Server 2010以降を対象とする。

基本的な方針

EWSはSOAP通信によってリクエストをPOSTで送ることで、Exchangeに持つ情報を操作可能。
また、httpsを使用するためSSL証明書をインストールする必要がある。
今回は通信時にBasic認証を行って認証するものとする。
EWSで使用できる命令一覧は以下を参照

スケジュール取得(FindItem, GetItem)

入力例1(時間を指定してスケジュールを取得)

FindItemによるスケジュール取得方法を示す。



  
    
      
        Default
      
      
      
        
      
    
  


BaseShape, CalendarView の値を変えることで、以下のように結果を指定できる。
BaseShape 意味
IdOnly IDのみを返す
Default デフォルトで規定されているプロパティを返す
AllProperties Exchange Business Logic レイヤで規定されているすべてのプロパティを返す
CalendarView 意味
MaxEntriesReturned 取得するスケジュールの最大件数を指定する。
StartDate 開始日時を指定する。表記はタイムゾーン(YYYY-MM-DDThh:mm:ss+09:00)
EndDate 終了日時を指定する。表記はタイムゾーン(YYYY-MM-DDThh:mm:ss+09:00)

応答例1

"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : 2414b9a2-3098-4a78-afea-13ca70b8d541
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=e1c788bc304a4876a75a8ceb9a15818e; expires=Mon, 07-Mar-2016 19:27:29 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I387GxczIxc3G; expires=Sat, 07-Mar-2015 19:37:29 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 19:27:28 GMT
connection : close
"--------------BODY SECTION-------------------"


  
    
  
  
    
      
        
          NoError
          
            
              
                
              
            
          
        
      
    
  

入力例2(GetItemによる取得)

スケジュールの固有ID, ChangeKeyが分かっていれば、GetItemでIDを指定して取得することが可能。
IDはオブジェクトに一意に付与される。ChangeKeyはオブジェクトのある特定の状態を表すもので、オブジェクトが更新されると、ChangeKeyも変化する。



  
    
      
        IdOnly
        
          
        
      
      
        
      
    
  

応答例2

"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : e04c54a3-d851-4a91-aa57-4ff707bf57cb
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=ada4db7f7ca448458f78c9a5cefb8b0e; expires=Mon, 07-Mar-2016 22:42:49 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I383NxcrNxcvG; expires=Sat, 07-Mar-2015 22:52:49 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 22:42:49 GMT
connection : close
"--------------BODY SECTION-------------------"


  
    
  
  
    
      
        
          NoError
          
            
              
              4月の予定
            
          
        
      
    
  

スケジュール新規作成(CreateItem)

CreateItemを使用してスケジュールが新規作成できる。

入力例3




  
    
      
        
      
      
        
          テスト予定(Powered by EWS)
          This is test meeting
          2015-04-04T14:00:00
          2015-04-04T15:00:00
          false
          Busy
        
      
    
  


応答例3

"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : 809f50a6-f346-4d80-9695-6af66379c8d1
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=573595eeeb4d498bb0102f09e8ef26a1; expires=Mon, 07-Mar-2016 22:51:22 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I383Mxc/Oxc3M; expires=Sat, 07-Mar-2015 23:01:23 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 22:51:22 GMT
connection : close
"--------------BODY SECTION-------------------"


  
    
  
  
    
      
        
          NoError
          
            
              
            
          
        
      
    
  

DeleteItemでIDを指定することで、削除可能。

入力例4




  
    
      
        
      
    
  

DeleteTypeを指定することで以下のように削除方法を指定できる。
DeleteType 意味
MaxEntriesReturned 物理的に消去する。
SoftDelete 回復可能な削除領域に移動させる(削除済みアイテムの保持が有効な場合)
MoveToDeletedItems アイテムを削除済みフォルダに移動させる。

応答例4

--------------HEADER SECTION-------------------
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : e08d3acf-3ee2-4a9b-b39e-28ac0229527b
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=7070dbf7a6ef43938b076150169c3d3b; expires=Mon, 07-Mar-2016 17:57:21 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I387Hxc/Ixc3O; expires=Sat, 07-Mar-2015 18:07:21 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 17:57:20 GMT
connection : close
--------------BODY SECTION-------------------


  
    
  
  
    
      
        
          NoError
        
      
    
  

スケジュール更新(UpdateItem)

UpdateItemを使用することで、既存のスケジュールを更新可能。
IDとChangeKeyの両方を指定する必要がある。

入力例5




  
    
      
        
          
          
            
              
              
                Modified
              
            
          
        
      
    
  

更新内容が競合した場合、ConflictResolutionの指定により以下のような挙動となる。
ConflictResolution 意味
NeverOverwrite 競合が発生したら上書きしない。
AutoResolve 競合が発生したら自動的に解決を試みる。
AlwaysOverwrite 競合が発生しても常に上書きする。

応答例5

--------------HEADER SECTION-------------------
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : 0b9bccc5-c440-468a-8b40-cd2b186a583a
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=f5fd2b1f008d45d3a0668b5c5dffebc3; expires=Mon, 07-Mar-2016 20:04:12 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I383Pxc7Lxc7N; expires=Sat, 07-Mar-2015 20:14:12 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 20:04:12 GMT
connection : close
--------------BODY SECTION-------------------


  
    
  
  
    
      
        
          NoError
          
            
              
            
          
        
      
    
  


カスタム項目を追加する場合

以下のようにExtendedPropertyを指定することで、カスタム項目を追加して
予定を新規作成できる。
PropertyNameに任意の名前を記述でき、PropertyTypeはデータの型を表す。
(以下の例ではAccountNoというカスタム項目を追加している)

入力例6




  
    
      
        
      
      
        
          CUSTOMテスト予定2(Powered by EWS)
          This is test meeting
          
            
            320
          
          2015-04-06T14:00:00+09:00
          2015-04-06T15:00:00+09:00
          false
          Busy
        
      
    
  

応答例6

"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : c40b2b35-4aa8-4940-8548-3ea19ccede2a
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=141d265651ac42aeab68137b65067650; expires=Sat, 12-Mar-2016 23:14:20 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M7N383Mxc3Lxc3I; expires=Thu, 12-Mar-2015 23:24:27 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Thu, 12 Mar 2015 23:14:26 GMT
connection : close
"--------------BODY SECTION-------------------"


  
    
  
  
    
      
        
          NoError
          
            
              
            
          
        
      
    
  


カスタム項目が付与されたレコードを取得するには、カスタム項目で指定したPropertyNameを以下のように指定する必要がある。

入力例7





  
    
      
        IdOnly
        

            

        
      
      
        
      
    
  

応答例7

"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : c98ce9a5-70d6-42bc-acfb-28f809617b43
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=c2e612b25a6a495491dbb61db49a7e25; expires=Sat, 12-Mar-2016 23:19:35 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M7N383Mxc3GxczJ; expires=Thu, 12-Mar-2015 23:29:36 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Thu, 12 Mar 2015 23:19:36 GMT
connection : close
"--------------BODY SECTION-------------------"


  
    
  
  
    
      
        
          NoError
          
            
              
              
                
                320
              
            
          
        
      
    
  

"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : c40b2b35-4aa8-4940-8548-3ea19ccede2a
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=141d265651ac42aeab68137b65067650; expires=Sat, 12-Mar-2016 23:14:20 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M7N383Mxc3Lxc3I; expires=Thu, 12-Mar-2015 23:24:27 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Thu, 12 Mar 2015 23:14:26 GMT
connection : close
"--------------BODY SECTION-------------------"


  
    
  
  
    
      
        
          NoError
          
            
              
            
          
        
      
    
  

参考資料

参考文献
ひと目でわかる Exchange Server 2013

変更履歴

  • 1.0 初版作成

間違いなどありましたら指摘いただけると幸いです。

Written with StackEdit.

2015年10月14日水曜日

ISUCON5のベンチを動かすメモ


ISUCON5の予選問題を動かしてみたいけどどうやったらいいのかよくわからん人用のメモ。

GCPアカウント作成~イメージ作成まではレギュレーションに書いてあるので省略。

$ sudo su - isucon
$ vi .bashrc

 //以下を追記
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
alias ll="ls -la"
alias vi="vim"
 //.bashrc反映
$ . .bashrc
 // リポジトリをクローン
$ git clone https://github.com/isucon/isucon5-qualify.git

$ cd isucon5-qualify/bench

 //ビルド
$ gradle compileJava

 //jq入れる
$ sudo apt-get install jq

 //ベンチ実行
$  ( curl localhost/initialize;cd ~/isucon5-qualify/bench; cat ~/isucon5-qualify/webapp/script/testsets/testsets.json  | jq .[0] | gradle run )

自分の環境ではなぜかベンチがJSTの時刻を取得できなくてうまく動いてなかったので、
以下の修正を入れた。

$vi ./bench/src/main/java/net/isucon/isucon5q/bench/scenario/BootstrapChecker.java
LocalDateTime beforeUpdates = LocalDateTime.now().withNano(0);
LocalDateTime afterUpdates = LocalDateTime.now().withNano(0);

 => 以下のようにZoneIdを指定
//ZoneIdをインポート
import java.time.ZoneId;

ZoneId zoneId = ZoneId.of("Asia/Tokyo");
LocalDateTime beforeUpdates = LocalDateTime.now(zoneId).withNano(0);
LocalDateTime afterUpdates = LocalDateTime.now(zoneId).withNano(0);


以上。