• 検索結果がありません。

key

N/A
N/A
Protected

Academic year: 2021

シェア "key"

Copied!
107
0
0

読み込み中.... (全文を見る)

全文

(1)

最適化計算エンジンを備えた

Ruby on Rails アプリケーションの

アーキテクチャーと進化

Masaki Takeuchi ! 2013-12-17 Rubyアソシエーションセミナー Rubyの技術を語る1日 in 品川

(2)

竹内 真樹

@m4i

ウィンワークス株式会社

Chief Scientist

(3)
(4)

WINWORKS One の紹介

Ruby on Rails 4.0 へのアップグレード

(5)

オークラ
 フロンティアホテルつくば様 ローラアシュレイ
 ジャパン様 総就業時間
 13.3%削減 接客効率
10%向上

WINWORKS Oneは、サービス業の現場で

勤務効率を上げるために利用されている

(6)

業務量とリソース モチベー ション コンプライ アンス 売上向上 コスト削減 業務量変動 勤務人員 接客時間の増加 x 適正な! スキルの配置 業務量 スタッフ 変動する業務量

業務量の変動に合わせてスタッフの勤務を最適化

することで、オペレーション上の様々な制約を満

たしつつ、パフォーマンスの最大化を図る

(7)

Webアプリケーションと、整数計画法を適用した!

シフト編成計算エンジンの組み合わせにより稼働

WINWORKS One

Mrs.RIC

携帯から希望 勤務を申請 携帯へ シフト表 を配信 • スタッフの勤務可能時間の範囲で勤務を割当て • 余剰の時間帯と不足時間帯を同時に削減 整数計画法の適用 最適シフト 編成計算 条件を満たしつつ繁閑に合致した最適なシフト表 シフト表を Excel出力

(8)

Webアプリケーションと、整数計画法を適用した!

シフト編成計算エンジンの組み合わせにより稼働

WINWORKS One

Mrs.RIC

携帯から希望 勤務を申請 携帯へ シフト表 を配信 • スタッフの勤務可能時間の範囲で勤務を割当て • 余剰の時間帯と不足時間帯を同時に削減 整数計画法の適用 最適シフト 編成計算 条件を満たしつつ繁閑に合致した最適なシフト表 シフト表を Excel出力

日毎・時間帯の作業負荷

および必要人員数を予測

(9)

Webアプリケーションと、整数計画法を適用した!

シフト編成計算エンジンの組み合わせにより稼働

WINWORKS One

Mrs.RIC

携帯から希望 勤務を申請 携帯へ シフト表 を配信 • スタッフの勤務可能時間の範囲で勤務を割当て • 余剰の時間帯と不足時間帯を同時に削減 整数計画法の適用 最適シフト 編成計算 条件を満たしつつ繁閑に合致した最適なシフト表 シフト表を Excel出力

スタッフ属性を設定

総勤務日数・時間数

所有スキル

就業可能なシフト枠

(10)

Webアプリケーションと、整数計画法を適用した!

シフト編成計算エンジンの組み合わせにより稼働

WINWORKS One

Mrs.RIC

携帯から希望 勤務を申請 携帯へ シフト表 を配信 • スタッフの勤務可能時間の範囲で勤務を割当て • 余剰の時間帯と不足時間帯を同時に削減 整数計画法の適用 最適シフト 編成計算 条件を満たしつつ繁閑に合致した最適なシフト表 シフト表を Excel出力

カレンダー画面設定

日ごとの「業務」

メモの記述

(11)

Webアプリケーションと、整数計画法を適用した!

シフト編成計算エンジンの組み合わせにより稼働

WINWORKS One

Mrs.RIC

携帯から希望 勤務を申請 携帯へ シフト表 を配信 • スタッフの勤務可能時間の範囲で勤務を割当て • 余剰の時間帯と不足時間帯を同時に削減 整数計画法の適用 最適シフト 編成計算 条件を満たしつつ繁閑に合致した最適なシフト表 シフト表を Excel出力

勤務ルールを設定

就業規則

勤務、公休取得の公平性

働きやすさ

(12)

Webアプリケーションと、整数計画法を適用した!

シフト編成計算エンジンの組み合わせにより稼働

WINWORKS One

Mrs.RIC

携帯から希望 勤務を申請 携帯へ シフト表 を配信 • スタッフの勤務可能時間の範囲で勤務を割当て • 余剰の時間帯と不足時間帯を同時に削減 整数計画法の適用 最適シフト 編成計算 条件を満たしつつ繁閑に合致した最適なシフト表 シフト表を Excel出力

(13)

Webアプリケーションと、整数計画法を適用した!

シフト編成計算エンジンの組み合わせにより稼働

WINWORKS One

Mrs.RIC

携帯から希望 勤務を申請 携帯へ シフト表 を配信 • スタッフの勤務可能時間の範囲で勤務を割当て • 余剰の時間帯と不足時間帯を同時に削減 整数計画法の適用 最適シフト 編成計算 条件を満たしつつ繁閑に合致した最適なシフト表 シフト表を Excel出力

月別のシフト表

(14)

Webアプリケーションと、整数計画法を適用した!

シフト編成計算エンジンの組み合わせにより稼働

WINWORKS One

Mrs.RIC

携帯から希望 勤務を申請 携帯へ シフト表 を配信 • スタッフの勤務可能時間の範囲で勤務を割当て • 余剰の時間帯と不足時間帯を同時に削減 整数計画法の適用 最適シフト 編成計算 条件を満たしつつ繁閑に合致した最適なシフト表 シフト表を Excel出力

日別のシフト表

(15)

Webアプリケーションと、整数計画法を適用した!

シフト編成計算エンジンの組み合わせにより稼働

WINWORKS One

Mrs.RIC

携帯から希望 勤務を申請 携帯へ シフト表 を配信 • スタッフの勤務可能時間の範囲で勤務を割当て • 余剰の時間帯と不足時間帯を同時に削減 整数計画法の適用 最適シフト 編成計算 条件を満たしつつ繁閑に合致した最適なシフト表 シフト表を Excel出力

(16)

WEB サーバ

最適化サーバ

ブラウザで Webに アクセス 計算キュー を順次処理

WebサービスとしてのWINWORKS Oneは機能分

散構成により計算能力のスケーラビリティを実現

(17)

WINWORKS One の歴史

機能拡充マーケットニーズ

2.x

3.x

1.x

開発 開発

オンプレミス

SaaS

機能高度化・対象範囲拡大 案件大型化対応

2007年

2008年

2009年

2010年

2011年

2012年

2013年

2014年

(18)

WINWORKS One の歴史

機能拡充マーケットニーズ

2.x

3.x

1.x

開発 開発

オンプレミス

SaaS

機能高度化・対象範囲拡大 案件大型化対応

2007年

2008年

2009年

2010年

2011年

2012年

2013年

2014年

ビジネス オンプレミス => SaaS プラット フォーム Windows => Linux Ruby on Rails 採用

(19)

WINWORKS One の歴史

機能拡充マーケットニーズ

2.x

3.x

1.x

開発 開発

オンプレミス

SaaS

機能高度化・対象範囲拡大 案件大型化対応

2007年

2008年

2009年

2010年

2011年

2012年

2013年

2014年

ビジネス オンプレミス => SaaS プラット フォーム Windows => Linux Ruby on Rails 採用 ビジネス システム規模拡大 プラット フォーム Windows 廃止 ILOG => Gurobi(性能向上)

(20)

WINWORKS One を支える技術

Web

最適化

Ruby on Rails

Ruby

MySQL

nginx + Passenger

JRuby

Redis

Gurobi Optimizer

(21)

WINWORKS One の規模

Model

281 クラス

Controller

95 クラス

JavaScript

23,000 行

テスト

3,000 examples

(Coverage 90%)

最適化(JRuby)

7,000 行

(22)
(23)

Rails 4 未満のバージョンを

利用中の方?

(24)
(25)
(26)

アップグレード手順

(27)

アップグレード手順

1. rails4 branch を作成

(28)

アップグレード手順

1. rails4 branch を作成

2. Gemfile を Rails 4.0 のものに更新

(29)

アップグレード手順

1. rails4 branch を作成

2. Gemfile を Rails 4.0 のものに更新

3. rake rails:update して設定ファイルも更新

(30)

アップグレード手順

1. rails4 branch を作成

2. Gemfile を Rails 4.0 のものに更新

3. rake rails:update して設定ファイルも更新

4. とりあえず rspec => すぐにエラーで停止する

5. 停止する原因をすべて取り除く

(31)

アップグレード手順

1. rails4 branch を作成

2. Gemfile を Rails 4.0 のものに更新

3. rake rails:update して設定ファイルも更新

4. とりあえず rspec => すぐにエラーで停止する

5. 停止する原因をすべて取り除く

6. もう一度 rspec を走らせる

(32)
(33)

DEPRECATION WARNING

を出力しない

require

'

active_support/deprecation

'

!

ActiveSupport

::

Deprecation

.silenced =

true

(34)
(35)
(36)

アップグレード手順

(37)

アップグレード手順

7. DEPRECATION WARNING の出力を止める

8. 潰すエラーの狙いを定める

(38)

アップグレード手順

7. DEPRECATION WARNING の出力を止める

8. 潰すエラーの狙いを定める

(39)

アップグレード手順

7. DEPRECATION WARNING の出力を止める

8. 潰すエラーの狙いを定める

9. 修正して確認する

(40)

アップグレード手順

7. DEPRECATION WARNING の出力を止める

8. 潰すエラーの狙いを定める

9. 修正して確認する

rspec spec/controller/users_spec.rb -l 624

10.すべての test 通るまで繰り返す

(41)

アップグレード手順

7. DEPRECATION WARNING の出力を止める

8. 潰すエラーの狙いを定める

9. 修正して確認する

rspec spec/controller/users_spec.rb -l 624

10.すべての test 通るまで繰り返す

11.DEPRECATION WARNING の出力を再開する

(42)
(43)
(44)

アップグレード手順

(45)

アップグレード手順

12.すべての DEPRECATION WARNING を潰す

13.実際に画面を操作してテストする

(46)

アップグレード手順

12.すべての DEPRECATION WARNING を潰す

13.実際に画面を操作してテストする

(47)

アップグレード手順

12.すべての DEPRECATION WARNING を潰す

13.実際に画面を操作してテストする

14.RAILS_ENV=production で動かしてみる

(48)

アップグレード手順

12.すべての DEPRECATION WARNING を潰す

13.実際に画面を操作してテストする

14.RAILS_ENV=production で動かしてみる

15.テスト/ステージング環境にデプロイしてみる

16.リリース!

(49)

アップグレード作業の方針

WINWORKS

One

Rails

WINWORKS One のソースコード

3.1.0

3.2

3.1.1

3.2

3.1.x

4.0

4.0互換のコード

4.0非互換のコード

3.2/4.0 両方で

動作する修正

3.2 で

動作しない修正

Rails 4.0 対応開始

(50)

通常の branch 構成

master

branch

(51)

通常の branch 構成

master

branch

rails4

branch

Rails4.0化

(52)

通常の branch 構成

master

branch

rails4

branch

Rails4.0化

修正A

修正B

(53)

通常の branch 構成

master

branch

rails4

branch

Rails4.0化

修正A

修正B

不具合

発生

(54)

通常の branch 構成

master

branch

rails4

branch

Rails4.0化

バグ修正

修正A

修正B

不具合

発生

(55)

通常の branch 構成

master

branch

rails4

branch

Rails4.0化

バグ修正

merge

修正A

修正B

不具合

発生

(56)

通常の branch 構成

master

branch

rails4

branch

Rails4.0化

バグ修正

merge

_人人人人人人人_

> Conflict !!! <

 ̄Y^Y^Y^Y^Y^Y ̄

修正A

修正B

不具合

発生

(57)

通常の branch 構成

master

branch

rails4

branch

Rails4.0化

バグ修正

merge

_人人人人人人人_

> Conflict !!! <

 ̄Y^Y^Y^Y^Y^Y ̄

ここの長さに応じて conflict の可能性が上がる

修正A

修正B

不具合

発生

(58)

今回の branch 構成

master

branch

(59)

今回の branch 構成

master

branch

rails4

branch

Rails4.0化

(60)

今回の branch 構成

master

branch

rails4

branch

Rails4.0化

修正A

(61)

今回の branch 構成

master

branch

rails4

branch

Rails4.0化

修正A

修正A

(62)

今回の branch 構成

master

branch

rails4

branch

修正A

rebase

master

(63)

今回の branch 構成

master

branch

rails4

branch

修正B

修正A

rebase

master

(64)

今回の branch 構成

master

branch

rails4

branch

修正B

修正A

rebase

master

修正B

(65)

今回の branch 構成

master

branch

rails4

branch

修正A

修正B

rebase

master

(66)

今回の branch 構成

master

branch

rails4

branch

修正A

修正B

rebase

master

不具合

発生

(67)

今回の branch 構成

master

branch

rails4

branch

バグ修正

修正A

修正B

rebase

master

不具合

発生

(68)

今回の branch 構成

master

branch

rails4

branch

バグ修正

修正A

修正B

rebase

master

不具合

発生

(69)

今回の branch 構成

master

branch

rails4

branch

バグ修正

修正A

修正B

rebase

master

conflict の可能性を小さくできる

不具合

発生

(70)

http://blog.m4i.jp/entry/

2013/12/10/184336

(71)

rspec で検出できなかったものへの対応が

想定より多かった(10%)

rspec を完走させるために必要

8

rspec で Failure/Error

10

DEPRECATION WARNING

12

rspec で検出できなかったもの

4

機能拡張により簡単に書けるよ

うになったもの

4

合計

38

(72)

text_field, text_area の

(73)

text_field, text_area の

(74)

text_field, text_area の

(75)

原因

Rails 3.2

Rails 4.0

<%= f.text_field :name %>!

<%= f.text_area :description %>

<input size="30" type="text" id="blog_name" name="blog[name]" />!

<textarea cols="40" rows="20" id="blog_description"

name="blog[description]">

<input type="text" id="blog_name" name="blog[name]" />!

(76)

原因

# actionpack-3.2.16/lib/action_view/helpers/form_helper.rb!

!

DEFAULT_TEXT_AREA_OPTIONS = { "cols" => 40, "rows" => 20 }!

!

def to_text_area_tag(options = {})!

options = DEFAULT_TEXT_AREA_OPTIONS.merge(options.stringify_keys)

# actionpack-4.0.2/lib/action_view/helpers/tags/text_area.rb!

!

def render!

options = @options.stringify_keys

Rails 3.2

(77)

対応

module

TextAreaWithDefaultSize

!

DEFAULT_TEXT_AREA_OPTIONS

=!

{

'

cols

'

=>

40

,

'

rows

'

=>

20

}!

!

def

render

!

@options

=

DEFAULT_TEXT_AREA_OPTIONS

.!

merge(

@options

.stringify_keys)!

!

super!

end

!

end

!

!

require

'

action_view/helpers/tags/text_area

'

!

ActionView

::

Helpers

::

Tags

::

TextArea

.!

prepend

TextAreaWithDefaultSize

(78)

ステージング環境で

(79)

ステージング環境で

サーバが立ち上がらない

execjs-2.0.2/lib/execjs/runtimes.rb:51:in `autodetect :

Could not find a JavaScript runtime.

See https://github.com/sstephenson/execjs

for a list of available runtimes.

(80)

ステージング環境で

サーバが立ち上がらない

execjs-2.0.2/lib/execjs/runtimes.rb:51:in `autodetect :

Could not find a JavaScript runtime.

See https://github.com/sstephenson/execjs

for a list of available runtimes.

(81)

原因

http://guides.rubyonrails.org/v4.0.1/

upgrading_ruby_on_rails.html#upgrading-from-rails-3-2-to-rails-4-0-gemfile

(82)

原因

group :assets do!

gem 'sass-rails', '~> 3.2.3'! gem 'coffee-rails', '~> 3.2.1'!

# gem 'therubyracer', :platforms => :ruby! gem 'uglifier', '>= 1.0.3'!

end

gem 'sass-rails', '~> 4.0.0'! gem 'uglifier', '>= 1.3.0'!

gem 'coffee-rails', '~> 4.0.0'!

# gem 'therubyracer', platforms: :ruby

Rails 4.0 - Gemfile

Rails 3.2 - Gemfile

(83)
(84)

開発環境

ビルド/デプロイ

環境

本番環境

(85)

開発環境

bundle install Node.js あり

ビルド/デプロイ

環境

本番環境

(86)

開発環境

bundle install Node.js あり

• bundle install ̶without development test • Node.js あり

ビルド/デプロイ

環境

本番環境

(87)

開発環境

bundle install Node.js あり

• bundle install ̶without development test • Node.js あり

• bundle install ̶without development test assets • Node.js なし

ビルド/デプロイ

環境

本番環境

(88)

対応

-gem 'sass-rails', '~> 4.0.0'

!

-gem 'uglifier', '>= 1.3.0'

!

-gem 'coffee-rails', '~> 4.0.0'

!

+gem 'sass-rails', '~> 4.0.0', group: :assets!

+gem 'uglifier', '>= 1.3.0', group: :assets!

+gem 'coffee-rails', '~> 4.0.0', group: :assets

Gemfile

(89)

Rails 4.0 へ

(90)

WINWORKS One の

Rails バージョン遷移

1.2.x 2.0.x 2.1.x 2.2.x 2.3.x 3.0.x 3.1.x 3.2.x 4.0.x 2007 2008 2009 2010 2011 2012 2013 WINWORKS One の Rails アップグレード Rails のリリース

(91)

WINWORKS One の

Rails バージョン遷移

1.2.x 2.0.x 2.1.x 2.2.x 2.3.x 3.0.x 3.1.x 3.2.x 4.0.x 2007 2008 2009 2010 2011 2012 2013 WINWORKS One Version 2 の開発 WINWORKS One の Rails アップグレード Rails のリリース

(92)

WINWORKS One の

Rails バージョン遷移

1.2.x 2.0.x 2.1.x 2.2.x 2.3.x 3.0.x 3.1.x 3.2.x 4.0.x 2007 2008 2009 2010 2011 2012 2013 WINWORKS One Version 2 の開発 WINWORKS One の Rails アップグレード Rails のリリース

(93)

WINWORKS One の

Rails バージョン遷移

1.2.x 2.0.x 2.1.x 2.2.x 2.3.x 3.0.x 3.1.x 3.2.x 4.0.x 2007 2008 2009 2010 2011 2012 2013 WINWORKS One Version 2 の開発 WINWORKS One Version 3 の開発 WINWORKS One の Rails アップグレード Rails のリリース

(94)

WINWORKS One の

Rails バージョン遷移

1.2.x 2.0.x 2.1.x 2.2.x 2.3.x 3.0.x 3.1.x 3.2.x 4.0.x 2007 2008 2009 2010 2011 2012 2013 WINWORKS One Version 2 の開発 WINWORKS One Version 3 の開発 Rails 2.3 => 3.2 WINWORKS One の Rails アップグレード Rails のリリース

(95)

WINWORKS One の

Rails バージョン遷移

1.2.x 2.0.x 2.1.x 2.2.x 2.3.x 3.0.x 3.1.x 3.2.x 4.0.x 2007 2008 2009 2010 2011 2012 2013 WINWORKS One Version 2 の開発 WINWORKS One Version 3 の開発 Rails 2.3 => 3.2 Rails 3.2 => 4.0 WINWORKS One の Rails アップグレード Rails のリリース

(96)
(97)

何を学んだか

(98)

何を学んだか

テスト重要

こまめなアップグレードが開発のリスクとコスト

(99)
(100)
(101)

利用しているサービス

GitHub

CircleCI

HipChat

AWS

NewRelic

Airbrake

(102)
(103)

ウィンワークスの結論

(104)

ウィンワークスの結論

ユーザベースの拡大

(105)

ウィンワークスの結論

ユーザベースの拡大

利用形態の進化

(106)

ウィンワークスの結論

ユーザベースの拡大

利用形態の進化

海外ユーザ

(107)

ウィンワークスの結論

Rails

の進化に

WINWORKS One

を追随させる

ユーザベースの拡大

利用形態の進化

海外ユーザ

モバイルデバイス

参照

関連したドキュメント

携帯電話・ PHS からもご利用いただけます。 受付 9 時~ 12 時、 12 時 45 分~ 17

FOMA 総合プラン 即時適用 ※25 即時適用 即時適用 ※25 即時適用 FOMA データプラン 即時適用 不可 ※22 即時適用

レインフォレスト 場所: 熱帯雨林ゾーン 最大収容人数: 20名. 催行時間: 13:30

その後、時計の MODE ボタン(C)を約 2 秒間 押し続けて時刻モードにしてから、時計の CONNECT ボタン(D)を約 2 秒間押し続けて

性別・子供の有無別の年代別週当たり勤務時間

ある周波数帯域を時間軸方向で複数に分割し,各時分割された周波数帯域をタイムスロット

定可能性は大前提とした上で、どの程度の時間で、どの程度のメモリを用いれば計

災害発生当日、被災者は、定時の午後 5 時から 2 時間程度の残業を命じられ、定時までの作業と同