110709 silverlight square_tanaka_pub

77
田田 田田 (@tanaka_733) 2011/07/09 1 Silverlight×Java 田田田田田田

Upload: -

Post on 28-May-2015

1.303 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: 110709 silverlight square_tanaka_pub

1

田中 孝佳 (@tanaka_733)

2011/07/09

Silverlight×Java で業務アプリ

Page 2: 110709 silverlight square_tanaka_pub

2

AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 3: 110709 silverlight square_tanaka_pub

3

あらかじめおことわり Java との連携部分を中心に話すので、

MVVM 的な話はほとんどありません でも、 MVVM 的に作ってますよ

同様に細かい View の作り方もないです サンプルコードが細かい字ですが、

あとで公開します デモもやるつもりですが、

マシンスペックの都合で動かないかも・・・

2011/07/09

Page 4: 110709 silverlight square_tanaka_pub

4

Agenda1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 5: 110709 silverlight square_tanaka_pub

5

自己紹介 ㈱ワークスアプリケーションズ所属

ERP パッケージの会社です 研究部門 クラウド担当

パブリッククラウドで ERP パッケージを提供 お仕事

AWS, Java, Oracle, Silverlight お仕事ブログ

http://dev.worksap.co.jp/Members/t_tanaka/ 趣味

Silverlight, WP7(without 実機 ) Azure Kinect(without Xbox) 趣味のブログ (URL 変えました。リダイレクトされます )

http://techblog.hilife-jp.info/2011/07/09

1. 背景

Page 6: 110709 silverlight square_tanaka_pub

6

お仕事の内容研究

• クラウドを使って面白いことをする• クラウドを安全に手軽に使ってもらう• 雑誌の記事を執筆させてもらったり

(G-CLOUD Magazine 2011 Summer)

クラウド管理ツール (Wc3)

• 社内で IaaS(AWS) を便利に使うためのアプリ• Azure の管理コンソールを社内利用に特化させたイメージ

2011/07/09

1. 背景

Page 7: 110709 silverlight square_tanaka_pub

7

業務アプリの Silverlight 実用例 社内製のクラウド管理ツール Wc3 のフロン

2011/07/09

1. 背景

Page 8: 110709 silverlight square_tanaka_pub

8

Silverlight を選択した理由 RIA 技術の調査

Java の GUI 作成コストは高い! クライアントアプリは当然高い ブラウザ系でもなかなか決定打がない・・・

Flash よりも業務アプリ向き UI 部品とか、アーキテクチャとか

開発生産性の向上 GUI ツールがいけてる アーキテクチャがいけてそう

2011/07/09

1. 背景

Page 9: 110709 silverlight square_tanaka_pub

9

サーバーサイドは Java で 社内的な事情で。。。

Java エンジニア多し クライアントは Windows がほぼ全部でも、

サーバー側はそうとは限らない これはこれで面白いという判断もあり

サーバーとクライアントを分離できる レガシーシステムの RIA 化にも役立つ(かも)

2011/07/09

1. 背景

Page 10: 110709 silverlight square_tanaka_pub

10

どうやって通信するんでしょう?

2011/07/09

.NET なら WCF RIA Services 使えるのに・・・

1. 背景

Page 11: 110709 silverlight square_tanaka_pub

11

RESTful API で通信 RESTful API

URI に対してリソースを割当てる URI に対する HTTP メソッドで、

XML, JSON etc… を取得 メッセージの中身を見ても比較的理解できる

WCF SOAP ベース ( バイナリ形式だけど中身は SOAP) リクエストは XML 形式で送信 レスポンスも基本 XML

(REST 対応で JSON, RSS なども可能 ) メッセージの中身を見ると死ねる・・・

2011/07/09

1. 背景

Page 12: 110709 silverlight square_tanaka_pub

12

JSON って? JavaScript Object Notation JavaScirpt ベースの記述法をベースに

オブジェクトを記述できる 多くのプログラム言語で解釈できる

RFC4627で仕様が決まってはいるけど細かな実装が違ったりする・・・

リストとか日付とか C# は DataContractJsonSerializer で OK Java は SDK には入っていない

で、各ライブラリごとに微妙に動作が異なる リストの振る舞いが仕様通りの Jackson を使用

2011/07/09

1. 背景

Page 13: 110709 silverlight square_tanaka_pub

13

REST で JSON の例

2011/07/09

http://example.com/rest/products/827635/detail

リクエストの例 )

レスポンスの例 )

1. 背景

Page 14: 110709 silverlight square_tanaka_pub

14

SOAP メッセージ

2011/07/09

リクエストの例 )

レスポンスの例 )

1. 背景

Page 15: 110709 silverlight square_tanaka_pub

15

RESTful と WCF(SOAP) の所感RESTful WCF(SOAP)

開発ツールなしでの使いやすさ

○ ×

軽量言語での使いやすさ ○ ×

メッセージの容量 ○ WCF:△SOAP:×

仕様の厳格さ △(RFC) ○(WS-*)

標準化団体 なし SOAP:W3C

機能の拡張性 × ○

2011/07/09

1. 背景

Page 16: 110709 silverlight square_tanaka_pub

16

クライアントとサーバーを疎結合にできます 明確な境界を

クライアントとサーバーの間作ります 実装言語に依存しない API を定義できます

つまり、 API さえ維持できれば任意の言語の実装に置き換えられます サーバーサイドを IIS で .NET にしたり .NET や Java でクライアントアプリを作ったり ( やりたくないけど )HTML+JavaScript にし

たり

2011/07/09

1. 背景

Page 17: 110709 silverlight square_tanaka_pub

17

クライアントとサーバーを疎結合にできます

2011/07/09

1. 背景

Page 18: 110709 silverlight square_tanaka_pub

18

AGENDA1. 背景2. Java と C# の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 19: 110709 silverlight square_tanaka_pub

19

年表Java .NET

1996 JDK 1.0

1997 JDK 1.1

1998 J2SE 1.2

2000 J2SE 1.3

2002 J2SE 1.4 C# 1.0

2004 J2SE 5.0

2005 C# 2.0/ VB 8.0

2006 Java SE 6

2007 C# 3.0/ VB 9.0

2010 C# 4.0/ VB 10

2011 Java SE 7(7/28予定 )

2011/07/09

2.Java と C# の違い

Page 20: 110709 silverlight square_tanaka_pub

20

言語レベルの違いC# Java

引数の渡し方 参照の値渡しref, out で参照渡しも可能

参照の値渡しのみ

イベント 第一級のオブジェクト クラスの1つ関数ポインタ使えない

演算子オーバーロード

あり なし

拡張メソッド あり なし

型推論 強い 弱いクラスレベルのバイナリ互換性を担保する為

非 Generics IList と IList<T> は違う型 List<T> という同じ型

2011/07/09

2.Java と C# の違い

Page 21: 110709 silverlight square_tanaka_pub

21

言語レベルの違いC# Java

引数の渡し方 参照の値渡しref, out で参照渡しも可能

参照の値渡しのみ

イベント 第一級のオブジェクト クラスの1つ関数ポインタ使えない

演算子オーバーロード

あり なし

拡張メソッド あり なし

型推論 強い 弱いクラスレベルのバイナリ互換性を担保する為

Generis と非 Genericsの例

IList と IList<T> は違う型 List<T> という同じ型

2011/07/09

Java は how を詳細に記述させられるC# は how より what に専念できる

2.Java と C# の違い

Page 22: 110709 silverlight square_tanaka_pub

22

イベントリスナの登録

2011/07/09

C# Java

ラムダ式、もしくは関数ポインタで、イベントハンドラに追加

リスナを定義したインターフェースの実装クラスを登録( 上は匿名内部クラスを利用 )

2.Java と C# の違い

Page 23: 110709 silverlight square_tanaka_pub

23

文字列の比較 (演算子オーバーロード )

2011/07/09

C# を知らない Java プログラマが見たら、「この人、初心者だ」といいかねない書き方です。

Java では演算子オーバーロードがないのでString の == 比較は参照の一致です。

C# Java

2.Java と C# の違い

Page 24: 110709 silverlight square_tanaka_pub

24

指定の型を返り値の型にしたい

2011/07/09

C# Java

Java ではGenerics の型情報は、実行時には完全には残らないので、引数指定が必要です。しかもクラスしか指定できません。

C# ではメソッドで指定した型を返り値の型として定義できます。また、クラスではなく、構造体も指定できます。

2.Java と C# の違い

Page 25: 110709 silverlight square_tanaka_pub

25

開発ツール (IDE) の違い C# は Visual Studio Java はいろいろ

Eclipse (Eclipse Foundation) NetBeans (NetBeans Community) JDeveloper (Oracle) IntelliJ IDEA (JetBrains)

設定とかコンパイラの実装が違って面倒な問題を起こすこともしばしば・・・

2011/07/09

Eclipse などは自分でコンパイラを持っているので、Eclipse ではコンパイルが通るけど、

いざ javac でリリースビルドが通らないとかあります

2.Java と C# の違い

Page 26: 110709 silverlight square_tanaka_pub

26

サーバーの違い .NET は IIS Java はいろいろ

JavaEE準拠 ( 仕様に定められた機能を持っている ) WebShpere (IBM) WebLogic (Oracle) GlassFish etc…

準拠していないもの ( その分軽量などのメリット有 ) Tomcat Jetty Spring etc…

どれを選ぶかが実装にも影響を与える

2011/07/09

2.Java と C# の違い

Page 27: 110709 silverlight square_tanaka_pub

27

Java と C# の違い

言語レベルでは、

• how を記述させられるのが Java• what に専念できるのが C#

プロジェクト管理・運用の視点からは、

• さまざまな選択肢があるのが Java• その選択が実装にも影響を与える

• 比較的択一なのが C#

2011/07/09

2.Java と C# の違い

Page 28: 110709 silverlight square_tanaka_pub

28

AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 29: 110709 silverlight square_tanaka_pub

29

サーバーサイド Java で XAP をどう公開するか

2011/07/09

3. 公開の仕方

Page 30: 110709 silverlight square_tanaka_pub

30

HTML を IIS と同様に書きます

2011/07/09

IIS じゃないから、 aspx はかけないけど。

3. 公開の仕方

Page 31: 110709 silverlight square_tanaka_pub

31

APWeb

HTML と XAP を静的ファイルとして公開

2011/07/09

これは Servlet が公開してもいいし、Web サーバー (apache) が公開してもいい。Azure Blob とか CDN とかで公開するのもあり。

../index.html

html文書

../Clientbin/hoge.xap

XAP

3. 公開の仕方

HTML

XAP

Page 32: 110709 silverlight square_tanaka_pub

32

xap を AP と別な場所におく場合の注意 <iframe> による読み込みが必要な場合

ホストする HTML と別なホストに xap がある場合

ブログとかに xap を配置する場合も必要かも clientaccesspolicy.xml の配備が必要な場

合 xap のある場所と別ホストの Web サービスを呼び出す場合

Web サービス側に必要 信頼された OOB は不要 おまけに WP7 でも不要

2011/07/09

3. 公開の仕方

Page 33: 110709 silverlight square_tanaka_pub

33

xap を AP と別な場所におく場合の注意

2011/07/09

3. 公開の仕方

Web サーバー

HTML

<ifarame>…

コンテンツ配信サーバー

(CDN とか Blob とか )

XAP

別ホストの XAP を参照するので

iframe で

Web サービス

別ホストのWeb サービスを呼び出すので

clientaccesspolicy.xml必須

clientaccesspolicy.xml

Page 34: 110709 silverlight square_tanaka_pub

34

AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 35: 110709 silverlight square_tanaka_pub

35

アーキテクチャ図

2011/07/09

4.Wc3 の設計思想

Page 36: 110709 silverlight square_tanaka_pub

36

こういう構成になります

2011/07/09

AWS (EC2)社内

クライアント

( ブラウザ )

Cloud Srevice endpoint

AP DB

Query

JDBC

WebJSON

over HTTPSxap

4.Wc3 の設計思想

Page 37: 110709 silverlight square_tanaka_pub

37

サーバー側のライブラリ

2011/07/09

JPA(Java Persistence Assistant) 標準仕様が定められた OR マッパー SQL を埋め込まずに DB アクセスできる

拡張メソッド、ラムダ式がないので使い勝手は・・・ マルチ DB 対応できる

Oracle, SQL Server, MySQL, SQLite etc… 実装は EclipseLink を使用

JAX-RS RESTful API のサービスを提供するライブラリ 実装は Jersey を使用

AWS API + Concurrent Framework AWS の API を Java から非同期で叩く

4.Wc3 の設計思想

Page 38: 110709 silverlight square_tanaka_pub

38

Silverlight 側のライブラリ

2011/07/09

Silverlight ToolKit UI 部品が足りないので

Blend SDK Expression Blend は使わなくても、これは必須

Prism MVVM サポート DI 的な使い方 テストサポート

Rx 非同期を LINQ 的に簡単に扱える

4.Wc3 の設計思想

Page 39: 110709 silverlight square_tanaka_pub

39

AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 40: 110709 silverlight square_tanaka_pub

40

HttpWebRequest を使います Visual Studio の自動生成は

wadl に対応してないので自分で実装 wadl: wsdl の REST API版

再送処理とかを考えると WebClient より柔軟

2011/07/09

5. 通信部分の実装

Page 41: 110709 silverlight square_tanaka_pub

412011/07/09

非同期 API なんて面倒だ!!

5. 通信部分の実装

Page 42: 110709 silverlight square_tanaka_pub

42

Rx 使いましょう 非同期を LINQ 的に簡単に 個人的におすすめの解説はこちら

http://www.slideshare.net/neuecc/reactive-extensions-8049041

Data Developer Center入りして開発プロジェクトとしても継続されそう

NuGet から取得可能 安定版もリリースされました

2011/07/09

5. 通信部分の実装

Page 43: 110709 silverlight square_tanaka_pub

43

HTTP処理はクライアント側で MSDN ドキュメントに詳細があります

http://msdn.microsoft.com/en-us/library/dd920295%28v=vs.95%29.aspx

※ただし英語版で クライアント側じゃないとできないこと

404以外のステータスコードの取得 エラー時のレスポンスボディの取得

気をつけること CooKie などは自前で管理 ( ブラウザは管理しな

い )2011/07/09

5. 通信部分の実装

Page 44: 110709 silverlight square_tanaka_pub

44

サンプルコード

2011/07/09

5. 通信部分の実装

Page 45: 110709 silverlight square_tanaka_pub

45

JSON⇔C# 、 Java のクラスを定義

2011/07/09

5. 通信部分の実装

Page 46: 110709 silverlight square_tanaka_pub

46

サンプルコード

2011/07/09

5. 通信部分の実装

Page 47: 110709 silverlight square_tanaka_pub

472011/07/09

DEMO

5. 通信部分の実装

の前に

Page 48: 110709 silverlight square_tanaka_pub

48

DEMO の構成

2011/07/09

5. 通信部分の実装

デバッグ起動

デバッグ起動

clientaccesspolicy.xml

ポートが違う場合も必須

Page 49: 110709 silverlight square_tanaka_pub

492011/07/09

DEMO

5. 通信部分の実装

Page 50: 110709 silverlight square_tanaka_pub

50

AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 51: 110709 silverlight square_tanaka_pub

51

認証方法 (WCF 使わない前提 )

Cookie を使う方法

• 最も一般的?

HTTP Basic/Digest 認証

• 古いが、 REST API とも相性がよい• Basic 認証は HTTPS推奨

Azure Storage, AWS API 認証方式

• クエリーに一意な鍵を埋め込む (詳細は後述 )• REST API の認証のデファクトになるかも

2011/07/09

6. 認証機能

Page 52: 110709 silverlight square_tanaka_pub

52

Cookie を使う方法の 1 つ ログイン成功時に、

サーバー側で Cookie を埋め込む ユーザー / パスワードは DB に格納 パスワードは適宜ソルト付きハッシュ化&

ストレッチングしてね クライアント側は

その Cookie を使ってリクエストを送信 Cookie でログイン中か判断

Cookie に秘密情報を入れるのはよろしくない XSS とかあるとばれる

REST API とは相性悪い 最初に必ずログインが必要だから

2011/07/09

6. 認証機能

Page 53: 110709 silverlight square_tanaka_pub

53

サンプルコード

2011/07/09

6. 認証機能

Page 54: 110709 silverlight square_tanaka_pub

542011/07/09

DEMO

6. 認証機能

Page 55: 110709 silverlight square_tanaka_pub

55

HTTP Basic/Digest 認証を使う方法 HTTP で定義されている認証

REST API とも比較的相性がよい ダイアログが出てくるやつです

Basic 認証は盗聴や改ざんが容易 せめて通信は HTTPS で

Silverlight では HTTP 通信をクライアントにする必要があります

2011/07/09

6. 認証機能

Page 56: 110709 silverlight square_tanaka_pub

56

サンプルコード

2011/07/09

6. 認証機能

Page 57: 110709 silverlight square_tanaka_pub

572011/07/09

DEMO

6. 認証機能

Page 58: 110709 silverlight square_tanaka_pub

58

Azure Storage, AWS API 認証方式 最近 REST 的な API で取り入れられている

方式 あらかじめ 1組の文字列 (鍵 ) を

クライアントとサーバーで共有 鍵から生成する一意な文字列を

リクエストに付与 リピート攻撃を防ぐため現在時刻も入れる

API単位で認証するため、 REST とは相性よし

Silverlight から使う場合、鍵情報をメモリに乗せておかないといけない

2011/07/09

6. 認証機能

Page 59: 110709 silverlight square_tanaka_pub

59

Azure Storage, AWS API 認証方式

2011/07/09

元のリクエスト文字列

現在時刻

SecretKey

AccessKey

生成した署名

受け取ったリクエスト

AccessKeyにひもづくSecretKey

生成した署名

HMAC-SHA256署名

受け取った署名

HMAC-SHA256署名

6. 認証機能

送信

両者の一致を確認

DB

Page 60: 110709 silverlight square_tanaka_pub

60

サンプルコード

2011/07/09

6. 認証機能

Page 61: 110709 silverlight square_tanaka_pub

61

AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 62: 110709 silverlight square_tanaka_pub

62

ログをどうやってだそう・・・

2011/07/09

8. ログの出力

ブラウザでは、Console.WriteLine してもなにも起きない・・・

Page 63: 110709 silverlight square_tanaka_pub

63

そうだ、開発者ツールがある!

2011/07/09

8. ログの出力

Page 64: 110709 silverlight square_tanaka_pub

64

JavaScript経由で出力 (旧 )

2011/07/09

なぜか、 Chrome では正しく動作しない・・・

8. ログの出力

Page 65: 110709 silverlight square_tanaka_pub

65

JavaScript経由で出力 (改 )

2011/07/09

8. ログの出力

ホストする HTML でscript書いておいて Silverlight から呼び出し

Page 66: 110709 silverlight square_tanaka_pub

662011/07/09

DEMO

8. ログの出力

Page 67: 110709 silverlight square_tanaka_pub

67

AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 68: 110709 silverlight square_tanaka_pub

68

Azure 管理コンソールでこんなことできます

2011/07/09

9. ファイルダウンロード

Page 69: 110709 silverlight square_tanaka_pub

69

疑問に思いませんでしたか?

2011/07/09

Silverlight ではファイルは保存ダイアログ経由でしか保存できないはず

デフォルトファイル名が指定できないとか、呼び出せるスレッドが限定されているとかいろいろ使いづらい制約が・・・

9. ファイルダウンロード

Page 70: 110709 silverlight square_tanaka_pub

70

ブラウザからの実行

2011/07/09

何よりの違いは、ブラウザからファイルを開けること( ファイルタイプの関連付けが必要 )

ちなみに OOB(OutOfBrowser) なら、起動処理を COM にして呼び出すこともできます。

9. ファイルダウンロード

Page 71: 110709 silverlight square_tanaka_pub

71

これも JavaScript経由で実現できます

2011/07/09

9. ファイルダウンロード

追記:実は Navigate メソッド使えばJavaScript は必要ありませんでした。

Page 72: 110709 silverlight square_tanaka_pub

72

Navigate メソッドを使います

2011/07/09

9. ファイルダウンロード

_blank を指定して、新しいウィンドウもしくはタブが開いて

ダウンロードが開始されます。

Page 73: 110709 silverlight square_tanaka_pub

73

ダウンロードさせるにはサーバーサイドも一工夫

2011/07/09

9. ファイルダウンロード

Page 74: 110709 silverlight square_tanaka_pub

742011/07/09

DEMO

9. ファイルダウンロード

Page 75: 110709 silverlight square_tanaka_pub

75

AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ

2011/07/09

Page 76: 110709 silverlight square_tanaka_pub

76

まとめ Silverlight は好きなサーバーサイドテクノ

ロジと一緒に使える 明確な境界 (API) を作るこが必須

適切なフレームワークも大切 開発生産性の向上、個人のスキルに依存しない

通信・認証まわりは大事 みんなが書く必要はないので適宜ライブラリ化 非同期必須なので Rx がいいんじゃない

細かい機能が意外と求められる ログ出力とかファイルダウンロードとか

2011/07/09

11. まとめ

Page 77: 110709 silverlight square_tanaka_pub

772011/07/09

ご清聴ありがとうございました