SlideShare a Scribd company logo
1 of 29
Google Fusion Tables API v1.0
            Tips
          2013/3/18
          @awwa500
          Wataru Sato

                                1
自己紹介
• Wataru Sato
  – 本業は通信キャリア研究所向けにソフトウェア
    作っています
  – 個人的にはAndroid、AWS(SDB)、Fusion Tablesなど
    で遊んでいます
     • SmartTraining
     • ググれカス plug-in for twicca
     • 他
• @awwa500
• awwa@gmail.com

                                            2
きっかけ
• Fusion Tables APIが新しくなり、乗り換え
  てみました
• 乗り換えてみたはいいけど、ハマりま
  くってドブ板踏み抜き過ぎて疲れました
• 踏み抜いたドブ板の数を数えてみたら結
  構あったので、まとめてみました



                                 3
Google Fusion Tablesとは
• Google Driveで使えるDBっぽいヤツ
• ユーザプライベートなデータを(たぶ
  ん)無料で利用できる




                      ←コレ




                             4
Google Fusion Tablesとは
• データを手軽に可視化できる




                           5
Google Fusion Tables APIとは
• FTのデータにアクセスするためのAPI
• 2つのAPI
 – SQL API
    • 既にオワコン
    • We will now shut down SQL API after January 14, 2013.
 – API v1.0
    • 今ならこれを使うしかない
    • RESTful HTTP経由でSQL的なクエリ操作ができる
    • 結果はJSON or CSVで受け取る

                                                          6
ライブラリ
• FTを使おうと思った時に公開されていたも
  のが依存関係とか、使い方覚えるのが面
  倒だったので使っていません
• 最近チェックしたらスッキリしてきたか
  も
 – https://code.google.com/p/google-api-java-
   client/wiki/APIs#Fusion_Tables_API
• もしかしたら、コレを使っていればドブ
  板踏み破る数は減っていたかも
• 是非使ってみて下さい
                                                7
基本
•   Google APIs consoleでサービス有効化
•   OAuth 2.0
•   HTTPリクエスト
•   レスポンスパース

• 詳しくは
    – https://developers.google.com/fusiontables/docs/
      v1/using
                                                     8
OAuth2.0
• 通常は、普通にOAuth2すればいい
• Androidの場合、AccountManager経由がセキュリティ的
  に好ましい
  – 琴線探査:AndroidのAccountManager経由でGoogleの
    OAuth2認証を行うには?(外部ライブラリ完全非依存版)
    • http://kinsentansa.blogspot.jp/2012/08/androidaccountmanagergoog
      leoauth2.html


• AndroidでWebView経由で行うのは好ましくない
  – Shogo’s Blog:OAuthの認証にWebViewを使うのはやめよう
    • http://shogo82148.github.com/blog/2012/11/24/no-more-webview/
    • この記事はTwitterのOauthに関して書かれているが、WebViewの
      脆弱性に関しては同じ事



                                                                      9
テーブルアクセスの基本
• Create table時に返されるtableIdを使って
  テーブル指定する必要がある
         Client                        FT
                  Create table

                     tableId


            SELECT * FROM <table_id>




                                            10
レコードアクセスの基本
• Insert row時に生成されるROWIDを使って
  更新(update,delete)する必要がある
                    Client                    FT
                              Insert row

                                ROWID


 UPDATE <table_id> SET <column_name> = <value> WHERE ROWID = <row_id>




                                                                        11
レコードCRUD
CRUD     手法            詳細
Create   Insert row    1クエリ1レコード挿入
                       クエリを”;”で繋げて1リクエストに複数クエリ送信可
                       戻り値でROWIDを得ることができる
         Import rows   POSTのBodyにCSVを突っ込んで大量レコード挿入可
                       戻り値でROWIDを得ることができない
Select   Select rows   作成したColumnの他、ROWIDを取得することができ
                       る
Update   Update row    ROWID指定するか、無指定で全レコード対象
                       任意の条件を指定することはできない
Delete   Delete row    ROWID指定するか、無指定で全レコード対象
                       任意の条件を指定することはできない




                                                      12
大量レコード挿入戦略~Insert row
       ~
• Insert rowでは、1リクエストあたり500
  Insertまでいける、とドキュメントに書い
  てある
 – https://developers.google.com/fusiontables/docs/
   v1/using#insertRow
 – しかし、sqlパラメータはQueryString
 – 実際にはURL長の制限を受ける
    • ヾ(*`Д´*)ノ“


                                                  13
大量レコード挿入戦略~Import rows
                ~
• Import rowsなら1リクエストで100MBまでの
  データを挿入できる
• しかし、戻り値でROWIDは取得できない
• ROWIDが欲しければ、Import rows後、Select
  する必要がある
• しかし、500レコード以上をImport rowsした
  場合、すぐにSelectしてもROWIDが取得でき
  ない場合がある
• どうやらImport rows後のレコード反映は、
  500レコードずつ分割されて非同期で実行さ
  れている模様
                                    14
大量レコード挿入戦略~Import rows
                             ~
• 大量レコードImport時の雰囲気
   Client                       FT                      BackEnd
      Import rows (over 500 rows)
                                     Insert rows(500)
       NumRowsReceived=2500
               Select                Insert rows(500)

                                     Insert rows(500)         反映に時間
       全レコード取れない!
                                                               がかかる
                                     Insert rows(500)

                                     Insert rows(500)




                                                                  15
大量レコード挿入戦略~Import rows
                            ~
• 期待したレコード数になるまでポーリン
  グ Client FT    BackEnd
    Import rows (over 500 rows)
                                  Insert rows(500)
      NumRowsReceived=2500
          Select count()          Insert rows(500)

                                  Insert rows(500)   反映に時間
               1000
                                                      がかかる
          Select count()          Insert rows(500)

               2000               Insert rows(500)
          Select count()

               2500
              Select
                                                        16
              ROWID
大量レコード挿入戦略~Import rows
             ~
• もしくはImport rows後すぐにはROWIDは取
  りに行かない。必要になったタイミング
  で個別にROWIDをSelect後、更新操作を行
  う




                            17
大量レコード挿入戦略~Import rows
                 ~
• まとめ
  – アクセス頻度に応じた作戦をとること
レコードアクセス頻 方法
度
高い       Import rows後、速やかに全ROWIDを取得してローカルに
         記憶しておき、即更新処理を可能にしておく
低い       Import rows後、ROWIDは必要になったタイミングで個別
         にSelect後、目的の更新処理を実行する
         取得したROWIDはキャッシュしておくと少しは良い




                                         18
レコード更新(Update, Delete)時
       注意
• ROWID指定した場合
 – レスポンスのaffectedRowsには影響を受けたレ
   コード数が整数で返ってくる
• ROWID指定しない場合
 – レスポンスのaffectedRowsに”all rows”という文
   字列が返ってくる

       _人人人人人人人人_
       >文字列が返ってくる<
        ̄^Y^Y^Y^Y^Y^Y^Y^Y ̄          19
ROWIDに関する注意
• Insert rowした場合のROWID
  – 割り当てられるROWIDは昇順とは限らない
• Order by無指定時のソート順
  – ROWIDの昇順でソートされて返ってくる
• Order byにROWIDを指定すると503
  – 指定してはいけない
• ROWID = 0でSelectすると503
  – 指定してはいけない

                            20
テーブル間の外部参照
• そんな機能はない
• あるわけがない
• どうしてもやりたければ
 – A案)子テーブルに親テーブルレコードのROWID
   を格納するColumnを設ける
 – B案)親テーブルのレコード毎に子テーブルを分
   けて、親テーブルに子テーブルのtableIdを格納す
   るColumnを設ける
• 無論、関連情報は自分で更新する、制約がは
  れるわけではない

                            21
テーブル間の外部参照
• A案)子テーブルに親テーブルレコードの
  ROWIDを格納するColumnを設ける

     親テーブル               子テーブル

 ROWID       ROWID   PARENT_ROWID
 1           1       1
 2           2       1
             3       2
             4       2




                                    22
テーブル間の外部参照
• B案)親テーブルのレコード毎に子テーブ
  ルを分けて、親テーブルに子テーブルの
  tableIdを格納するColumnを設ける
      親テーブル

  ROWID   CHILD_TABLE_ID
                           子テーブル(tableId=XXX)
  1       XXX
  2       YYY              ROWID
                           1
                                   子テーブル(tableId=YYY)
                           2
                                   ROWID
                                   1
大量なテーブル生成は大量なImportを必要とする          2
503発生の原因になりやすいので注意する                                23
タイムアウト
• クライアントタイムアウト値は最低でも
  60秒くらいは必要
 – HttpClientなどを利用しているとタイムアウト
   値が短かったりするので長めに設定すること




                            24
HTTP 503との闘い
• HTTP 503:Service Unavailable
  – 裏でナニかが起きた
  – ナニ
    •   高頻度のアクセスによるブロック
    •   Select rowでROWIDでorder by
    •   Select rowでROWID = 0
    •   Fusion Tables自体の不具合(たぶん)
    •   など



                                    25
アクセス制限
• Google APIs console


• 制限はこれだけではない
   – 上限に関して明確には規定されていない
      • 問合せても回答がもらえない
   – 特にImport rowsで発生しやすい
      • 例)Import rowsをスリープなしで18回繰り返すと発生
   – 復旧
      • まる1日制限されたり、数分で復旧したり、とにかくよくわ
        からない
   – 影響範囲
      • ユーザ単位

                                          26
誰かに質問したい時は
• 技術的な質問はStackoverflowを使うこと
• Google GroupのFusion Tables APIグループは
  技術以外に関するディスカッションの場
  という位置づけ
  – 誤って質問を投げてしまうと、ディスカッ
    ションの途中で「Stackoverflowに行け!」と
    言われて議論はウヤムヤになる



                                    27
Stackoverflowへ質問する時
• 503が発生した時の質問方法
• 以下の2点を質問内容に含めておくと回答
  が得られやすい
 – どういうリクエストを投げたのか?
 – 具体的なレスポンスのBody(JSON)
• Try it!を使うとわりと便利
 – https://developers.google.com/fusiontables/docs/
   v1/reference/query/sqlGet#try-it
• 「503起きた-!」だけでは何も伝わらな
  い
                                                  28
Try it!




          29

More Related Content

Viewers also liked

正規表現勉強会
正規表現勉強会正規表現勉強会
正規表現勉強会zaru sakuraba
 
エンジニアでもできる⁉︎それっぽいデザイン
エンジニアでもできる⁉︎それっぽいデザインエンジニアでもできる⁉︎それっぽいデザイン
エンジニアでもできる⁉︎それっぽいデザインshinta rock
 
WEBページを表示するまで
WEBページを表示するまでWEBページを表示するまで
WEBページを表示するまでShoichi Kakizaki
 
アプリデザインのお勉強 UI/UXのお話
アプリデザインのお勉強 UI/UXのお話アプリデザインのお勉強 UI/UXのお話
アプリデザインのお勉強 UI/UXのお話shinta rock
 
少し未来のコードレビュー
少し未来のコードレビュー少し未来のコードレビュー
少し未来のコードレビューzaru sakuraba
 
アプリのテストを書かなければならないと分かっているけども、書けていない人たちへ
アプリのテストを書かなければならないと分かっているけども、書けていない人たちへアプリのテストを書かなければならないと分かっているけども、書けていない人たちへ
アプリのテストを書かなければならないと分かっているけども、書けていない人たちへTomohiro Yamasaki
 
ほんわかSwift勉強資料
ほんわかSwift勉強資料ほんわかSwift勉強資料
ほんわかSwift勉強資料kouhei kawamata
 
非エンジニア向けHTML勉強会その1
非エンジニア向けHTML勉強会その1非エンジニア向けHTML勉強会その1
非エンジニア向けHTML勉強会その1Karino Kyohei
 
0528 kanntigai ui_ux
0528 kanntigai ui_ux0528 kanntigai ui_ux
0528 kanntigai ui_uxSaori Matsui
 

Viewers also liked (9)

正規表現勉強会
正規表現勉強会正規表現勉強会
正規表現勉強会
 
エンジニアでもできる⁉︎それっぽいデザイン
エンジニアでもできる⁉︎それっぽいデザインエンジニアでもできる⁉︎それっぽいデザイン
エンジニアでもできる⁉︎それっぽいデザイン
 
WEBページを表示するまで
WEBページを表示するまでWEBページを表示するまで
WEBページを表示するまで
 
アプリデザインのお勉強 UI/UXのお話
アプリデザインのお勉強 UI/UXのお話アプリデザインのお勉強 UI/UXのお話
アプリデザインのお勉強 UI/UXのお話
 
少し未来のコードレビュー
少し未来のコードレビュー少し未来のコードレビュー
少し未来のコードレビュー
 
アプリのテストを書かなければならないと分かっているけども、書けていない人たちへ
アプリのテストを書かなければならないと分かっているけども、書けていない人たちへアプリのテストを書かなければならないと分かっているけども、書けていない人たちへ
アプリのテストを書かなければならないと分かっているけども、書けていない人たちへ
 
ほんわかSwift勉強資料
ほんわかSwift勉強資料ほんわかSwift勉強資料
ほんわかSwift勉強資料
 
非エンジニア向けHTML勉強会その1
非エンジニア向けHTML勉強会その1非エンジニア向けHTML勉強会その1
非エンジニア向けHTML勉強会その1
 
0528 kanntigai ui_ux
0528 kanntigai ui_ux0528 kanntigai ui_ux
0528 kanntigai ui_ux
 

Similar to Google fusion tables api v1.0 tips

CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
20100930 sig startups
20100930 sig startups20100930 sig startups
20100930 sig startupsIchiro Fukuda
 
既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~じゅん なかざ
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説Masahiko Sawada
 
MariaDB 10.3 概要
MariaDB 10.3 概要 MariaDB 10.3 概要
MariaDB 10.3 概要 GOTO Satoru
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでRyo Nakamaru
 
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能Ryota Watabe
 
MariaDB meetup Tokyo 2019 #01
MariaDB meetup Tokyo 2019 #01MariaDB meetup Tokyo 2019 #01
MariaDB meetup Tokyo 2019 #01GOTO Satoru
 
Openstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationOpenstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationyukihiro kawada
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門じゅん なかざ
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングYuichi Tateno
 
初心者向けWebinar AWSで開発環境を構築しよう
初心者向けWebinar AWSで開発環境を構築しよう初心者向けWebinar AWSで開発環境を構築しよう
初心者向けWebinar AWSで開発環境を構築しようAmazon Web Services Japan
 
IT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングIT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングKazuki Takai
 
InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbNaotoshi Seo
 
オライリーセミナー Hive入門 #oreilly0724
オライリーセミナー Hive入門  #oreilly0724オライリーセミナー Hive入門  #oreilly0724
オライリーセミナー Hive入門 #oreilly0724Cloudera Japan
 
10分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 101010分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 1010Nobuaki Oshiro
 
TokyoWebminig カジュアルなHadoop
TokyoWebminig カジュアルなHadoopTokyoWebminig カジュアルなHadoop
TokyoWebminig カジュアルなHadoopTeruo Kawasaki
 
JiraとConfluenceのTips集
JiraとConfluenceのTips集JiraとConfluenceのTips集
JiraとConfluenceのTips集Hiroshi Ohnuki
 
2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画keki3
 

Similar to Google fusion tables api v1.0 tips (20)

CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
20100930 sig startups
20100930 sig startups20100930 sig startups
20100930 sig startups
 
既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説
 
MariaDB 10.3 概要
MariaDB 10.3 概要 MariaDB 10.3 概要
MariaDB 10.3 概要
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
 
MariaDB meetup Tokyo 2019 #01
MariaDB meetup Tokyo 2019 #01MariaDB meetup Tokyo 2019 #01
MariaDB meetup Tokyo 2019 #01
 
Openstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationOpenstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verification
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
 
初心者向けWebinar AWSで開発環境を構築しよう
初心者向けWebinar AWSで開発環境を構築しよう初心者向けWebinar AWSで開発環境を構築しよう
初心者向けWebinar AWSで開発環境を構築しよう
 
IT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングIT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティング
 
PostgreSQL 9.5 新機能紹介
PostgreSQL 9.5 新機能紹介PostgreSQL 9.5 新機能紹介
PostgreSQL 9.5 新機能紹介
 
InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdb
 
オライリーセミナー Hive入門 #oreilly0724
オライリーセミナー Hive入門  #oreilly0724オライリーセミナー Hive入門  #oreilly0724
オライリーセミナー Hive入門 #oreilly0724
 
10分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 101010分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 1010
 
TokyoWebminig カジュアルなHadoop
TokyoWebminig カジュアルなHadoopTokyoWebminig カジュアルなHadoop
TokyoWebminig カジュアルなHadoop
 
JiraとConfluenceのTips集
JiraとConfluenceのTips集JiraとConfluenceのTips集
JiraとConfluenceのTips集
 
2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画
 

More from Wataru Sato

SendGridにおけるStopLightを 活用したAPI管理
SendGridにおけるStopLightを 活用したAPI管理SendGridにおけるStopLightを 活用したAPI管理
SendGridにおけるStopLightを 活用したAPI管理Wataru Sato
 
SendGrid Night in Fukuoka #1
SendGrid Night in Fukuoka #1SendGrid Night in Fukuoka #1
SendGrid Night in Fukuoka #1Wataru Sato
 
戦車乗りもmBaaSでメール送信できるかもしれない件
戦車乗りもmBaaSでメール送信できるかもしれない件戦車乗りもmBaaSでメール送信できるかもしれない件
戦車乗りもmBaaSでメール送信できるかもしれない件Wataru Sato
 
Mashup Hackathon 名古屋 MA11
Mashup Hackathon 名古屋 MA11Mashup Hackathon 名古屋 MA11
Mashup Hackathon 名古屋 MA11Wataru Sato
 
インテル® Edison ボード ハッカソン東京
インテル® Edison ボード ハッカソン東京インテル® Edison ボード ハッカソン東京
インテル® Edison ボード ハッカソン東京Wataru Sato
 
MA10 Mashup hackathon 北陸 in 福井 2014/08/30~31
MA10 Mashup hackathon 北陸 in 福井 2014/08/30~31MA10 Mashup hackathon 北陸 in 福井 2014/08/30~31
MA10 Mashup hackathon 北陸 in 福井 2014/08/30~31Wataru Sato
 
勉強会:設定管理について
勉強会:設定管理について勉強会:設定管理について
勉強会:設定管理についてWataru Sato
 
Heroku × SendGridイベント管理
Heroku × SendGridイベント管理Heroku × SendGridイベント管理
Heroku × SendGridイベント管理Wataru Sato
 
デ部15 step counter step detector
デ部15 step counter step detectorデ部15 step counter step detector
デ部15 step counter step detectorWataru Sato
 
SendGrid Parse APIをデモってみる
SendGrid Parse APIをデモってみるSendGrid Parse APIをデモってみる
SendGrid Parse APIをデモってみるWataru Sato
 

More from Wataru Sato (10)

SendGridにおけるStopLightを 活用したAPI管理
SendGridにおけるStopLightを 活用したAPI管理SendGridにおけるStopLightを 活用したAPI管理
SendGridにおけるStopLightを 活用したAPI管理
 
SendGrid Night in Fukuoka #1
SendGrid Night in Fukuoka #1SendGrid Night in Fukuoka #1
SendGrid Night in Fukuoka #1
 
戦車乗りもmBaaSでメール送信できるかもしれない件
戦車乗りもmBaaSでメール送信できるかもしれない件戦車乗りもmBaaSでメール送信できるかもしれない件
戦車乗りもmBaaSでメール送信できるかもしれない件
 
Mashup Hackathon 名古屋 MA11
Mashup Hackathon 名古屋 MA11Mashup Hackathon 名古屋 MA11
Mashup Hackathon 名古屋 MA11
 
インテル® Edison ボード ハッカソン東京
インテル® Edison ボード ハッカソン東京インテル® Edison ボード ハッカソン東京
インテル® Edison ボード ハッカソン東京
 
MA10 Mashup hackathon 北陸 in 福井 2014/08/30~31
MA10 Mashup hackathon 北陸 in 福井 2014/08/30~31MA10 Mashup hackathon 北陸 in 福井 2014/08/30~31
MA10 Mashup hackathon 北陸 in 福井 2014/08/30~31
 
勉強会:設定管理について
勉強会:設定管理について勉強会:設定管理について
勉強会:設定管理について
 
Heroku × SendGridイベント管理
Heroku × SendGridイベント管理Heroku × SendGridイベント管理
Heroku × SendGridイベント管理
 
デ部15 step counter step detector
デ部15 step counter step detectorデ部15 step counter step detector
デ部15 step counter step detector
 
SendGrid Parse APIをデモってみる
SendGrid Parse APIをデモってみるSendGrid Parse APIをデモってみる
SendGrid Parse APIをデモってみる
 

Google fusion tables api v1.0 tips

  • 1. Google Fusion Tables API v1.0 Tips 2013/3/18 @awwa500 Wataru Sato 1
  • 2. 自己紹介 • Wataru Sato – 本業は通信キャリア研究所向けにソフトウェア 作っています – 個人的にはAndroid、AWS(SDB)、Fusion Tablesなど で遊んでいます • SmartTraining • ググれカス plug-in for twicca • 他 • @awwa500 • awwa@gmail.com 2
  • 3. きっかけ • Fusion Tables APIが新しくなり、乗り換え てみました • 乗り換えてみたはいいけど、ハマりま くってドブ板踏み抜き過ぎて疲れました • 踏み抜いたドブ板の数を数えてみたら結 構あったので、まとめてみました 3
  • 4. Google Fusion Tablesとは • Google Driveで使えるDBっぽいヤツ • ユーザプライベートなデータを(たぶ ん)無料で利用できる ←コレ 4
  • 5. Google Fusion Tablesとは • データを手軽に可視化できる 5
  • 6. Google Fusion Tables APIとは • FTのデータにアクセスするためのAPI • 2つのAPI – SQL API • 既にオワコン • We will now shut down SQL API after January 14, 2013. – API v1.0 • 今ならこれを使うしかない • RESTful HTTP経由でSQL的なクエリ操作ができる • 結果はJSON or CSVで受け取る 6
  • 7. ライブラリ • FTを使おうと思った時に公開されていたも のが依存関係とか、使い方覚えるのが面 倒だったので使っていません • 最近チェックしたらスッキリしてきたか も – https://code.google.com/p/google-api-java- client/wiki/APIs#Fusion_Tables_API • もしかしたら、コレを使っていればドブ 板踏み破る数は減っていたかも • 是非使ってみて下さい 7
  • 8. 基本 • Google APIs consoleでサービス有効化 • OAuth 2.0 • HTTPリクエスト • レスポンスパース • 詳しくは – https://developers.google.com/fusiontables/docs/ v1/using 8
  • 9. OAuth2.0 • 通常は、普通にOAuth2すればいい • Androidの場合、AccountManager経由がセキュリティ的 に好ましい – 琴線探査:AndroidのAccountManager経由でGoogleの OAuth2認証を行うには?(外部ライブラリ完全非依存版) • http://kinsentansa.blogspot.jp/2012/08/androidaccountmanagergoog leoauth2.html • AndroidでWebView経由で行うのは好ましくない – Shogo’s Blog:OAuthの認証にWebViewを使うのはやめよう • http://shogo82148.github.com/blog/2012/11/24/no-more-webview/ • この記事はTwitterのOauthに関して書かれているが、WebViewの 脆弱性に関しては同じ事 9
  • 10. テーブルアクセスの基本 • Create table時に返されるtableIdを使って テーブル指定する必要がある Client FT Create table tableId SELECT * FROM <table_id> 10
  • 11. レコードアクセスの基本 • Insert row時に生成されるROWIDを使って 更新(update,delete)する必要がある Client FT Insert row ROWID UPDATE <table_id> SET <column_name> = <value> WHERE ROWID = <row_id> 11
  • 12. レコードCRUD CRUD 手法 詳細 Create Insert row 1クエリ1レコード挿入 クエリを”;”で繋げて1リクエストに複数クエリ送信可 戻り値でROWIDを得ることができる Import rows POSTのBodyにCSVを突っ込んで大量レコード挿入可 戻り値でROWIDを得ることができない Select Select rows 作成したColumnの他、ROWIDを取得することができ る Update Update row ROWID指定するか、無指定で全レコード対象 任意の条件を指定することはできない Delete Delete row ROWID指定するか、無指定で全レコード対象 任意の条件を指定することはできない 12
  • 13. 大量レコード挿入戦略~Insert row ~ • Insert rowでは、1リクエストあたり500 Insertまでいける、とドキュメントに書い てある – https://developers.google.com/fusiontables/docs/ v1/using#insertRow – しかし、sqlパラメータはQueryString – 実際にはURL長の制限を受ける • ヾ(*`Д´*)ノ“ 13
  • 14. 大量レコード挿入戦略~Import rows ~ • Import rowsなら1リクエストで100MBまでの データを挿入できる • しかし、戻り値でROWIDは取得できない • ROWIDが欲しければ、Import rows後、Select する必要がある • しかし、500レコード以上をImport rowsした 場合、すぐにSelectしてもROWIDが取得でき ない場合がある • どうやらImport rows後のレコード反映は、 500レコードずつ分割されて非同期で実行さ れている模様 14
  • 15. 大量レコード挿入戦略~Import rows ~ • 大量レコードImport時の雰囲気 Client FT BackEnd Import rows (over 500 rows) Insert rows(500) NumRowsReceived=2500 Select Insert rows(500) Insert rows(500) 反映に時間 全レコード取れない! がかかる Insert rows(500) Insert rows(500) 15
  • 16. 大量レコード挿入戦略~Import rows ~ • 期待したレコード数になるまでポーリン グ Client FT BackEnd Import rows (over 500 rows) Insert rows(500) NumRowsReceived=2500 Select count() Insert rows(500) Insert rows(500) 反映に時間 1000 がかかる Select count() Insert rows(500) 2000 Insert rows(500) Select count() 2500 Select 16 ROWID
  • 17. 大量レコード挿入戦略~Import rows ~ • もしくはImport rows後すぐにはROWIDは取 りに行かない。必要になったタイミング で個別にROWIDをSelect後、更新操作を行 う 17
  • 18. 大量レコード挿入戦略~Import rows ~ • まとめ – アクセス頻度に応じた作戦をとること レコードアクセス頻 方法 度 高い Import rows後、速やかに全ROWIDを取得してローカルに 記憶しておき、即更新処理を可能にしておく 低い Import rows後、ROWIDは必要になったタイミングで個別 にSelect後、目的の更新処理を実行する 取得したROWIDはキャッシュしておくと少しは良い 18
  • 19. レコード更新(Update, Delete)時 注意 • ROWID指定した場合 – レスポンスのaffectedRowsには影響を受けたレ コード数が整数で返ってくる • ROWID指定しない場合 – レスポンスのaffectedRowsに”all rows”という文 字列が返ってくる _人人人人人人人人_ >文字列が返ってくる<  ̄^Y^Y^Y^Y^Y^Y^Y^Y ̄ 19
  • 20. ROWIDに関する注意 • Insert rowした場合のROWID – 割り当てられるROWIDは昇順とは限らない • Order by無指定時のソート順 – ROWIDの昇順でソートされて返ってくる • Order byにROWIDを指定すると503 – 指定してはいけない • ROWID = 0でSelectすると503 – 指定してはいけない 20
  • 21. テーブル間の外部参照 • そんな機能はない • あるわけがない • どうしてもやりたければ – A案)子テーブルに親テーブルレコードのROWID を格納するColumnを設ける – B案)親テーブルのレコード毎に子テーブルを分 けて、親テーブルに子テーブルのtableIdを格納す るColumnを設ける • 無論、関連情報は自分で更新する、制約がは れるわけではない 21
  • 22. テーブル間の外部参照 • A案)子テーブルに親テーブルレコードの ROWIDを格納するColumnを設ける 親テーブル 子テーブル ROWID ROWID PARENT_ROWID 1 1 1 2 2 1 3 2 4 2 22
  • 23. テーブル間の外部参照 • B案)親テーブルのレコード毎に子テーブ ルを分けて、親テーブルに子テーブルの tableIdを格納するColumnを設ける 親テーブル ROWID CHILD_TABLE_ID 子テーブル(tableId=XXX) 1 XXX 2 YYY ROWID 1 子テーブル(tableId=YYY) 2 ROWID 1 大量なテーブル生成は大量なImportを必要とする 2 503発生の原因になりやすいので注意する 23
  • 24. タイムアウト • クライアントタイムアウト値は最低でも 60秒くらいは必要 – HttpClientなどを利用しているとタイムアウト 値が短かったりするので長めに設定すること 24
  • 25. HTTP 503との闘い • HTTP 503:Service Unavailable – 裏でナニかが起きた – ナニ • 高頻度のアクセスによるブロック • Select rowでROWIDでorder by • Select rowでROWID = 0 • Fusion Tables自体の不具合(たぶん) • など 25
  • 26. アクセス制限 • Google APIs console • 制限はこれだけではない – 上限に関して明確には規定されていない • 問合せても回答がもらえない – 特にImport rowsで発生しやすい • 例)Import rowsをスリープなしで18回繰り返すと発生 – 復旧 • まる1日制限されたり、数分で復旧したり、とにかくよくわ からない – 影響範囲 • ユーザ単位 26
  • 27. 誰かに質問したい時は • 技術的な質問はStackoverflowを使うこと • Google GroupのFusion Tables APIグループは 技術以外に関するディスカッションの場 という位置づけ – 誤って質問を投げてしまうと、ディスカッ ションの途中で「Stackoverflowに行け!」と 言われて議論はウヤムヤになる 27
  • 28. Stackoverflowへ質問する時 • 503が発生した時の質問方法 • 以下の2点を質問内容に含めておくと回答 が得られやすい – どういうリクエストを投げたのか? – 具体的なレスポンスのBody(JSON) • Try it!を使うとわりと便利 – https://developers.google.com/fusiontables/docs/ v1/reference/query/sqlGet#try-it • 「503起きた-!」だけでは何も伝わらな い 28
  • 29. Try it! 29