[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp/index.php?FrontPage]] -[[戻る>SaaS設計のポイント]] *目次 [#mbc7828c] #contents *概要 [#y7c0edfd] [[OpenChangiExecEngine>https://github.com/NetDevInfraWGinOSSConsortium/OpenChangiExecEngine]]の開発で検討したこと。 *Tablet系 [#nbca81e3] **専用端末化 [#ycea9e4e] -Android/iOS両方で実現可能。 -ただし,OSバージョン縛りがあるので(特にAndroidは)要注意。 ***Android [#o3c53495] Android 5.0から追加された「画面の固定」機能を使えばアクティブなアプリを限定できる。 -Android 5.0(Lollipop)の機能紹介 :~ 「画面の固定」を有効にすれば使えるアプリを一つに限定できる | juggly.cn~ http://juggly.cn/archives/131329.html ***iOS [#ffa619a1] iOS6から追加された「Single App Mode」が使える。 -iOS6の最大の追加機能!? シングルアプリモードがすごい!~ http://matome.naver.jp/odai/2134814499673911401 *HTML系 [#kfbce0bf] **オフライン [#le84b19c] -オンライン環境でない場合に、オフラインで動作する方法を検討する。 -実装はHTML(HTML5)のWeb技術を使用する(スマホ・ネイティブ解らんので)。 -オフライン時にlocal-Storageに溜め込んでバッチ送信みたいなことを考えている。 -色々考え、処理系を切り替える必要があるので結構難しそうだと感じた。 -切り替えが面倒なので、一律、 --ローカルストレージに蓄積 --定期的な情報送信を行う。 >という方式が良いと考えた。 ***チェック [#e0857895] window.navigator.onLineでチェック可能。 -window.navigator.onLine - Web API インターフェイス | MDN~ https://developer.mozilla.org/ja/docs/Web/API/NavigatorOnLine/onLine ***[[ストレージ>HTML#l92a65cd]] [#l92a65cd] ポピュラーな、Key-Valueの[[WebStorage>HTML#wb728540]]が良さそう。 **定期的な情報送信 [#y608fc90] ***[[バック・グラウンド処理>JavaScript#d6ac8bf9]] [#vd59a5ea] setTimeoutやsetIntervalなどを用いることで実現できる。~ 最新の「Web Workers」については、別に使用しなくていもイイかな。という感想。 ***JSON処理 [#cbfea084] -HTML側~ 以下が参考になる。 --HTMLファイルからPOSTでJSONデータを送信する - Qiita~ http://qiita.com/kidatti/items/21cc5c5154dbbb1aa27f -サーバー側(WCF)~ web.configの書き方が間違っていると動かないので注意。~ web.configの書き方は、下記のosscons.jpのマイクロソフト系技術情報 Wikiが参考になる。 --[[JSONを送受信するRESTサービスを作成する方法 - マイクロソフト系技術情報 Wiki>https://techinfoofmicrosofttech.osscons.jp/index.php?JSON%E3%82%92%E9%80%81%E5%8F%97%E4%BF%A1%E3%81%99%E3%82%8BREST%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95]]~ ***成功と失敗 [#s0bd9e61] -WebAPIの戻り値での判断は、二重登録の可能性があり、少々危険だと考える。 --トランザクションが成功した後にHTTPでエラーになると二重登録になる。 --HTTPで成功した後に、local-Storageのクリアに失敗した場合も、二重登録になる。 -上記の二重登録の問題を解決するために、レコードにIDを付与する。 --GUID ---長過ぎる。 ---ライブラリが無い。 --店舗ID + 端末ID + 時間 ( yyyy/MM/dd HH:mm:ss SSS ) ---店舗ID : ユーザアカウントから取得可能。 ---端末ID : HTMLから取得する方法が無い。 ---時間 : dateformat.jsを使用して取得可能。 **[[エフェクト>JavaScript#k0f136b5]] [#k0f136b5] ***[[効果音>JavaScript#cf0fca98]] [#cf0fca98] ***[[アニメーション>JavaScript#se421493]] [#se421493] *スキーマ [#k2f8ea24] マルチテナントを考慮したスキーマ設計 **マスタ・データ [#j2f66c9c] ***ユーザ情報 [#n884e7f5] -企業テーブル --&color(red){ID}; --企業情報 ---・・・ -店舗テーブル --&color(red){ID}; --&color(blue){分割キー(企業ID)}; --店舗情報 ---・・・ -端末テーブル --&color(red){ID}; --&color(blue){分割キー(企業ID)}; --店舗ID --端末情報 ---・・・ -ユーザ・テーブル --&color(red){ID}; --ログイン・アカウント ---UID ---PWD~ DBには、[[SaltedPasswd>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Tools/Encryption/EncAndDecUtil/Form1.cs]]を保存する。 --ユーザ情報 ---・・・ ***画面表示情報 [#s3f64ef3] 画面の表示に必要になる情報。~ 画面によって構造(スキーマ)が異なるので非構造化データに格納する。 -共通 --&color(red){ID}; --&color(blue){分割キー(企業ID)}; --画面ID(GUID) --有効期限(履歴) --画面タイトル --追加の検索条件情報~ 追加の検索条件情報として登録する、~ 下記の非構造化データ(JSON)の~ 値のキー情報を登録しておく。 --非構造化データ(JSON)~ 例えば、 ---メッセージ ---画像~ Uri、ID、キャプション ---ボタン~ 画像、画像意味 -画像テーブル --&color(red){ID}; --&color(blue){分割キー(企業ID)}; --店舗ID(オプション) --端末ID(オプション) --画像データ(バイナリ) 画面のテンプレートと、店舗ID・端末ID **トランザクション・データ [#kd2388c7] ***結果 [#k208cb99] -画面表示情報ID -検索条件 --店舗ID --端末ID --日付 --ボタンID -検索条件(追加)~ 例えば、非構造化データ(JSON)中の、 --画像IDとか --画像キャプションとか。 #DBMSスキーマ上にあれば、SQLの集計関数で集計が可能。 *画面 [#f2dcb4d0] **コンテンツ画面 [#k28392bd] [[HTML/CSS/JavaScript]]技術を中心に使用して開発する。 **カスタマイズ画面 [#kb755979] -エンプラ寄りのWeb Forms技術を中心に使用して開発する。 -非構造化データ(JSONデータ)の編集処理の簡略化がキーポイント --画面の自動生成も面倒なので、 --JSONの生データを編集する方式にする。 **条件検索画面 [#dd77a5e8] エンプラ寄りのWeb Forms技術を中心に使用して開発する。 ***条件検索と集計・グラフ表示機能 [#j429f1d0] -通常の条件検索と集計・グラフ表示機能を実装する。 -グラフ表示は、[[ChartControl>https://techinfoofmicrosofttech.osscons.jp/index.php?plugin=related&page=Chart%20%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB]]を使用する。 ***非構造化データの集計処理 [#aa15005d] 非構造化データ(JSONデータ)の集計処理の簡略化がキーポイント -CSVエクスポートを行い、エクセルで集計できるようにする。 -JSONデータをフラットな二次元表に展開する。 *上記を踏まえた技術選定 [#x136456a] Open棟梁はコミュニティ連携のため前提で(笑)。 **OS [#b1c9917b] ***Windows [#c4d33e36] -特に、Linuxである必要を感じなかった。 **DBMS [#nbbf4879] ***PostgreSQL [#tb477489] -スタートアップで人気。 -MosPで運用実績がある。 -データプロバイダ --[[ADO.NETデータプロバイダ - マイクロソフト系技術情報 Wiki>https://techinfoofmicrosofttech.osscons.jp/index.php?ADO.NET%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80]] ---[[PostgreSQL>https://techinfoofmicrosofttech.osscons.jp/index.php?ADO.NET%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80#dad19e08]] **WAS [#z59da5eb] ***IIS+ASP.NET [#w5d67b8c] .NET開発基盤部会だけに。 **フレームワーク [#h7f39365] ***画面毎 [#kf6b5006] -コンテンツ画面 --基本 ---ASP.NET Web Forms ( [[HTML サーバー コントロール>https://msdn.microsoft.com/ja-jp/library/s37470tf.aspx]] ) ---WCF ( DataContractJsonSerializer ) ---Ajax( jQuery ) ---ADO.NET. --若しくは ---ASP.NET MVC ---ASP.NET Web API ---Ajax( jQuery ) ---ADO.NET. -その他の画面 --特徴 ---エンプラチックな画面 ---グラフ表示画面で[[ChartControl>https://techinfoofmicrosofttech.osscons.jp/index.php?plugin=related&page=Chart%20%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB]]を使用したい。 --フレームワーク ---ASP.NET Web Forms ( ASP.NET Web サーバー コントロール ) ---ADO.NET. -全体的に --[[Entity Framework>https://techinfoofmicrosofttech.osscons.jp/index.php?Entity%20Framework]]は個人的に、パス。 ***ASP.NET Web Forms [#u79bf4cb] ASP.NET Web Formsを選択した。 -HTMLに準拠した実装がし易いように、[[HTML サーバー コントロール>https://msdn.microsoft.com/ja-jp/library/s37470tf.aspx]]を使用する。 -ASP.NET MVCであっても・なくても良かった。 --[[赤波線の件>GCEのSSDインスタンスで開発環境を作ってみた。#p8796459]]と、 --コントロールのキャプション置換がWeb Formsの方が楽だと思ったから。 --グラフ表示画面もあるので、[[ChartControl>https://techinfoofmicrosofttech.osscons.jp/index.php?plugin=related&page=Chart%20%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB]]を使いたいと思ったから。 --B・D層を別DLL化して、必要ならUIサブシステムだけMVCに切替えるのはアリだと思う。 ***Ajax - REST ( JSON ) - WebAPI [#qa996927] Web Formsだが、オフライン実装を考慮しPostBack無しのWebAPIで実装。 -フレームワーク --Ajax ( jQuery ) --REST ( REST JSON ) --WebAPI ( WCF ( DataContractJsonSerializer ) ) ***ADO.NET [#q7241937] ADO.NETでイイと考えた。 -簡単なクエリのみ。 -一々、[[Entity Framework>https://techinfoofmicrosofttech.osscons.jp/index.php?Entity%20Framework]]使う程でもない。 -複雑なエンプラの方がハマらないのだっけ? -あまりピンとこない、Beanを永続化するなら[[NoSQL]]でイイのでは。 **,etc. [#qa0009a2]