110709 silverlight square_tanaka_pub
TRANSCRIPT
1
田中 孝佳 (@tanaka_733)
2011/07/09
Silverlight×Java で業務アプリ
2
AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
3
あらかじめおことわり Java との連携部分を中心に話すので、
MVVM 的な話はほとんどありません でも、 MVVM 的に作ってますよ
同様に細かい View の作り方もないです サンプルコードが細かい字ですが、
あとで公開します デモもやるつもりですが、
マシンスペックの都合で動かないかも・・・
2011/07/09
4
Agenda1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
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. 背景
6
お仕事の内容研究
• クラウドを使って面白いことをする• クラウドを安全に手軽に使ってもらう• 雑誌の記事を執筆させてもらったり
(G-CLOUD Magazine 2011 Summer)
クラウド管理ツール (Wc3)
• 社内で IaaS(AWS) を便利に使うためのアプリ• Azure の管理コンソールを社内利用に特化させたイメージ
2011/07/09
1. 背景
7
業務アプリの Silverlight 実用例 社内製のクラウド管理ツール Wc3 のフロン
ト
2011/07/09
1. 背景
8
Silverlight を選択した理由 RIA 技術の調査
Java の GUI 作成コストは高い! クライアントアプリは当然高い ブラウザ系でもなかなか決定打がない・・・
Flash よりも業務アプリ向き UI 部品とか、アーキテクチャとか
開発生産性の向上 GUI ツールがいけてる アーキテクチャがいけてそう
2011/07/09
1. 背景
9
サーバーサイドは Java で 社内的な事情で。。。
Java エンジニア多し クライアントは Windows がほぼ全部でも、
サーバー側はそうとは限らない これはこれで面白いという判断もあり
サーバーとクライアントを分離できる レガシーシステムの RIA 化にも役立つ(かも)
2011/07/09
1. 背景
10
どうやって通信するんでしょう?
2011/07/09
.NET なら WCF RIA Services 使えるのに・・・
1. 背景
11
RESTful API で通信 RESTful API
URI に対してリソースを割当てる URI に対する HTTP メソッドで、
XML, JSON etc… を取得 メッセージの中身を見ても比較的理解できる
WCF SOAP ベース ( バイナリ形式だけど中身は SOAP) リクエストは XML 形式で送信 レスポンスも基本 XML
(REST 対応で JSON, RSS なども可能 ) メッセージの中身を見ると死ねる・・・
2011/07/09
1. 背景
12
JSON って? JavaScript Object Notation JavaScirpt ベースの記述法をベースに
オブジェクトを記述できる 多くのプログラム言語で解釈できる
RFC4627で仕様が決まってはいるけど細かな実装が違ったりする・・・
リストとか日付とか C# は DataContractJsonSerializer で OK Java は SDK には入っていない
で、各ライブラリごとに微妙に動作が異なる リストの振る舞いが仕様通りの Jackson を使用
2011/07/09
1. 背景
13
REST で JSON の例
2011/07/09
http://example.com/rest/products/827635/detail
リクエストの例 )
レスポンスの例 )
1. 背景
14
SOAP メッセージ
2011/07/09
リクエストの例 )
レスポンスの例 )
1. 背景
15
RESTful と WCF(SOAP) の所感RESTful WCF(SOAP)
開発ツールなしでの使いやすさ
○ ×
軽量言語での使いやすさ ○ ×
メッセージの容量 ○ WCF:△SOAP:×
仕様の厳格さ △(RFC) ○(WS-*)
標準化団体 なし SOAP:W3C
機能の拡張性 × ○
2011/07/09
1. 背景
16
クライアントとサーバーを疎結合にできます 明確な境界を
クライアントとサーバーの間作ります 実装言語に依存しない API を定義できます
つまり、 API さえ維持できれば任意の言語の実装に置き換えられます サーバーサイドを IIS で .NET にしたり .NET や Java でクライアントアプリを作ったり ( やりたくないけど )HTML+JavaScript にし
たり
2011/07/09
1. 背景
17
クライアントとサーバーを疎結合にできます
2011/07/09
1. 背景
18
AGENDA1. 背景2. Java と C# の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
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# の違い
20
言語レベルの違いC# Java
引数の渡し方 参照の値渡しref, out で参照渡しも可能
参照の値渡しのみ
イベント 第一級のオブジェクト クラスの1つ関数ポインタ使えない
演算子オーバーロード
あり なし
拡張メソッド あり なし
型推論 強い 弱いクラスレベルのバイナリ互換性を担保する為
非 Generics IList と IList<T> は違う型 List<T> という同じ型
2011/07/09
2.Java と C# の違い
21
言語レベルの違いC# Java
引数の渡し方 参照の値渡しref, out で参照渡しも可能
参照の値渡しのみ
イベント 第一級のオブジェクト クラスの1つ関数ポインタ使えない
演算子オーバーロード
あり なし
拡張メソッド あり なし
型推論 強い 弱いクラスレベルのバイナリ互換性を担保する為
Generis と非 Genericsの例
IList と IList<T> は違う型 List<T> という同じ型
2011/07/09
Java は how を詳細に記述させられるC# は how より what に専念できる
2.Java と C# の違い
22
イベントリスナの登録
2011/07/09
C# Java
ラムダ式、もしくは関数ポインタで、イベントハンドラに追加
リスナを定義したインターフェースの実装クラスを登録( 上は匿名内部クラスを利用 )
2.Java と C# の違い
23
文字列の比較 (演算子オーバーロード )
2011/07/09
C# を知らない Java プログラマが見たら、「この人、初心者だ」といいかねない書き方です。
Java では演算子オーバーロードがないのでString の == 比較は参照の一致です。
C# Java
2.Java と C# の違い
24
指定の型を返り値の型にしたい
2011/07/09
C# Java
Java ではGenerics の型情報は、実行時には完全には残らないので、引数指定が必要です。しかもクラスしか指定できません。
C# ではメソッドで指定した型を返り値の型として定義できます。また、クラスではなく、構造体も指定できます。
2.Java と C# の違い
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# の違い
26
サーバーの違い .NET は IIS Java はいろいろ
JavaEE準拠 ( 仕様に定められた機能を持っている ) WebShpere (IBM) WebLogic (Oracle) GlassFish etc…
準拠していないもの ( その分軽量などのメリット有 ) Tomcat Jetty Spring etc…
どれを選ぶかが実装にも影響を与える
2011/07/09
2.Java と C# の違い
27
Java と C# の違い
言語レベルでは、
• how を記述させられるのが Java• what に専念できるのが C#
プロジェクト管理・運用の視点からは、
• さまざまな選択肢があるのが Java• その選択が実装にも影響を与える
• 比較的択一なのが C#
2011/07/09
2.Java と C# の違い
28
AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
29
サーバーサイド Java で XAP をどう公開するか
2011/07/09
3. 公開の仕方
30
HTML を IIS と同様に書きます
2011/07/09
IIS じゃないから、 aspx はかけないけど。
3. 公開の仕方
31
APWeb
HTML と XAP を静的ファイルとして公開
2011/07/09
これは Servlet が公開してもいいし、Web サーバー (apache) が公開してもいい。Azure Blob とか CDN とかで公開するのもあり。
../index.html
html文書
../Clientbin/hoge.xap
XAP
3. 公開の仕方
HTML
XAP
32
xap を AP と別な場所におく場合の注意 <iframe> による読み込みが必要な場合
ホストする HTML と別なホストに xap がある場合
ブログとかに xap を配置する場合も必要かも clientaccesspolicy.xml の配備が必要な場
合 xap のある場所と別ホストの Web サービスを呼び出す場合
Web サービス側に必要 信頼された OOB は不要 おまけに WP7 でも不要
2011/07/09
3. 公開の仕方
33
xap を AP と別な場所におく場合の注意
2011/07/09
3. 公開の仕方
Web サーバー
HTML
<ifarame>…
コンテンツ配信サーバー
(CDN とか Blob とか )
XAP
別ホストの XAP を参照するので
iframe で
Web サービス
別ホストのWeb サービスを呼び出すので
clientaccesspolicy.xml必須
clientaccesspolicy.xml
34
AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
35
アーキテクチャ図
2011/07/09
4.Wc3 の設計思想
36
こういう構成になります
2011/07/09
AWS (EC2)社内
クライアント
( ブラウザ )
Cloud Srevice endpoint
AP DB
Query
JDBC
WebJSON
over HTTPSxap
4.Wc3 の設計思想
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 の設計思想
38
Silverlight 側のライブラリ
2011/07/09
Silverlight ToolKit UI 部品が足りないので
Blend SDK Expression Blend は使わなくても、これは必須
Prism MVVM サポート DI 的な使い方 テストサポート
Rx 非同期を LINQ 的に簡単に扱える
4.Wc3 の設計思想
39
AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
40
HttpWebRequest を使います Visual Studio の自動生成は
wadl に対応してないので自分で実装 wadl: wsdl の REST API版
再送処理とかを考えると WebClient より柔軟
2011/07/09
5. 通信部分の実装
412011/07/09
非同期 API なんて面倒だ!!
5. 通信部分の実装
42
Rx 使いましょう 非同期を LINQ 的に簡単に 個人的におすすめの解説はこちら
http://www.slideshare.net/neuecc/reactive-extensions-8049041
Data Developer Center入りして開発プロジェクトとしても継続されそう
NuGet から取得可能 安定版もリリースされました
2011/07/09
5. 通信部分の実装
43
HTTP処理はクライアント側で MSDN ドキュメントに詳細があります
http://msdn.microsoft.com/en-us/library/dd920295%28v=vs.95%29.aspx
※ただし英語版で クライアント側じゃないとできないこと
404以外のステータスコードの取得 エラー時のレスポンスボディの取得
気をつけること CooKie などは自前で管理 ( ブラウザは管理しな
い )2011/07/09
5. 通信部分の実装
44
サンプルコード
2011/07/09
5. 通信部分の実装
45
JSON⇔C# 、 Java のクラスを定義
2011/07/09
5. 通信部分の実装
46
サンプルコード
2011/07/09
5. 通信部分の実装
472011/07/09
DEMO
5. 通信部分の実装
の前に
48
DEMO の構成
2011/07/09
5. 通信部分の実装
デバッグ起動
デバッグ起動
clientaccesspolicy.xml
ポートが違う場合も必須
492011/07/09
DEMO
5. 通信部分の実装
50
AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
51
認証方法 (WCF 使わない前提 )
Cookie を使う方法
• 最も一般的?
HTTP Basic/Digest 認証
• 古いが、 REST API とも相性がよい• Basic 認証は HTTPS推奨
Azure Storage, AWS API 認証方式
• クエリーに一意な鍵を埋め込む (詳細は後述 )• REST API の認証のデファクトになるかも
2011/07/09
6. 認証機能
52
Cookie を使う方法の 1 つ ログイン成功時に、
サーバー側で Cookie を埋め込む ユーザー / パスワードは DB に格納 パスワードは適宜ソルト付きハッシュ化&
ストレッチングしてね クライアント側は
その Cookie を使ってリクエストを送信 Cookie でログイン中か判断
Cookie に秘密情報を入れるのはよろしくない XSS とかあるとばれる
REST API とは相性悪い 最初に必ずログインが必要だから
2011/07/09
6. 認証機能
53
サンプルコード
2011/07/09
6. 認証機能
542011/07/09
DEMO
6. 認証機能
55
HTTP Basic/Digest 認証を使う方法 HTTP で定義されている認証
REST API とも比較的相性がよい ダイアログが出てくるやつです
Basic 認証は盗聴や改ざんが容易 せめて通信は HTTPS で
Silverlight では HTTP 通信をクライアントにする必要があります
2011/07/09
6. 認証機能
56
サンプルコード
2011/07/09
6. 認証機能
572011/07/09
DEMO
6. 認証機能
58
Azure Storage, AWS API 認証方式 最近 REST 的な API で取り入れられている
方式 あらかじめ 1組の文字列 (鍵 ) を
クライアントとサーバーで共有 鍵から生成する一意な文字列を
リクエストに付与 リピート攻撃を防ぐため現在時刻も入れる
API単位で認証するため、 REST とは相性よし
Silverlight から使う場合、鍵情報をメモリに乗せておかないといけない
2011/07/09
6. 認証機能
59
Azure Storage, AWS API 認証方式
2011/07/09
元のリクエスト文字列
現在時刻
SecretKey
AccessKey
生成した署名
受け取ったリクエスト
AccessKeyにひもづくSecretKey
生成した署名
HMAC-SHA256署名
受け取った署名
HMAC-SHA256署名
6. 認証機能
送信
両者の一致を確認
DB
60
サンプルコード
2011/07/09
6. 認証機能
61
AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
62
ログをどうやってだそう・・・
2011/07/09
8. ログの出力
ブラウザでは、Console.WriteLine してもなにも起きない・・・
63
そうだ、開発者ツールがある!
2011/07/09
8. ログの出力
64
JavaScript経由で出力 (旧 )
2011/07/09
なぜか、 Chrome では正しく動作しない・・・
8. ログの出力
65
JavaScript経由で出力 (改 )
2011/07/09
8. ログの出力
ホストする HTML でscript書いておいて Silverlight から呼び出し
662011/07/09
DEMO
8. ログの出力
67
AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
68
Azure 管理コンソールでこんなことできます
2011/07/09
9. ファイルダウンロード
69
疑問に思いませんでしたか?
2011/07/09
Silverlight ではファイルは保存ダイアログ経由でしか保存できないはず
デフォルトファイル名が指定できないとか、呼び出せるスレッドが限定されているとかいろいろ使いづらい制約が・・・
9. ファイルダウンロード
70
ブラウザからの実行
2011/07/09
何よりの違いは、ブラウザからファイルを開けること( ファイルタイプの関連付けが必要 )
ちなみに OOB(OutOfBrowser) なら、起動処理を COM にして呼び出すこともできます。
9. ファイルダウンロード
71
これも JavaScript経由で実現できます
2011/07/09
9. ファイルダウンロード
追記:実は Navigate メソッド使えばJavaScript は必要ありませんでした。
72
Navigate メソッドを使います
2011/07/09
9. ファイルダウンロード
_blank を指定して、新しいウィンドウもしくはタブが開いて
ダウンロードが開始されます。
73
ダウンロードさせるにはサーバーサイドも一工夫
2011/07/09
9. ファイルダウンロード
742011/07/09
DEMO
9. ファイルダウンロード
75
AGENDA1. 背景2. Java と .NET(C#) の違い3. 公開の仕方4. Wc3 の設計思想5. 通信部分の実装6. 認証機能7. ログの出力8. ファイルダウンロード9. まとめ
2011/07/09
76
まとめ Silverlight は好きなサーバーサイドテクノ
ロジと一緒に使える 明確な境界 (API) を作るこが必須
適切なフレームワークも大切 開発生産性の向上、個人のスキルに依存しない
通信・認証まわりは大事 みんなが書く必要はないので適宜ライブラリ化 非同期必須なので Rx がいいんじゃない
細かい機能が意外と求められる ログ出力とかファイルダウンロードとか
2011/07/09
11. まとめ
772011/07/09
ご清聴ありがとうございました