検索 - みる会図書館

検索対象: WEB+DB PRESS Vol.88

WEB+DB PRESS Vol.88から 179件ヒットしました。

WEB+DB PRESS Vol.88


サ ー ビ ス の 成 長 を 支 え る 現 場 の 技 術 で す 。 ま と め て 取 得 す る に は こ の 「 一 度 ア ソ シ ェ ー シ 適 し た シ ー ン 、 そ し て 3 つ の 使 い 分 け を 紹 介 し ま す 。 ド を 用 意 し て い ま す 。 各 メ ソ ッ ド の メ カ ニ ズ ム と 利 用 に Record で は ほ か に preload と eager load と い う メ ソ ッ せ て 取 得 し 効 率 化 す る た め の メ ソ ッ ド と し て 、 Active includes の よ う に ア ソ シ ェ ー シ ョ ン の デ ー タ を 合 わ 3 つ の メ ソ ッ ド Eager Loading に 関 連 し た で 、 そ の 利 用 方 法 を 見 て い き ま す 。 す 注 5 。 ActiveRecord に は 後 者 の 方 法 も 用 意 さ れ て い る の う 方 法 に 加 え て 、 RDB の JOIN 句 を 使 う 方 法 も あ り ま の デ ー タ を 取 得 す る SQL ク エ リ を 別 途 発 行 す る 」 と い ョ ン 元 の デ ー タ を 取 得 し て か ら 、 ア ソ シ ェ ー シ ョ ン 先 「 可 oad . "name" AS t0 rl, iusersl SELECT "users" . "id" AS t0 r0, > User. eager_load( :team) マ 図 13 rails ( onso 厄 で eage 「 」 oad を 実 行 す る FROM "users" WHERE "teams" . "namel SQLite3: :SQLException: no such column: teams . name: SELECT " namei SELECT "users" . * FROM "users" WHERE "teams" increments' } ) > User. preload( :team) . where(teams: { name: teams テ ー フ ル の カ ラ ム で 条 件 指 定 で き な い SELECT * FROM teams WHERE teams . id IN ( . SELECT * FROM users ; > User. preload( :team) マ 図 12 「 a ( onso 厄 で p 「 eload を 実 行 す る 各 RDBMS の ド キ ュ メ ン ト な ど を 参 照 し て く た さ い 。 注 5 本 稿 で は 」 OIN に つ い て の 詳 し い 説 明 は 行 い ま せ ん 。 詳 し く は せ ず に 、 複 数 の ク エ リ 発 行 に よ っ て 取 得 し ま す ( 図 12 ) 。 p 「 e 朝 ad メ ソ ッ ド は ア ソ シ ェ ー シ ョ ン の デ ー タ を J()IN こ れ ま で の includes 利 用 の 際 と 同 じ メ カ ニ ズ ム で す 。 な お p 「 eload で は ア ソ シ ェ ー シ ョ ン 先 の テ ー ブ ル の カ ラ ム を 検 索 条 件 に 指 定 す る こ と は で き ま せ ん 。 複 数 ク エ リ を 使 っ て 取 得 す る た め 、 2 番 目 に 問 い 合 わ せ る テ ー プ ル ( 今 回 の ケ ー ス で は teams テ ー ブ ル ) の 条 件 を も と に 取 得 す る 全 体 の デ ー タ を 絞 り 込 む こ と は で き ず 、 SQL の エ ラ ー が 発 生 し ま す 。 Oeager load eager_load は 、 ア ソ シ ェ ー シ ョ ン の デ ー タ を 対 象 テ ー カ レ と LEFTOUTERJOIN す る こ と で ま と め て 取 得 し ま す 。 JOIN に よ り 1 つ の SQL ク エ リ で 取 得 す る た め 、 preload と は 違 っ て ア ソ シ ェ ー シ ョ ン 先 の テ ー フ 。 ル ( JOIN し た テ ー カ レ ) の カ ラ ム を 使 っ て 絞 り 込 む こ と も で き ま す ( 図 1 3 ) 。 た だ し 、 JOIN は レ コ ー ド 数 の 多 い テ ー フ 。 ル で は 時 間 が か か る こ と も あ る た め 、 条 件 を 指 定 す る 必 要 の な い 場 合 は preload の ほ う が 適 切 で あ る こ と も 多 い で し よ う 。 namel usersl lincrements . "team id" AS t0 r2, "users" . "created at" AS t0 「 引 nusersll . "updated at" AS t0 ー 「 4 , "teams" . 駐 d ” AS tl r0, users . "updated at" AS tl 「 3 "teams" . "created at" AS tl r2 ′ AS tl 「 FROM "users" LEFT OUTER JOIN "teams" ON "teams" . "id" teams テ ー フ ル の カ ラ ム で 条 件 指 定 も 可 能 マ 図 14 refe 「 en ( es で ア ソ シ ェ ー シ ョ ン を 指 定 す る 以 下 は エ ラ ー に な る 'incrementsi } ) > User. eager load( :team) . where(teams: { name: incrementsl ) > User. includes( :team) . where('teams . name = User Load ( 1.4ms ) SELECT "users" . * FROM "users" WHERE (teams . "team idi . name increments 150 ・ W 第 8 + DB P を 55 Vo 88 「 efe 「 en ( es を 使 っ て ア ソ シ ェ ー シ ョ ン を 指 定 = > # く ActiveRecord : : Relation [# く User id : .. # く User id: 乙 lusersl "teamsl' ON "teams' . "id" . "team id" WHERE (teams . name = iincrementsi) AS tl r2, . " 叩 dated_at" AS tl r3 FROM "users" LEFT OUTER JOIN "teams" . "name" AS tl 「 AS t0 「 "teams" . "id'i AS tl 「 0 , "teams" . "created at" usersl . "team id" AS t0 r2, "users '."created at" AS t0 r3, "users" . " 叩 dated at" SQL ( 1. Oms ) SELECT "users". "id'i AS t0 r0, "users". "name" AS tO rl を > User. includes( :team) . where(lteams. name = 'increments つ . references( : team) SELECT "usersi' . * FROM "users'l WHERE (teams. name = 'increments') ActiveRecord : : StatementInvaIid : SQLite3: : SQLException : no such column : teams. name : WHERE (teams. name = incrementsl) SQLite3: :SQLException: no such column: teams. name: SELECT "users". * FROM "users" 0 includes includes は 「 複 数 ク エ リ 発 行 」 「 JOIN の 利 用 」 と い う 前 述 し た 2 つ の 手 法 を 、 状 況 に 応 じ て 使 い 分 け て く れ る メ ソ ッ ド で す 。 多 く の ケ ー ス で は 複 数 ク エ リ 発 行 方 式 ( p 「 eload 方 式 ) を 使 い 、 ア ソ シ ェ ー シ ョ ン 情 報 を 別 の ク エ リ で 読 み 出 し ま す 。 し か し ア ソ シ ェ ー シ ョ ン 先 の テ ー プ ル の カ ラ ム で 検 索 条 件 を 指 定 し て い る と き や 別 の ア ソ シ ェ ー シ ョ ン に 対 し て す で に eager load を 呼 ん で い る と き な ど は JOIN を 利 用 し ま す (eager_load 方 式 ) 。 な お 、 includes し た ア ソ シ 工 ー シ ョ ン 先 の テ ー ブ ル を 使 っ て 条 件 を 指 定 す る た め に は 、 図 14 の よ う に references と い う メ ソ ッ ド を 呼 ぶ 必 要 が あ り ま す 。 reference(:team) の よ う に 条 件 と し て 指 定 し た い ア ソ シ ェ

WEB+DB PRESS Vol.88


Ra ア プ リ ケ ー end end シ ョ ン の デ ー タ ベ ー ス チ ュ ー ニ ン グ 0 ◇ 0 A ( t ⅳ eRe ( ord に お け る ポ ト ル ネ ッ ク の 発 見 と そ の 解 消 以 上 で テ ス ト 用 の ア プ リ ケ ー シ ョ ン が 作 成 で き ま し た 。 次 に 、 テ ス ト 用 に デ ー タ を い く っ か 挿 入 し ま す ( 図 1 0) 。 以 上 で 、 increments チ ー ム に 所 属 す る 10 名 の ユ ー ザ デ ー タ が 作 成 さ れ ま し た 。 こ れ ら に 対 し て N + 1 問 題 が 発 生 す る よ う な SQL を ビ ュ ー か ら 発 行 し て み ま す 。 く % User. all. each dO luserl % > く % = use 「 . team . name % > く % end % > 「 ails s に よ り RaiIs サ ー バ を 立 ち 上 げ て http://Iocalhost:3000/ app/views/home/index . html . erb マ 図 10 テ ス ト 用 デ ー タ の 投 入 $ rails c > team = Team. create(name: ー increments つ > 10. times { は 一 User. create(name: "test-user-#{i}", team id: team. (d) } マ リ ス ト 1 log/bullet. log 2015-07-04 17 : 14 : 56 [ WARN ] use 「 : yaotti http://IocaIhost:3000/home/index N + 1 Query detected :includes = > [ :team] ー ー ・ ② Add t0 you 「 finder: N + 1 Query method call stack /private/tmp/myapp/app/views/home/index. html. erb:2:in ー ー 0 、 block in _app_views home index html erb ー 1 囲 9492749201388797 ー 703180421350 囲 ' /private/tmp/myapp/app/views/home/index. html. erb:l:in app_views home index html_e 「 b 1 囲 9492749201388797 ー 703180421350 囲 ・ /private/tmp/myapp/app/views/home/index. html. erb : 2 : in 、 block in _app_views home index html erb 1 囲 9492749201388797 703180421350 囲 ・ /private/tmp/myapp/app/views/home/index. html. erb: 1 : in app_views home index html_erb 1 囲 9492749201388797 70318042135 囲 0 ・ home/index ヘ ア ク セ ス す る と 、 Bu Ⅱ et の ロ グ フ ァ イ ル ( 朝 g / bullet. log) に リ ス ト 1 の よ う な 内 容 が 出 力 さ れ ま す 。 こ の ロ グ に は 、 N + 1 問 題 を 起 こ す ク エ リ の 発 行 場 所 ( 0 ) 、 問 題 と な っ て い る モ デ ル の 関 連 ( 0 ) と 解 決 方 法 ( ② ) が 出 力 さ れ て い ま す 。 こ の よ う に N + 1 問 題 が 発 生 す る と ロ グ 出 力 か ら 修 正 個 所 お よ び 解 決 方 法 を 教 え て く れ る の で 、 こ れ ら に 沿 っ て 修 正 す れ ば N + 1 問 題 を 解 消 で き ま す 。 N 十 1 問 題 の 解 決 N + 1 問 題 は 、 事 前 に 関 連 テ ー フ 。 ル の デ ー タ を 読 み 込 む こ と で 解 決 で き ま す 。 こ れ を EagerLoading と 言 い ま す 。 先 ほ ど Bullet に よ り 提 示 さ れ た と お り 、 N + 1 問 題 を 引 き 起 こ し て い た コ ー ド を 次 の よ う に 変 え て み ま す 。 く % User.incIudes( :team) . all. each d0 luserl % > く % = user . team. name % > く % end % > 前 回 と は 違 い 、 includes(:team) を 追 加 し て い ま す 。 こ れ に よ り 、 次 の よ う な SQL2 つ の 発 行 の み に 抑 え ら app/views/home/index . html.erb れ ま す 。 SELECT * FROM users LIMIT 10 : SELECT * FROM teams WHERE teams . id IN ( 1 , 2 を , 10L こ で 利 用 し て い る includes メ ソ ッ ド に よ り 、 引 数 で 指 定 さ れ た 関 連 テ ー フ 。 ル を 合 わ せ て 必 要 な だ け 取 得 で き ま す 。 今 回 の ケ ー ス で は 、 u se rs テ ー プ ル の 10 件 に 対 応 す る teams テ ー プ ル を 1 つ の SQL 発 行 に よ り 取 得 し ま す 。 こ れ に よ り 、 includes を 使 わ な い 場 合 は 11 個 の SQL を 実 行 し て い た の に 対 し て 、 2 つ の SQL の み で 同 じ デ ー タ を 取 得 で き ま す 。 Bullet か ら N + 1 問 題 の あ る ク エ リ を 警 告 さ れ た 場 合 は こ の よ う に コ ー ド を 変 更 し て 、 パ フ ォ ー マ ン ス を 改 善 し ま し よ う 。 マ 図 11 includes で 関 連 テ ー ブ ル を 取 得 す る > User. includes( :team) . tO a SELECT * FROM users : SELECT * FROM teams WHERE teams . id IN ( . - SQ し の 発 行 数 を 減 ら す A&CEagar.Loading の し く み 前 節 に て 「 N + 1 問 題 を 解 決 す る Eager Loading を 行 う に は includes メ ソ ッ ド を 呼 ぶ と よ い 」 と い う 話 を し ま ' で は も う 少 し 踏 み 込 ん で 、 な ぜ includes に よ っ て N + 1 問 題 が 解 決 さ れ る の か を 解 説 し た う え で 、 EagerLoading の た め に includes と 併 せ て 知 っ て お く こ で 、 2 つ 目 の SQL に あ る teams . id IN ( . ル ま で 、 別 途 ク エ リ を 発 行 し て 取 得 し ま す ( 図 1 1 ) 。 includes を 実 行 す る と 、 引 数 で 指 定 し た 関 連 テ includes の 効 果 べ き メ ソ ッ ド を 紹 介 し ま す 。 ー プ WEB + DB P 震 ド 55 0L88 ・ 149 に な る デ ー タ を 事 前 に ま と め て 取 得 し て お く 」 と い う も こ の よ う に 、 Eager ading の 基 本 的 な 概 念 は 「 必 要 回 数 を 大 幅 に 減 ら す こ と が で き ま す 。 の で は な く 一 括 で 取 得 す る こ と で 、 SQL ク エ リ の 発 行 ー ド を 、 users テ ー フ 。 ル の レ コ ー ド ご と に 取 得 し に い く ポ イ ン ト で す 。 将 来 必 要 と な る teams テ ー ブ ル の レ コ

WEB+DB PRESS Vol.88


サ ー ビ ス の 成 長 を 支 え る 現 場 の 技 術 第 = = と え は users テ ー フ 。 ル と teams テ ー プ ル が あ り 、 1 き に は 大 き な 問 題 と な り ま せ ん が 、 デ ー タ 量 が 増 え た つ の user は い ず れ か の team に 所 属 す る 関 係 に あ る と り 多 く の デ ー タ を 表 示 す る 場 所 だ と パ フ ォ ー マ ン ス の し ま す 。 Ac ⅱ veRecord を 使 っ て こ れ ら の モ デ ル ク ラ ス 劣 化 を 引 き 起 こ し ま す 。 こ れ が N + 1 問 題 で す 。 を 表 現 す る と 次 の よ う に な り ま す 。 Bu et の イ ン ス ト ー ル と 設 定 app/models/use 「 . rb N + 1 問 題 を 検 出 し 、 警 告 し て く れ る の が Bu Ⅱ et 注 3 と い う gem で す 。 イ ン ス ト ー ル す る に は GemfiIe に 次 の 行 を 追 加 し bundle install を 実 行 し ま す 。 N + 1 問 題 が 発 生 し て い る か ど う か は 開 発 中 に 知 る こ と が で き れ ば よ い の で 、 開 発 環 境 や テ ス ト で の み イ ン ス ト ー ル す る と よ い で し よ う 。 class User く ActiveRecord: :Base belongs tO :team end app/models/team. rb class Team く ActiveRecord: :Base end こ で 各 ュ ー ザ の 所 属 す る チ ー ム を 表 示 す る 場 合 、 次 の よ う な コ ー ド に な る で し よ う 。 group :development d0 = User. Iimit(10) ー ・ 一 ① users gem ibullet' users. each dO luserl end putS user. team. name end イ ン ス ト ー ル し た Bu Ⅱ et を 有 効 化 す る に は 、 config/ こ の コ ー ド を 実 行 し た と き に ど う い っ た SQL が 実 environments/devel 叩 ment. rb で 次 の よ う な 設 定 を 行 行 さ れ る か 考 え て み ま し よ う 。 ま ず ュ ー ザ 10 件 を 取 得 い ま す 。 す る 個 所 ( 0 ) で は 1 つ の SQL が 実 行 さ れ ま す 。 次 に 各 ュ ー ザ ご と の チ ー ム 情 報 を 取 得 ( ② ) す る た め 、 ユ ー ザ 数 分 ( 10 件 ) の SQL が 実 行 さ れ ま す 。 具 体 的 に は 次 の よ う な SQL が 実 行 さ れ て お り 、 合 計 し て 11 回 の SQL が 実 行 さ れ ま す 。 SELECT * FROM users LIMIT 10 : id = SELECT * FROM teams WHERE teams . id = SELECT * FROM teams WHERE teams . id = SELECT * FROM teams WHERE teams . SELECT * FROM teams WHERE id = teams . し か し 、 2 つ 目 以 降 の SQL は 本 来 次 の よ う な 1 つ の SQL に ま と め ら れ る は ず で す 。 SELECT * FROM users LIMIT 1 の SELECT * FROM teams WHERE teams . id IN ( し 乙 本 来 は こ の 2 つ の SQL で 取 得 で き る に も か か わ ら ず 、 11 個 の SQL に よ っ て 取 得 し よ う と し て い る の で 9 回 の 不 必 要 な SQL が 実 行 さ れ て い る と い う こ と で す 。 で の users の 取 得 件 数 ( こ れ を N と し ま す ) が 小 さ い と マ 図 9 テ ス ト 用 の ア プ リ ケ ー シ ョ ン を 作 成 す る Gemfile ② config/envi 「 onments/development . 「 b config . after initialize d0 Bullet . enable = true Bullet . alert = true Bullet. bullet_logger = BuIIet. rails_logger = end true true こ の 設 定 に よ り 、 Bu Ⅱ et を 有 効 化 し (enabled) 、 N + 1 問 題 を 引 き 起 こ す ク エ リ が 実 行 さ れ た と き に は JavaScript の ア ラ ー ト 実 行 ( ale 「 t ) お よ び BuIIet 用 ロ グ フ ァ イ ル は og / bullet ユ og ) と Rails の ロ グ に 警 告 を 出 力 し ま す 。 ほ か に も GrowI で ポ ッ プ ア ッ プ 通 知 し た り 、 Slack や AirBrake な ど の 外 部 サ ー ビ ス に 通 知 さ せ る な ど の 設 定 も あ り ま す 。 詳 し く は bullet の READMFP4 を 参 照 し て く だ さ い 、 ↓ っ っ 0 ー 10L N 十 1 問 題 の 検 出 実 際 に BuIIet で の 検 出 を 試 し て み ま し よ う 。 図 9 を 実 行 し 、 前 述 の よ う な 「 ユ ー ザ が 1 つ の チ ー ム に 所 属 す る 」 と い う モ デ ル を 持 っ た ア プ リ ケ ー シ ョ ン を 作 っ て み ま す 。 次 に 、 Bullet を 有 効 化 す る た め に config/environ ments/development. rb を 次 の よ う に 変 更 し ま す 。 $ rails new myapp $ cd myapp $ rails g model team name : string $ rails g model user name:string team: references $ rake db: migrate $ rails g controller home index config/environments/development . rb 必 要 な モ デ ル 、 コ ン ト ロ ー ラ 、 ビ ュ ー を 作 成 す る Rails. application. configu 「 e d0 # 中 略 config. after initialize d0 Bullet . enable = true BuIIet. bullet_logger = true idevel 叩 ment 、 、 を 追 加 す る Gemfile を 開 き 、 、 gem 、 bullet ・ . g 「 0 叩 : $ edit GemfiIe $ bundle 最 後 に bundle を 実 行 注 3 https:〃github.com/flyerhzm/bullet 注 4 https://github.com/flyerhzm/bullet#configuration 148 ・ WEB + DB P 第 55 MOL88

WEB+DB PRESS Vol.88


Rai ア プ リ ケ ー シ ョ ン の デ ー タ ベ ー ス チ ュ ー A ( t ⅳ eRe ( ord に お け る ポ ト ル ネ ッ ク の 発 見 と そ の 解 消 ニ ン グ 0 ◇ 0 読 み 込 ん た デ ー タ の キ ャ ッ シ ュ 一 度 to a に よ り デ ー タ ベ ー ス か ら デ ー タ が 取 得 さ れ る と 、 そ の デ ー タ は キ ャ ッ シ ュ さ れ 、 使 い 回 さ れ ま す 。 そ の た め 同 じ ActiveRecord: : ReIation オ ブ ジ ェ ク ト に to a メ ソ ッ ド を 繰 り 返 し 呼 ん で も 、 SQL の 実 行 は 最 初 の 一 度 し か 行 わ れ ま せ ん ( 図 7 ) 。 こ の キ ャ ッ シ ュ は SQL 単 位 で は な く オ プ ジ ェ ク ト 単 位 で 行 わ れ る た め 、 同 じ SQL を 発 行 す る ActiveRecord : : Re tion オ ブ ジ ェ ク ト で あ っ て も 別 の オ フ 。 ジ ェ ク ト の 場 合 は キ ャ ッ シ ュ が 効 き ま せ ん 。 そ の た め 同 じ 条 件 を 指 定 す る 場 合 は 別 の オ フ 。 ジ ェ ク ト と し て ク エ リ を 作 る の で は な く 、 同 じ オ ブ ジ ェ ク ト を 使 い 回 す こ と を 考 え て み ま し よ う 。 レ コ ー ド 件 数 の 取 得 と キ ャ ッ シ ュ キ ャ ッ シ ュ さ れ て い る か ど う か は ほ と ん ど の 場 合 意 識 す る 必 要 は な い の で す が 、 レ コ ー ド の 件 数 取 得 メ ソ ッ ド で は キ ャ ッ シ ュ を 使 う か ど う か で 利 用 す る メ ソ ッ ド が 変 わ り ま す 。 レ コ ー ド 件 数 の 取 得 に は size と count と い う 2 つ の 実 行 し ま す ( 図 8 ) 。 レ コ ー ド 件 数 の 取 得 で は 、 そ の タ イ ミ ン グ で あ ら た め て 問 い 合 わ せ を 行 い た い の か 、 そ れ ま で に 読 み 込 ん だ レ コ ー ド の 件 数 で も よ い の か を 考 え て 使 い 分 け ま し よ う 。 次 に 、 そ も そ も 不 必 要 な SQL を 実 行 し て い な い か を 調 査 し 、 そ れ を 排 除 す る こ と で SQL を 実 行 す る 回 数 を 減 ら す 方 針 に つ い て 見 て い き ま し よ う 。 「 不 必 要 な SQL の 実 行 」 と い っ て も 、 ま っ た く 必 要 の な い デ ー タ を 取 得 す る SQL を 実 行 し て い る と い う こ と は そ う な い で し よ う 。 そ れ よ り は 「 必 要 な デ ー タ を 不 必 要 に 多 い SQL で 取 得 し て い る 」 と い う 状 況 の ほ う が 起 こ り 得 ま す 。 今 回 は そ の 中 で も ActiveRecord な ど の O / R マ ッ パ を 利 用 し て い る と き に 遭 遇 し や す い 「 N + 1 問 題 」 と 、 そ れ を 検 知 す る Bu Ⅱ et と い う gem を 取 り 上 げ ま す 。 N 十 1 問 題 と は N + 1 問 題 と は 、 「 関 連 し た テ ー プ ル の デ ー タ を 取 得 す る 際 に 不 必 要 に SQL を 発 行 し て し ま う 」 と い う 問 題 で す 。 - 不 必 要 な SQ の 実 行 を 第 発 見 す る : Bullet - メ ソ ッ ド が 存 在 し ま す 。 size メ ソ ッ ド は デ ー タ が す で に ロ ー ド さ れ て い た ら ク エ リ を 発 行 せ ず に キ ャ ッ シ ュ さ れ た レ コ ー ド の 件 数 を 数 え て 返 し ま す 。 一 方 count メ ソ ッ ド は 実 行 時 に 必 ず SELECT COUNT を マ 図 6 変 数 へ 代 入 す る た け で は ロ ー ド さ れ な い 変 数 へ 代 入 す る た け て は ロ ー ト さ れ な い = User. where(id: 1); u. loaded? 変 数 へ 代 入 後 、 印 字 す る タ イ ミ ン ク で ロ ー ド さ れ る = Use 「 . where(id: 1 ) > u User Load ( 0.3m 引 SELECT "users" . * FROM "users" WHERE "users" . = > #<ActiveRecord : : Relation [# く User id : 引 name: > u. loaded? = > true "test-user-2" マ 図 7 デ ー タ ベ ー ス へ の 問 い 合 わ せ は キ ャ ッ シ ュ さ れ る = User. where(id: 1 ) : u. t0 a User Load ( 0.9ms ) SELECT "usersl' . * FROM "users" WHERE i'users" . = > [# く User id: 1 第 name: "test-user-0" > u . tO a = > [# く User id: name: "test-user-O", team id: created at: " 2015 - 07-19 13 : 41 : 57 updated at: ” 2015-07-19 13 : 41 : 57 " > ] マ 図 8 size メ ソ ッ ド と ( ount メ ソ ッ ド の 違 い 末 尾 に : を 付 け る こ と て 印 字 を 避 け 、 ロ - ト を 防 く = User. where(location: 叮 0kyo つ : > a r > a r . S1ze ( 0.3ms ) SELECT COUNT(*) FROM "users" WHERE “ > a 「 . load size メ ソ ッ ド で は load し た あ と は SQL は 発 行 さ れ な い > a 「 . S 1Ze count メ ソ ッ ド て は load し た あ と て も 毎 度 SQL か 発 行 さ れ る > ar. count (0.3ms) SELECT COUNT(*) FROM "users" WHERE “ users" . “ 10 ( atiO 心 . "location users [ ド 10 ( ati0 心 [["location' 叮 okyo " ] ] W B + 08 P 第 55 MOL88 ・ 147

WEB+DB PRESS Vol.88


。 モ バ イ ル 開 発 最 前 線 ・ 画 面 キ ャ プ チ ャ メ モ リ 状 況 や gCat は 版 の 検 証 に 非 常 に 役 に 立 ち ま す 。 ま た 、 画 面 キ ャ プ チ ャ は 工 ビ デ ン ス と し て 残 し た り 不 具 合 を 報 告 す る 際 に 便 利 で す 注 12 な お 、 設 定 を 変 更 で き る と い っ て も 設 定 ア プ リ を 直 接 利 用 で き る わ け で は あ り ま せ ん 。 設 定 を 変 更 し た い 場 合 は 、 左 側 の メ ニ ュ ー の 歯 車 ア イ コ ン か ら 「 Device Settings 」 を 表 示 し て 行 い ま す 。 GPS を 擬 似 的 に 設 定 し た り 、 機 内 モ ー ド に し た り 、 Google ア カ ウ ン ト を 設 定 し た り で き ま す 。 Google ア カ ウ ン ト を 設 定 し て お け ば Google Play か ら ア プ リ を ダ ウ ン ロ ー ド す る こ と も 可 能 で す 。 イ ブ ラ リ ・ Appium モ バ イ ル を 対 象 と し た オ ー プ ン ソ ー ス の テ ス ト 自 動 化 フ レ ー ム ワ ー ク 。 Scirocco Cloud で は 」 ava 向 け の A 曰 を サ ホ ー ト し て い る ・ Scirocco Driver Scirocco Recorder を 活 用 す る 際 に 使 用 す る ラ イ ブ ラ リ 本 章 で は UI の テ ス ト 自 動 化 を ま っ た く 実 施 し て い な い 場 合 や テ ス ト コ ー ド 実 装 コ ス ト を か け た く な い 場 合 な ど に お 勧 め な 、 Scirocco Recorder を 利 用 し て Scirocco Driver の テ ス ト ク ラ ス を 作 成 す る 方 法 を 紹 介 し ま す 。 自 動 テ ス ト の た め の テ ス ト ク ラ ス を 作 成 す る Scirocco Recorder を 利 用 し て テ ス ト ク ラ ス を 生 成 す る 次 に 自 動 テ ス ト の た め の 設 定 を 行 っ て い き ま し よ う 。 Scirocco Recorder と Scirocco l)river と い う Scirocco CI 。 ud 上 で 完 結 す る テ ス ト 手 法 を 紹 介 し ま す 。 Scirocco Recorder と は 、 フ 。 ラ ウ ザ 上 で の 端 末 の 動 作 を ア ク シ ョ ン ご と に 保 存 し 、 SciroccoDriver 向 け の テ ス ト ク ラ ス を 作 成 し て く れ る ツ ー ル で す 。 コ ー ド を 書 く 必 要 が な く 一 度 録 画 し て し ま え ば 使 い 回 し が 可 能 な た め 、 テ ス ト ク ラ ス 生 成 の た め の 学 習 コ ス ト を 抑 え ら れ る と い う メ リ ッ ト も あ り ま す 。 た だ し 、 指 定 の 条 件 の 場 合 に 動 作 さ せ る な ど は 不 可 能 な の で 、 そ の 場 合 は 別 の テ ス ト ラ イ プ ラ リ の 利 用 を 検 討 す べ き で す 。 な お 本 稿 執 筆 時 点 で 、 Scirocco Recorder は a 版 と し て 提 供 さ れ て い ま す 。 ◆ Scirocco Recorder で テ ス ト ク ラ ス を 生 成 す る テ ス ト ク ラ ス を 作 成 す る に は ま ず 、 先 ほ ど 解 説 し た 手 順 で APK を ア ッ プ ロ ー ド し た う え で 、 テ ス ト ク ラ ス を 作 成 し た い 端 末 を 選 択 し 、 APK を イ ン ス ト ー ル し ま す 。 次 に 、 左 側 の メ ニ ュ ー か ら 「 Test CIass 」 を 表 示 し 、 「 Create new testclass 」 を 選 択 し ま す 。 続 い て テ ス ト ク ラ ス 名 を 入 力 し 「 Sci1 ℃ cco Driver 」 を 選 択 し て 「 Submit 」 を 選 択 す る 利 用 で き る テ ス ト の 種 類 利 用 で き る 自 動 テ ス ト は 次 の 4 つ が あ り ま す 。 ・ Native Driver And 「 oid の ネ イ テ ィ プ ア プ リ を テ ス ト す る た め の ラ イ ブ ラ リ ・ Android Driver Android 標 準 の Web レ ン ダ リ ン グ エ ン ジ ン で Web サ イ ト や Web ア プ リ を テ ス ト す る た め の ラ 注 1 2 ス ク リ ー ン シ ョ ッ ト は キ ャ プ チ ャ か ら 3 日 間 有 効 で す 。 マ 図 2 ブ ラ ウ ザ 上 で 端 末 を 操 作 す る 0 59E vut 内 「 日 れ 叩 」 第 “ 物 第 “ 0 を 230 ・ ・ 02 : $ 住 電 ロ 0 pa は a•9e は 0 第 “ を 市 0 は 、 0 叩 p ” ele あ 0 0 れ 一 日 00 ・ 苅 豊 豊 豊 第 Dfep ー 第 ! 0 ) 協 新 0 国 0 ル 、 ス ト ア 0 メ ニ ー 24 ・ Ⅳ 第 B + DB P 第 55 0L88

WEB+DB PRESS Vol.88


シ リ ー ズ 全 50 冊 突 破 い こ れ か ら は し め る デ ー タ - フ ロ ン ト ン ト サ ー バ / ン Amazon 衂 最 、 設 計 HTML5/CSS Web Services 」 a % Sc 加 い ・ ・ の 鄧 巉 ス , キ リ ・ 第 一 詳 解 R s 4 ー SQ レ 名 ! ” 講 座 レ イ ヤ 鋼 比 を . ・ ・ の を 石 . ・ 第 響 ・ の ・ ・ 化 第 上 ・ 一 0 ハ - ツ ・ ン ・ デ サ イ ン … テ ス ト 駆 動 イ ン フ ラ & テ ス ト 最 前 線 MYS 乢 実 践 t' 修 C• も た も す り ツ ラ 0- の 鋼 ・ C0fteeScrip! m 曲 加 c 加 速 習 H40 ! em 置 ・ 一 の 第 ・ を 第 る を い ・ て サ - バ に よ る ・ ・ の 置 ・ Sass/C0(llQÆ*a- M 側 叩 DB 鼎 ,. )( メ ン テ ナ ン ス Redshitt 月 ー 物 ー 加 熊 曲 ー - 化 安 金 車 な W 曲 サ イ ト の 作 り 方 “ は し め て の 0 で 第 量 な 仮 第 増 第 デ ー タ ベ ー ス 砂 望 を れ Webt— 高 速 Web 開 発 シ ス テ t ニ コ - 勲 点 … H 血 → … N0de.js ~ 、 イ ベ ン ト 駆 動 プ ロ グ ラ ミ ン グ .Zp 冫 柔 2 ア ジ メ ン ト ー ー 淞 介 M モ タ ン ? 2 ? 地 に 分 野 別 業 2 る 、 . ラ イ ブ ド ア 大 規 模 シ ス テ ム 設 の 継 続 的 な 開 発 を 、 案 書 作 成 ー ー ー ー ー ー ス ト ー 画 一 第 上 ~ つ の 一 - m / / Ema … ・ リ ー ン ス タ ー ト ア ッ プ ロ ク 活 用 と く ソ 4 イ “ 物 第 興 ⅸ ー ル ー ロ ジ カ ル シ ン キ ン グ 実 人 月 “ ロ 仙 x の 基 礎 知 識 こ れ 0 ・ の 第 上 う ャ パ イ プ す ・ ・ JUnit Emacs GitHub CakePHP2 実 践 入 門 歳 底 コ — デ ィ ン グ の 基 礎 知 物 第 ・ 、 ・ 立 つ 一 ・ を を に ら 朝 、 は じ め て の 設 計 置 を 、 ・ い ・ 一 ・ ・ ・ す い コ - 杯 ・ 、 を 物 第 テ — タ ベ ー 報 に “ 梦 時 代 イ と 之 知 識 コ ー 】 こ ケ - こ ン 物 の 基 礎 知 識 Ⅱ シ ス - ム 開 発 ” に い 一 歩 1 つ の サ ン プ ル プ 0 グ ラ ム を 通 し て し つ か り 学 ぶ 蔵 底 , 第 底 降 底 降 ノ ン プ 0 グ ラ マ の た め の ツ ン 第 を マ - ・ ・ ・ な ハ , 2 ー ン 第 ツ X 第 物 た つ な 90 行 の コ ー ド に 基 本 を 第 一 止 め ら れ な い サ ー ビ ス の た め に 今 、 何 が で き る の か コ ー ド を 簡 潔 に 保 ち 、 開 発 効 率 を 極 限 ま で 高 め る コ ま ニ テ ィ 主 要 メ ン 、 一 が 最 を 1 線 の ノ ウ ハ ウ を 望 歴 史 あ る エ テ ィ ア の 機 能 を 最 大 限 に 引 き 出 す な せ 最 高 の エ ン ジ ニ ア に 0 さ れ 係 け る の か テ ス ト の 自 動 化 が 導 く 動 作 す る き れ い な コ ー ド 内 部 品 質 を 高 め . 継 的 な 開 発 を 支 え る 良 い コ ー ド を 迅 速 に 生 み 出 す 快 適 な 共 同 開 発 季 を 動 を し て 身 に 付 け 実 用 的 な ワ - ク フ 0 ー Mobage Google ク ラ ウ ド 日 本 語 入 力 コ ー ン グ オ ン ラ イ ン ト ム を 支 え る 技 術 を 支 え る 技 術 を 支 え る 技 術 を 支 え る 技 術 を 支 え る 技 術 を 支 え る 技 術 何 力 も の コ ン ヒ ュ ー ア を と の よ う に 動 か す か 人 を 、 を - 物 る 第 無 数 の 同 時 接 続 ミ リ 秒 の レ イ テ ン シ い か に し て 立 さ せ 翻 ) か い か に 定 ・ 連 Ⅲ ご れ て い る り か ” な せ 言 語 設 計 者 は こ の 文 法 を 作 っ た の か 膨 大 な 変 換 補 の 中 い ら い : 最 適 解 を 導 く い ト ッ プ ラ ン ナ ー か 見 据 え る : 第 本 」 と は 何 た ろ う ? ( “ ie の し て 既 : と は . の 第 一 ン ) の を 取 り で す SQ 低 正 規 現 書 き 方 ド リ ル 書 き 方 ド リ ル 材 山 鋼 ・ 0 、 ハ 「 物 を 出 お を げ ( 解 設 イ ン フ ラ iWeb フ 物 セ ッ サ デ ザ イ ン パ タ ー ン を 支 え る 技 術 を 支 え る 技 術 言 諸 に 道 の 知 第 を 身 に 付 け る す う 一 ・ な 、 一 つ に な る 「 反 復 学 習 ソ フ ト ] 付 き 「 反 復 学 習 ソ フ ト ] 付 き パ タ ー ン を 組 み 合 わ せ 、 最 適 な シ ス テ ム を 実 現 す る 数 0 プ ” ジ 、 外 の 実 績 に づ い 舛 ハ ウ 実 践 的 な 、 い ト サ ー ヒ ス の 設 計 指 針 ー 1 ′ 、 ” を 置 ・ - 物 ま っ - ト : 00 万 倍 し ) 性 能 向 I•. は : 、 ・ : ・ い カ 、 に 実 現 さ れ ) か ? ヾ 書 発 ~ 子 評 電 好 1 、 を し 「 ( を の ま 無 ・ フ ロ 物 ッ ラ の 第 員 当 純 第 . な ぜ Web は こ ん な に も 成 功 し た の か コ ン ヒ ュ ー タ 良 い コ ー ド 文 字 コ ー ド ア ー キ テ ク チ ャ を 書 く 技 術 技 術 入 門 技 術 入 門 フ ロ ク ラ マ の た め の シ ェ ル ス ク リ プ ト 基 本 リ フ ァ レ ン ス ト 、 ト て , こ こ 一 で て き る 基 本 を 組 み 合 わ せ て 作 れ る 、 シ ン プ ル 効 果 抜 群 の ツ ー ル 普 通 の フ ロ ク ラ マ の た め の ス テ ッ プ ア ッ ブ ガ イ ド 150 億 倍 の 速 度 向 上 、 2 兆 倍 の 省 エ ネ 。 ー - い に さ れ て い ・ : か ? い 瀛 : od 卩 ト 豊 ン ) 兮 文 字 亠 - ド の 原 文 字 化 け の メ カ ニ 、 コ ー ド 換 の Li れ 0 ト ・ 一 h WEB 、 DB PRESS が us 特 設 サ イ ト 0 http://wdpress.gihyo.jp/plus 小 さ な ス マ ー ト フ ・ ン か ら 全 タ イ ト ル は こ ち ら で チ ェ ッ ク !

WEB+DB PRESS Vol.88


田 団 + DB PRtSS S E R V ー C E freee 、 新 サ ー ビ ス 「 会 社 設 立 freee 」 を リ リ ー ス 2015 年 6 月 23 日 、 ク ラ ウ ド 会 計 ソ S E R V ー C E http://www.freee.c 吶 p/ freee に 存 在 す る た め 、 PC ・ ス マ ー ト フ ォ ン ・ ま た 、 テ ー タ は す べ て ク ラ ウ ト 上 業 を 完 了 さ せ ら れ る と い う 。 Q & A 形 式 で 入 力 し て い く た け で 作 化 し 、 サ イ ト 上 で 必 要 な 情 報 を あ っ た 会 社 設 立 の 書 類 作 成 を 省 力 こ れ ま で 煩 雑 な 手 続 き が 必 要 で と が で き る と い う も の 。 の 開 設 な ど も ワ ン ス ト ッ プ で 行 う こ で き 、 会 社 実 印 の 作 成 や 銀 行 口 座 な 書 類 を オ ン ラ イ ン 上 で 作 成 ・ 出 力 同 サ ー ビ ス は 、 会 社 設 立 に 必 要 ス 「 会 社 設 立 freee 」 を リ リ ス し た 。 べ て 出 力 で き る こ と を 謳 う 新 サ ー ビ 会 社 設 立 に 必 要 な 書 類 を 5 分 で す フ ト 「 freee 」 を 運 営 す る freee 株 は 、 タ ブ レ ッ ト な ど の 端 末 の 種 類 を 問 わ す 入 力 内 容 を 確 認 で き る こ と も 特 徴 。 基 本 的 な 会 社 設 立 手 続 き に 関 し て は 無 料 で 利 用 で き 、 決 算 広 告 を 支 援 す る 「 freee 電 子 公 告 」 、 企 業 の 定 款 手 続 き を 支 援 す る 「 電 子 定 款 サ ポ ー ト 」 な と 部 の サ ー ビ ス の み 有 料 で の 提 供 と な っ て い る 。 ・ 詳 し く は こ ち ら http://www.freee.co.jp/news/ unch -4184. ht ・ 会 社 設 立 freee http://www.freee.co.jp/launch/ AWS の 新 サ ー ビ ス 、 AWS Device Farm が リ リ ー ス 2015 年 7 月 13 日 、 Amazon Web Services ( 以 下 AWS) の 新 た な サ ー ビ ス 「 AWS Device Farm 」 が 発 表 さ れ た 。 同 サ ー ビ ス は Android と Fire OS の ア プ リ を AWS の ク ラ ウ ト 上 で テ ス ト で き る と い う も の 。 ア プ リ を ア ッ プ ロ ー ド し 、 テ ス ト を 実 施 し た い テ パ イ ス を 選 択 す る た け で テ ス ト を 開 始 で き 、 完 了 と 同 時 に レ ポ ー ト を 取 得 で き る こ と が 特 徴 。 今 後 は Jenk ⅲ s の プ ラ ク イ ン を は じ め と す る 各 種 CI ( 朝 〃 朝 加 靨 g 川 の ツ ー ル と 連 携 す る た め の し く み も 提 供 し て い く 予 定 と の こ と 。 利 用 に 際 し て は 「 あ る テ パ イ ス 上 Amazon Web Services http://aws.amazon.com/ 6 ・ Ⅳ ー 8 + DB P 55 Vo 88 で 一 つ の テ ス ト を 実 行 し た 時 間 」 ご と の 課 金 と な り 、 価 格 は 1 分 あ た り 0.17 ド ル と な っ て い る 。 な お 、 AWS Device Farm に つ い て は 今 号 特 集 1 の コ ラ ム ( p. (1) で も 解 説 さ れ て い る の で 、 そ ち ら も 参 ・ 詳 し く は こ ち ら 照 の こ と 。 farm/ http://aws.amazon.com/jp/device- ・ AWS Device Farm html test-mobile-apps-on-real-devices. japan/2 0 1 5/0 7/aws-device-farm- http://aws.typepad.com/aws S E R V ー C E Heroku 、 Goog 厄 App Engine が Go を 正 式 に サ ポ ー ト Heroku, lnc. は 2015 年 7 月 7 日 、 Goog 厄 http://www.g00g厄.com/ Heroku https://www.heroku.com/ for-Go-is-GeneralIy-AvailabIe. html blogspot. jp/201 5/07/App-Engine- http://googlecloudplatform. ・ G00 創 e App Engine の Go サ ホー ト now official on heroku archives/2 0 1 5/7/7/go_support_ h t t p s : / / b IO g . h e r 〇 k u . c o m / ・ Heroku の Go サ ホー ト て い る 。 ー ジ ョ ン 1.5 へ の 対 応 に 意 欲 を 示 し リ リ ー ス 間 近 と な っ て い る G 。 の 新 バ 両 サ ー ビ ス と も 、 2015 年 7 月 現 在 い る 。 式 な も の と す る こ と が 発 表 さ れ て の 提 供 で あ っ た G 。 の サ ポ ー ト を 正 お い て も 、 こ れ ま で べ ー タ 版 と し て ス で あ る 「 Google App Engine 」 に が 提 供 す る PaaS 型 ク ラ ウ ド サ ー ビ ま た 、 続 く 7 月 10 日 に は 、 Google う に な る 。 環 境 と 機 能 を 最 大 限 活 用 で き る よ の 計 測 な ム Her 。 ku に 用 意 さ れ た Git リ ポ ジ ト リ と の 連 携 や メ ト リ ク ス た が 、 今 回 の 公 式 サ ポ ー ト に よ り 利 用 そ の も の は 可 能 な 状 況 で あ っ buildpack と 呼 は れ る し く み に よ り Go に つ い て は 、 こ れ ま で も 言 語 を 公 式 に サ ポ ー ト し て い る 。 や Node.js 、 Java 、 PHP と い っ た 各 種 的 な サ ー ビ ス の 一 つ 。 す で に Ruby ビ ス と し て 提 供 す る PaaS と し て 代 表 ム の プ ラ ッ ト フ ォ ー ム を ク ラ ウ ド サ ー Heroku は ミ ド ル ウ ェ ア な ど の シ ス テ と を 発 表 し た 。 語 と し て 、 新 た に G 。 を 追 加 す る こ 「 Heroku 」 が 公 式 に サ ポ ー ト す る 言 4 立 耀 な の 型 ク ラ ウ ド サ ー ビ ス 同 社 の 運 営 す る PaaS ( 刊 。 tfo

WEB+DB PRESS Vol.88


( プ 0 ア ← 工 ア ・ 最 前 線 流 行 に 踊 ら さ れ な い 技 術 動 向 以 降 に 追 加 さ れ た い く つ か の プ ロ バ テ ィ は 、 画 像 を 使 わ な い 表 現 の 幅 を 広 げ て く れ た 代 わ り に 、 レ ン ダ リ ン グ コ ス ト が 高 め な も の も あ り ま す 。 ど の よ う な プ ロ バ テ ィ が 該 当 す る の か に つ い て は 後 半 の 「 レ ン ダ リ ン グ 負 荷 の 高 い CSS 」 で 紹 介 し ま す 。 ■ レ イ ア ウ ト 算 出 各 要 素 に 割 り 当 て ら れ た ス タ イ ル 情 報 を も と に 、 そ れ ぞ れ の 要 素 が ど の よ う な 位 置 関 係 で 配 置 さ れ る の か を 決 定 す る の が レ イ ア ウ ト の 算 出 処 理 で す 。 こ れ が 行 わ れ な い と 、 要 素 が ど ん な 位 置 に ど ん な 大 き さ で 配 置 さ れ て い る の か は わ か り ま せ ん 。 JavaScript か ら Element#getBoundingCIientRect() く け い を 実 行 し て 要 素 の 矩 形 情 報 を 取 得 し た り 、 offsetT 叩 や offsetWidth な ど の プ ロ バ テ ィ を 参 照 し た り す る こ と は 頻 繁 に あ り ま す 。 こ れ ら も レ イ ア ウ ト の 算 出 処 理 に よ っ て 得 ら れ た 値 を 取 得 す る た め の API で す 。 JavaScript の 書 き 方 に よ っ て は ス ク リ プ ト 処 理 が レ イ ア ウ ト 算 出 に 大 き い 負 荷 を 与 え て し ま う ケ ー ス も あ り 、 最 近 の Web サ イ ト で よ く 見 ら れ る 問 題 の 一 つ で す 。 れ ら の 間 題 に つ い て は 後 半 の 「 レ イ ア ウ ト 算 出 の 頻 発 に よ る 低 速 化 」 で 詳 し い 現 象 の 説 明 と 対 策 を 紹 介 し ま す 。 ■ ペ イ ン ト 処 理 こ れ ま で の 処 理 で 「 何 の 要 素 を ど の よ う な 見 た 目 で 、 ど こ に 配 置 す れ ば よ い か 」 が 決 ま っ た の で 、 い よ い よ デ イ ス プ レ イ に 表 示 す る た め の 描 画 命 令 を 発 行 し ま す 。 画 像 や 文 字 情 報 は も ち ろ ん 、 要 素 に 割 り 当 て ら れ た ポ ー ダ ー や 影 な ど も 描 画 さ れ ま す 。 マ 図 1 ド ロ ワ ー の 起 動 ボ タ ン と ド ロ ワ ー Chrome DeveIoper T00 を 使 っ た レ ン ダ リ ン グ の 調 査 Google Chrome に 搭 載 さ れ て い る Chrome DeveIoper T001S を 使 う と 、 こ ま で 紹 介 し た レ ン ダ リ ン グ 処 理 に つ い て 詳 細 な 情 報 を 得 る こ と が で き ま す の で 試 し て み て く だ さ い 。 特 に 凝 っ た 動 き を す る web ペ ー ジ で 試 し て み る と 、 得 ら れ る 情 報 量 が 多 い の で 参 考 に な る で し よ う 。 Chrome Devel 叩 er T001S は 、 Chrome を 起 動 し て い る ウ イ ン ド ウ で 、 Windows や Linux で あ れ ば 区ま心 + 〔 新 嘘 〕 + ① 、 osx で あ れ ば 区 祠 〕 + 〔 0 〕 + ① の シ ョ ー ト カ ッ ト で 起 動 で き ま す 。 今 回 は 原 稿 執 筆 時 点 ( 2015 年 7 月 ) の 安 定 バ ー ジ ョ ン で あ る バ ー ジ ョ ン 44 を も と に 紹 介 し て い ま す 。 レ ン ダ リ ン グ の 負 荷 を 調 べ る 前 節 で 紹 介 し た と お り 、 UI の ス ム ー ズ さ を 決 め る う え で FPS は 重 要 な 指 標 で す 。 Chrome Devel 叩 er T001S で は FPS は も ち ろ ん 、 ど の 領 域 に ペ イ ン ト 処 理 が 行 わ れ た か 、 今 の 画 面 が ど れ く ら い レ ン ダ リ ン グ に と っ て 負 荷 の か か る 表 示 な の か を 調 べ る こ と が で き ま す 。 Chrome Developer T001S を 起 動 し て 〔 0 キ ー を 押 す か 右 上 の Showdrawer ボ タ ン ( 図 1 右 上 ) を 押 す と 、 ド ロ ワ ー が 開 き ま す 。 本 節 で 紹 介 す る 機 能 は 、 こ の ド ロ ワ ー の Rendering タ フ 。 に 入 っ て い ま す 。 ■ FPS の 表 示 FPS は 「 ShowFPSmeter 」 ( 図 1 ② ) と い う 項 目 に チ ェ ッ ク を 付 け る と Web ペ ー ジ の 右 上 に 表 示 さ れ ま す ( 図 2 ) 。 メ ー タ ー 表 示 内 の 左 上 に 表 示 さ れ て い る 数 字 は 直 近 の FPS で 、 右 上 の 5-60 の よ う な 数 字 は 時 間 内 の FPS の 最 小 値 と 最 大 値 で す 。 図 2 の 場 合 、 グ ラ フ 内 の ど こ か で 5FPS の 瞬 間 が あ っ た と い う こ と に な り ま す 。 ほ か に GPU ラ ス タ ラ イ ズ の 状 態 と GPU メ モ リ の 使 用 量 に つ い て の 表 示 も あ り ま す が 、 今 回 は 説 し ま せ ん 。 4 Show drawer D を elO 「 TOOIS ー http://example.com/ 」 ~ - 、 。 。 。 上 Elem を れ Network 50 い ( を 5 Titn を れ p 「 Ofil R ou に を 5 A リ d は 5 ( 0n50 に ル - ) ー 、 ! 00U 「 ′ P [ htm*x» Sty 厄 、 Computed Event 凵 5 n 部 5 渉 = 01 部 lent. st yte { <head>—</head> V<body style> 《 / b0dY> ー g width: 6øøpx; </html> ま margin: S5em auto; padd ing : 5Øpx : -0- ト ( を 0 「 0 は 0 ハ = 01 の 「 , 」 コ fff - ・ html body FÉnd S 、 C0n50 厄 52a 「 ( h Emulation ー Renderjng ロ ShOW 0 rectangles ロ ShOW ( 0mP05 は ed ね y ぎ borders ロ Show FPS me 【 e 「 ロ Enable continuous page 0 飛 ing ロ 5h6 potential 5 ( ro ⅱ bottlenecks + ィ ① ド ロ ワ ー の Rendering タ ブ 0 ② 0 三 一 口 ■ 更 新 さ れ た ペ イ ン ト 領 域 を 確 認 す る 「 Show paint rectangles 」 ( 図 1 ① ) 130 ・ Ⅳ 第 B + DB ド ー 55 Vo 88

WEB+DB PRESS Vol.88


LINE の ス ト レ ー ジ Redis と HBase で 1 日 100 億 以 上 の メ ッ セ ー ジ を 安 定 的 に + ば く 第 4 章 上 で ソ ー ト し て 格 納 さ れ 、 量 が 一 定 以 上 た ま る と バ ッ ク グ ラ ウ ン ド で HFile と い う HBase 独 自 の フ ァ イ ル フ ォ ー マ ッ ト で HDFS 上 に 書 き 出 し ( FIush ) 、 HFile の 数 が た ま っ た ら 複 数 フ ァ イ ル を マ ー ジ ソ ー ト し て 量 を Sharded Redis の 導 入 に よ っ て あ る 程 度 の ス ケ ー ラ ビ リ テ ィ を 確 保 し ま し た が 、 こ れ だ け で は デ ー タ の 減 ら す こ と で 読 み 出 し を 最 適 化 し ま す (Compaction)0 永 続 性 や 可 用 性 を 確 保 す る う え で 不 十 分 だ っ た た め 、 HBase の ユ ー ス ケ ー ス HBase を 導 入 し ま し た 。 LINE で は 揮 発 デ ー タ や 参 照 頻 度 の 高 い デ ー タ を HBase は Hadoop 工 コ シ ス テ ム の 一 つ と し て Google Bigtable 注 4 を 参 考 に 作 ら れ た マ ス タ / ワ ー カ 型 の 分 散 Redis に 置 い て 、 永 続 デ ー タ を HBase に 置 き ま す 。 デ ー タ ス ト ア で す ( 図 5 ) 。 ス ト レ ー ジ の 内 部 構 造 に メ ッ セ ー ジ の 場 合 、 Talk-server は Redis に 数 日 分 の M 木 注 5 を 使 用 し て お り 、 デ ィ ス ク へ の 同 期 的 な ラ 未 読 メ ッ セ ー ジ の み を 格 納 し ま す 。 一 方 、 HBase に は 保 ン ダ ム ア ク セ ス が 発 生 し な い 、 速 い 書 き 込 み が 特 徴 で 存 有 効 期 間 は 保 持 し ま す 。 つ ま り 、 HBase に は Redis か ら 削 除 さ れ た メ ッ セ ー ジ に 対 す る 参 照 の み が 発 生 し ま す 。 す 。 デ ー タ は HDFS 上 に 冗 長 的 に 格 納 さ れ ま す 。 ュ ー ザ 情 報 や ソ ー シ ャ ル グ ラ フ デ ー タ の 場 合 、 主 HBase の マ ス タ で あ る Master は 、 ZooKeeper 上 に あ る ク ラ ス タ の メ タ 情 報 を 管 理 し ま す 。 HBase の ワ ー カ で あ る RegionServer は 、 複 数 の Region(Shard) を 管 理 マ 図 4 Redis の ク ラ ス タ 管 理 ツ ー ル RedHand し ま す 。 RegionServer は 、 KeyValue( レ コ ー ド ) を HLog ( ト ラ ン ザ ク シ ョ ン ロ グ ) に 追 記 し て メ モ リ 上 の Mem Store(?R' ッ フ ァ ) に 書 き ま す 。 KeyValue は MemStore HB ョ 5 日 に よ る ス ケ ー ラ プ ル な メ ッ セ ー ン り 注 4 http:〃research.google.com/archive/bigtable.html 注 5 http•//www.cs.umb.edu/¯poneil/lsmtree.pdf マ 図 5 HBase の ア ー キ テ ク チ ャ ク ラ ス タ メ タ 情 報 を 格 納 ZooKeeper HBase ク ラ イ ア ン ト Master ア ド ミ ン 操 作 ( Region 移 動 や 手 動 Compaction) メ タ 情 報 変 更 時 に 問 い 合 わ せ RegionServer Region Store 複 数 の HFi 厄 を マ ー ジ ソ ー ト ↓ Compaction Compacted HFiles 共 有 ロ グ に デ ー タ を 追 記 H Log 複 数 Region で HLog を 共 有 50 rted set MemStore Flush HFile HBase HFile H DFS ク ラ イ ア ン ト ロ ロ ロ ロ ロ ロ ロ ロ ロ ロ ロ ロ ロ ロ ロ ロ HDFS 複 製 複 製 DataNode Ⅳ ー B 十 08 P ー 55 MOL88 ・ 59

WEB+DB PRESS Vol.88


Web サ ー ビ ス に お け る ス ケ ー ル の 歴 史 デ ー タ 特 性 、 利 用 技 術 、 代 表 的 サ ー に ス 第 1 章 Ⅱ Ⅱ NoSQL と ク ラ ウ ド サ ー ビ ス の 活 用 ア ド テ ク の 勃 興 ス マ ー ト フ ォ ン と 同 時 期 に 出 て き た の が ア ド テ ク MySQL な ど の RDBMS が 性 能 と 引 き 換 え に 高 い 一 で す 〇 広 告 枠 を 最 大 限 活 用 し 、 そ こ か ら の 売 り 上 げ 貫 性 を 保 持 す る 一 方 で 、 NoSQL と 呼 ば れ る デ ー タ ベ ー ス で は ト ラ ン ザ ク シ ョ ン 機 能 の 制 限 や 一 貫 性 の 保 を 増 や そ う と 考 え る メ デ ィ ア 側 と 、 安 く 広 告 を 出 稿 し 高 い 効 果 を あ げ た い 広 告 主 、 両 者 の 要 求 を テ ク ノ 正 を 緩 め る こ と で 、 高 い 性 能 と ス ケ ー ラ ビ リ テ ィ を ロ ジ 、 エ ン ジ ニ ア リ ン グ の カ で 解 決 し て い く の が ア 発 揮 し ま す 。 代 表 的 な NoSQL サ ー バ と し て は 、 リ ス ト や ラ ン キ ン グ な ど の デ ー タ 構 造 を サ ポ ー ト し 、 そ ド テ ク で す 。 た と え ば RTB 訳 / - 行 〃 尾 召 市 〃 g ) と 言 わ れ る 広 告 れ ら を メ モ リ 上 で 保 持 す る こ と で 高 速 に 動 作 す る Redis 、 ス キ ー マ レ ス で 柔 軟 な デ ー タ 入 出 力 が 可 能 な の 方 式 で は 、 広 告 の 表 示 の た び に 競 争 入 札 を 行 い 、 MongoDB 、 分 散 シ ス テ ム 上 で 大 規 模 な デ ー タ を 取 最 も 高 く 入 札 を し た 広 告 を 配 信 し ま す 。 広 告 枠 の 競 争 入 札 を 行 う こ と で 、 メ デ ィ ア は 売 り 上 げ を 最 大 限 り 扱 え る よ う 設 計 さ れ た Apache Cassandra な ど が あ に し 、 広 告 出 稿 側 は 適 切 な タ イ ミ ン グ で 、 必 要 な 量 り ま す 。 増 え 続 け る デ ー タ 、 い わ ゆ る ビ ッ ク デ ー タ を 解 析 の 広 告 を 表 示 で き ま す 。 RTB を 活 用 し た 広 告 は 複 数 の 企 業 が 絡 み 、 複 雑 な す る た め に は 、 Hado 叩 な ど の 解 析 基 盤 を 利 用 す る こ と に な り ま す が 、 大 規 模 な 分 散 デ ー タ ス ト ア と 処 し く み に な っ て い ま す 。 し か し 、 Web サ イ ト 上 の 広 告 で あ る 以 上 、 Web サ イ ト の 表 示 速 度 へ の 影 響 を 最 理 基 盤 を 構 築 運 用 す る の に は 多 く の 知 識 と 経 験 が 必 小 限 に と ど め な け れ ば な ら ず 、 短 時 間 の う ち に す べ 要 と な り 、 サ ー バ の コ ス ト も 膨 大 に な り ま す 。 今 で て の 処 理 を 行 っ て 閲 覧 者 に 広 告 を 表 示 し な け れ ば な は よ ほ ど 大 き な 企 業 で な い 限 り 、 自 前 で 解 析 基 盤 を り ま せ ん 。 RTB に よ る 広 告 買 い 付 け を 行 う フ リ ー ク 構 築 す る の で は な く 、 ク ラ ウ ド サ ー ビ ス を 利 用 す る ア ウ ト で は 「 50msorDie 」 を 掲 ( 戸 21 、 高 速 な レ ス ポ ン の が 一 般 的 で す 。 ビ ッ ク デ ー タ の 処 理 を 行 う ク ラ ウ ス を 可 能 と す る シ ス テ ム を 構 築 し て い ま す 。 ド サ ー ビ ス と し て は 、 Amazon の Redshift 、 GoogIe の BigQuery 、 Treasure Data の サ ー ビ ス な ど が 有 名 ロ グ デ ー タ の 重 要 性 の 増 加 で す 。 ス マ ー ト フ ォ ン ア プ リ で は UI ハ Ⅸ の 改 善 を 目 的 と こ の よ う に ス マ ー ト フ ォ ン / ア ド テ ク 期 で は 、 デ し て 、 ま た ア ド テ ク で は 適 切 な 広 告 を 表 示 す る こ と ー タ ベ ー ス と し て い わ ゆ る RDBMS の み を 使 用 す る を 目 的 と し て 、 ア ク セ ス ロ グ や 行 動 ロ グ な ど さ ま ざ 形 で は な く な り ま し た 。 デ ー タ の 格 納 や 活 用 方 法 に ま な ロ グ デ ー タ が 収 集 さ れ て い ま す 。 大 量 の ロ グ は 応 じ て 、 NoSQL や ク ラ ウ ド の デ ー タ 分 析 サ ー ビ ス を 統 計 処 理 に か け て 、 AB テ ス ト の 結 果 判 定 に 用 い て ユ 組 み 合 わ せ 高 い パ フ ォ ー マ ン ス と ス ケ ー ラ ビ リ テ ィ ー ザ 体 験 の 向 上 に 役 立 て た り 、 機 械 学 習 や レ コ メ ン を 発 揮 す る シ ス テ ム を 構 築 し 、 Web サ ー ビ ス / ア プ デ ー シ ョ ン エ ン ジ ン の 精 度 向 上 た め に 利 用 さ れ て い リ ケ ー シ ョ ン の 爆 発 的 な 成 長 を 支 え て い ま す 。 ま す 。 ク ラ ウ ド に よ る ス マ ー ト フ ォ ン ア ド テ ク 期 の サ ー バ ア ー キ テ ク チ ャ 高 度 な UI/UX を 備 え た ス マ ー ト フ ォ ン の ネ イ テ ィ フ 。 ア プ リ ケ ー シ ョ ン が 普 及 し た こ と と ア ド テ ク の 利 ス マ ー ト フ ォ ン / ア ド テ ク 期 の サ ー バ / イ ン フ ラ 用 が 広 が っ た こ と で 、 デ ー タ ベ ー ス に は こ れ ま で 以 で は 、 ク ラ ウ ド の 利 用 が 当 然 と な っ て い ま す 。 上 に 低 い レ イ テ ン シ と 、 爆 発 的 に 増 え る デ ー タ に 対 Amazon や Google な ど の 巨 大 な コ ン ヒ 。 ュ ー テ ィ ン グ 応 す る ス ケ ー ラ ビ リ テ ィ が 求 め ら れ る よ う に な っ て リ ソ ー ス を 抱 え る ク ラ ウ ド で は 、 小 規 模 な 仮 想 サ ー い ま す 。 こ の 中 で 利 用 が 広 が っ た の が NoSQL と ビ ッ バ ( イ ン ス タ ン ス ) か ら 物 理 サ ー バ を も 凌 駕 す る よ う な 高 い 性 能 を 発 揮 す る イ ン ス タ ン ス ま で 、 さ ま ざ ま ク デ ー タ を 処 理 す る ク ラ ウ ド サ ー ビ ス で す 。 な リ ソ ー ス が 利 用 で き る よ う に な っ て い ま す 。 表 2 に AmazonEC2 で テ ー タ ベ ー ス サ ー バ に 用 い ら れ る こ と が 多 い r3 イ ン ス タ ン ス の CPU コ ア 数 と メ モ リ サ 二 一 一 口 注 21 http://www.sIideshare.net/myfinder/50msperI Ⅳ 第 B + 08 P を 55 MOL88 ・ 77