SlideShare a Scribd company logo
1 of 18
Download to read offline
Ruby on Rails での
他言語エコシステムとの共存方法
2018年2月23日
エネチェンジ株式会社
チーフエンジニア
Tomoya Kawanishi
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
1自己紹介
エネチェンジ株式会社 チーフエンジニア
電力会社、ガス会社を切り替えるなら、エネチェンジ経由で!
一般家庭も!法人も!
エンジニア、積極採用中
Ruby関西の中の人
関西でセミナー形式の勉強会を定期的に開催
発表者として登壇くださる方、あとで声かけください。
関西Ruby会議の開催時はスポンサーも募集!
大手町.rb の中の人
次回、2月27日(火)大手町.rb#4 の開催を予定
東京駅、各線大手町駅から直結!
Ruby の初級者がメインターゲット
みんな来てください
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
電力比較サイト「エネチェンジ」 2
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
エネチェンジの技術スタック 3
気象条件やライフスタイルの違いを考慮した独自
の予測モデルで高精度な消費電力量を予測
気象条件やライフスタイルの違いを考慮した独自
の予測モデルで高精度な消費電力量を予測
予測した消費電力量を元に、各社の電気料金プ
ランに基づいて電気料金を計算
予測した消費電力量を元に、各社の電気料金プ
ランに基づいて電気料金を計算
電気料金の試算、切り替え申込フォームの作成。電気料金の試算、切り替え申込フォームの作成。サーバサイド
(Ruby on Rails)
電気料金計算
(Ruby のライブラリ)
消費電力量予測
(Python製WEB-APIサーバ)
サーバサイドの Ruby on Rails だけでなく、
さまざまな要素技術、コンポーネントを組み合わせて実現
SciPy
JS、フロントエンド
入力フォームの動的な画面制御などで一部、
VueJS を採用
入力フォームの動的な画面制御などで一部、
VueJS を採用
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
VueJS 導入、採用事例 4
他の入力値に連動して変化する動作が多い
①: 郵便番号を入れると、電力会社の選択値が変
わる (関東エリアなら、東京電力に)
②: プランの候補が変わる。プランのデフォルト値
が設定される。
③: アンペア数のデフォルト値が設定される
④: 設定値に応じて、プランの候補数の値が更新さ
れる
①
②
③
④
⑤
VueJS のフレームワークを採用
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
電気料金計算 5
時間帯ごと、曜日ごとに単価が複雑に変化する
専用の電気料金計算のライブラリとして分離
例:関西電力の
季時別電灯PS
・ 土日は安く、平日は高い
・ 夜は安く、平日は高い
・ 昼の単価は3段階料金。
(使用量が増えると、
単価が高くなる)
・ 夏には夏季ピークという
特に電気代が高い時間帯あり
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
電気使用量の予測システム 6
機械学習(Python)フレームワークで予測システムを構築
お住まいの地域お住まいの地域
SciPy
家族人数家族人数
大家族
一人暮らし
ライフスタイルライフスタイル
昼、夜どちらで電
気を使うか
電気使用量は季節、居住地域、家族人数等に影響される
7
各コンポーネントの
組み込み方
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
VueJS 導入以前
Rails の古き良き Asset Pipeline に乗っかっていた
JavaScript
jQuery がメイン。ライブラリは職人が手で置く運用
8
案①: VueJS-Rails
バージョンアップに
追随していけるか不安
案②: WebPacker
webpack の進歩に追随
できるか不安
案③: フロントエンドエコシステム
npm、yarn、BABEL、webpack といった
フロントエンドのエコシステムを直接利用
案③を採用
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
エネチェンジでの VueJS との付き合い方
あくまで軸足は、Ruby on Rails
メンバーの多くが Rails に慣れており、学習コストを下げたい。
境界領域は、Ruby on Rails 側にできるだけ倒す
例1:digest 付与、minify は Rails/Sprockets 側で処理
例2:VueJS の高度な機能は今のところ使わず
例: Vuex、vue-router 、単一ファイルコンポーネントなど
例3:view 側は普通の erb で記述
9
<script type="text/x-template" id="plans-finder-item-pc">
<%= render 'plans_finder_item_pc' %>
</script>
<script type="text/x-template" id="plans-finder-item-smp">
<%= render 'plans_finder_item_smp' %>
</script>
VueJS はDOM操作等に特化し、学習コストを下げた
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
電気料金計算の処理の分離
初期の実装
Ruby on Rails と同じレポジ
トリに電気料金計算の処理が
あった
電気料金計算処理を API と
して SaaS 提供を開始
コンポーネントを分割
電気料金計算の処理をライブ
ラリ化
10
電気料金計算含め、
単一レポジトリ
エネチェンジ本体
(Ruby on Rails)
電気料金計算
(Ruby のライブラリ)
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
電気料金計算を分離するときの考え方
将来の変更容易性の確保が第一
将来、何が起こるかは予測できない
将来に禍根を残さないことを第一に設計
疎結合とは
呼び出し元に要求される知識が少ないほどより疎結合
疎結合であることで、より変化に強くなる
境界が明確になり、変更時の影響調査しやすくなる
自動テストを書きやすくなる
チーム間のコミュニケーション、システム間の調整コストが減る
11
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
マイクロサービス案の検討 12
小規模な WEBサービスを組み合わせる開発手法小規模な WEBサービスを組み合わせる開発手法
マイクロサービスとは
マイクロサービスのメリット
堅固かつ明瞭
な境界
異種技術(言語、
DB)を混在可能
サービス単位の
きめ細かい性能強化
チーム間のコミュニケー
ションコストの低減
必要
今すぐは
不要
今すぐは
不要
今すぐは
不要
マイクロサービス自体は採用しないが、
堅固かつ明確な境界は作り、
必要なときにマイクロサービス化可能なように設計
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
Rubyライブラリとして分離 13
電気料金計算
(Ruby のライブラリ)
エネチェンジ本体
(Ruby on Rails)
ActiveRecord
オブジェクト
ActiveModel
オブジェクト
PostgreSQL
DBアクセスはエネチェンジ本体だけが行う。
(ライブラリ側ではDBアクセスはしない)
DBアクセスはエネチェンジ本体だけが行う。
(ライブラリ側ではDBアクセスはしない)
ライブラリ側で必要となる単価情報等のすべ
てのデータをシリアライズ
ライブラリ側で必要となる単価情報等のすべ
てのデータをシリアライズ
引数、返り値ともにJSON で表現できる型
だけで構成されたオブジェクト
※ Hash、Array、String、Numeric など
引数、返り値ともにJSON で表現できる型
だけで構成されたオブジェクト
※ Hash、Array、String、Numeric など
受け取ったデータを元に料金試算処理受け取ったデータを元に料金試算処理
マイクロサービス化を意識した Ruby ライブラリとして分離
DBアクセスの
集中管理
ライブラリの
ステートレス化
デプロイの複雑
さを回避
疎結合さの向上
同一Unicorn プロセス
単なる Rubyライブラリなので、同一の
Unicorn プロセス上で実行される
単なる Rubyライブラリなので、同一の
Unicorn プロセス上で実行される
パフォーマンス
向上
将来のマイクロ
サービス化を意識
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
Python 製電気使用量予測システムとの連携
Ruby (Rails)と Python(Flask)を 同じサーバに配置
別のサーバに配置するよりも下記の観点で優れると判断
運用性
経済性
性能向上
14
電気料金計算
(Ruby のライブラリ)
電気使用量予測
(Python製WEB-APIサーバ)
Flask
SciPy
エネチェンジ本体
(Ruby on Rails)
HTTP /
WEB-API
HTTP /
WEB-API
予測
モデル
同一サーバ上
Unicorn
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
git submodule の配置 15
エネチェンジ本体
(Ruby on Rails)
電気料金計算
(Rubyのライブラリ)
電気使用量予測
WEB-APIサーバ
(Python, Flask)
電気使用量予測
ライブラリ
(Python ライブラリ)
Git Submodule の配置 実際の依存関係
エネチェンジ本体
(Ruby on Rails)
git submodulegit submodule はフラットに配置し、運用性を向上
電気料金計算
(Rubyのライブラリ)
電気使用量予測
WEB-APIサーバ
(Python, Flask)
電気使用量予測
ライブラリ
(Python ライブラリ)
・ ディレクトリ、ネスト関係が深くなると、運用性が低下する
・ 現在の依存関係が将来にもわたって同じである保証はなく、
フラットとする方が修正・変更を実施しやすいと判断した
Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」
まとめ
3つの部品の連携等を説明しました
Ruby on Rails プロジェクトに VueJS を導入した話
Ruby on Rails で作っていた電気料金試算の部品を
Ruby ライブラリとして分割した話
Python で作られた電気使用量予測のシステムを
Ruby on Rails とどう連携したかという話
連携方式検討時はいろいろ考慮しました
将来は現時点では分からない
将来に禍根を残さない
学習コスト、運用コストを上げないようにする
参考になりましたら、幸いです
16
17
ご清聴ありがとう
ございました

More Related Content

Similar to Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法

AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてTomoya Kawanishi
 
20150221 ruby関西 tomot発表
20150221 ruby関西 tomot発表20150221 ruby関西 tomot発表
20150221 ruby関西 tomot発表Tomo Takamiya
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Koichi Shimozono
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例Tomoya Kawanishi
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーTomoya Kawanishi
 
FukuokaDec09
FukuokaDec09FukuokaDec09
FukuokaDec09tengu
 
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用kotaro_hirayama
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウTomoya Kawanishi
 
ApplicationTemplateのススメ
ApplicationTemplateのススメApplicationTemplateのススメ
ApplicationTemplateのススメTakafumi ONAKA
 
RubyとRのおいしい関係
RubyとRのおいしい関係RubyとRのおいしい関係
RubyとRのおいしい関係sady_nitro
 
PWAをWebサービスに導入した話
PWAをWebサービスに導入した話PWAをWebサービスに導入した話
PWAをWebサービスに導入した話dobby618
 
API Meetupのこれまでとこれから
API MeetupのこれまでとこれからAPI Meetupのこれまでとこれから
API MeetupのこれまでとこれからAPI Meetup
 
Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01Yutaka Tachibana
 
20150129 raセミナー 高宮発表
20150129 raセミナー 高宮発表20150129 raセミナー 高宮発表
20150129 raセミナー 高宮発表Tomo Takamiya
 
Rails5とAPIモードについての解説
Rails5とAPIモードについての解説Rails5とAPIモードについての解説
Rails5とAPIモードについての解説Fumiya Sakai
 
Bundler 2 の胎動
Bundler 2 の胎動Bundler 2 の胎動
Bundler 2 の胎動Koichi ITO
 
Ruby on railsでlinebotを試した記録
Ruby on railsでlinebotを試した記録Ruby on railsでlinebotを試した記録
Ruby on railsでlinebotを試した記録Fumiya Sakai
 
130522 00
130522 00130522 00
130522 00openrtm
 
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)Shintaro Kakutani
 

Similar to Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法 (20)

AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分について
 
20150221 ruby関西 tomot発表
20150221 ruby関西 tomot発表20150221 ruby関西 tomot発表
20150221 ruby関西 tomot発表
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
FukuokaDec09
FukuokaDec09FukuokaDec09
FukuokaDec09
 
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
ApplicationTemplateのススメ
ApplicationTemplateのススメApplicationTemplateのススメ
ApplicationTemplateのススメ
 
Ruby with My Life
Ruby with My LifeRuby with My Life
Ruby with My Life
 
RubyとRのおいしい関係
RubyとRのおいしい関係RubyとRのおいしい関係
RubyとRのおいしい関係
 
PWAをWebサービスに導入した話
PWAをWebサービスに導入した話PWAをWebサービスに導入した話
PWAをWebサービスに導入した話
 
API Meetupのこれまでとこれから
API MeetupのこれまでとこれからAPI Meetupのこれまでとこれから
API Meetupのこれまでとこれから
 
Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01
 
20150129 raセミナー 高宮発表
20150129 raセミナー 高宮発表20150129 raセミナー 高宮発表
20150129 raセミナー 高宮発表
 
Rails5とAPIモードについての解説
Rails5とAPIモードについての解説Rails5とAPIモードについての解説
Rails5とAPIモードについての解説
 
Bundler 2 の胎動
Bundler 2 の胎動Bundler 2 の胎動
Bundler 2 の胎動
 
Ruby on railsでlinebotを試した記録
Ruby on railsでlinebotを試した記録Ruby on railsでlinebotを試した記録
Ruby on railsでlinebotを試した記録
 
130522 00
130522 00130522 00
130522 00
 
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
 

More from Tomoya Kawanishi

Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列についてTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現についてTomoya Kawanishi
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行についてTomoya Kawanishi
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについてTomoya Kawanishi
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことTomoya Kawanishi
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと WebクローリングについてTomoya Kawanishi
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interfaceTomoya Kawanishi
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能についてTomoya Kawanishi
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO についてTomoya Kawanishi
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてTomoya Kawanishi
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについてTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発についてTomoya Kawanishi
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決についてTomoya Kawanishi
 
ガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue jsガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue jsTomoya Kawanishi
 

More from Tomoya Kawanishi (20)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについて
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと Webクローリングについて
 
Rake
RakeRake
Rake
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについて
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについて
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発について
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決について
 
Tsort について
Tsort についてTsort について
Tsort について
 
ガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue jsガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue js
 

Recently uploaded

プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 

Recently uploaded (8)

プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 

Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法

  • 1. Ruby on Rails での 他言語エコシステムとの共存方法 2018年2月23日 エネチェンジ株式会社 チーフエンジニア Tomoya Kawanishi
  • 2. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 1自己紹介 エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も! エンジニア、積極採用中 Ruby関西の中の人 関西でセミナー形式の勉強会を定期的に開催 発表者として登壇くださる方、あとで声かけください。 関西Ruby会議の開催時はスポンサーも募集! 大手町.rb の中の人 次回、2月27日(火)大手町.rb#4 の開催を予定 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット みんな来てください
  • 3. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 電力比較サイト「エネチェンジ」 2
  • 4. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 エネチェンジの技術スタック 3 気象条件やライフスタイルの違いを考慮した独自 の予測モデルで高精度な消費電力量を予測 気象条件やライフスタイルの違いを考慮した独自 の予測モデルで高精度な消費電力量を予測 予測した消費電力量を元に、各社の電気料金プ ランに基づいて電気料金を計算 予測した消費電力量を元に、各社の電気料金プ ランに基づいて電気料金を計算 電気料金の試算、切り替え申込フォームの作成。電気料金の試算、切り替え申込フォームの作成。サーバサイド (Ruby on Rails) 電気料金計算 (Ruby のライブラリ) 消費電力量予測 (Python製WEB-APIサーバ) サーバサイドの Ruby on Rails だけでなく、 さまざまな要素技術、コンポーネントを組み合わせて実現 SciPy JS、フロントエンド 入力フォームの動的な画面制御などで一部、 VueJS を採用 入力フォームの動的な画面制御などで一部、 VueJS を採用
  • 5. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 VueJS 導入、採用事例 4 他の入力値に連動して変化する動作が多い ①: 郵便番号を入れると、電力会社の選択値が変 わる (関東エリアなら、東京電力に) ②: プランの候補が変わる。プランのデフォルト値 が設定される。 ③: アンペア数のデフォルト値が設定される ④: 設定値に応じて、プランの候補数の値が更新さ れる ① ② ③ ④ ⑤ VueJS のフレームワークを採用
  • 6. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 電気料金計算 5 時間帯ごと、曜日ごとに単価が複雑に変化する 専用の電気料金計算のライブラリとして分離 例:関西電力の 季時別電灯PS ・ 土日は安く、平日は高い ・ 夜は安く、平日は高い ・ 昼の単価は3段階料金。 (使用量が増えると、 単価が高くなる) ・ 夏には夏季ピークという 特に電気代が高い時間帯あり
  • 7. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 電気使用量の予測システム 6 機械学習(Python)フレームワークで予測システムを構築 お住まいの地域お住まいの地域 SciPy 家族人数家族人数 大家族 一人暮らし ライフスタイルライフスタイル 昼、夜どちらで電 気を使うか 電気使用量は季節、居住地域、家族人数等に影響される
  • 9. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 VueJS 導入以前 Rails の古き良き Asset Pipeline に乗っかっていた JavaScript jQuery がメイン。ライブラリは職人が手で置く運用 8 案①: VueJS-Rails バージョンアップに 追随していけるか不安 案②: WebPacker webpack の進歩に追随 できるか不安 案③: フロントエンドエコシステム npm、yarn、BABEL、webpack といった フロントエンドのエコシステムを直接利用 案③を採用
  • 10. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 エネチェンジでの VueJS との付き合い方 あくまで軸足は、Ruby on Rails メンバーの多くが Rails に慣れており、学習コストを下げたい。 境界領域は、Ruby on Rails 側にできるだけ倒す 例1:digest 付与、minify は Rails/Sprockets 側で処理 例2:VueJS の高度な機能は今のところ使わず 例: Vuex、vue-router 、単一ファイルコンポーネントなど 例3:view 側は普通の erb で記述 9 <script type="text/x-template" id="plans-finder-item-pc"> <%= render 'plans_finder_item_pc' %> </script> <script type="text/x-template" id="plans-finder-item-smp"> <%= render 'plans_finder_item_smp' %> </script> VueJS はDOM操作等に特化し、学習コストを下げた
  • 11. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 電気料金計算の処理の分離 初期の実装 Ruby on Rails と同じレポジ トリに電気料金計算の処理が あった 電気料金計算処理を API と して SaaS 提供を開始 コンポーネントを分割 電気料金計算の処理をライブ ラリ化 10 電気料金計算含め、 単一レポジトリ エネチェンジ本体 (Ruby on Rails) 電気料金計算 (Ruby のライブラリ)
  • 12. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 電気料金計算を分離するときの考え方 将来の変更容易性の確保が第一 将来、何が起こるかは予測できない 将来に禍根を残さないことを第一に設計 疎結合とは 呼び出し元に要求される知識が少ないほどより疎結合 疎結合であることで、より変化に強くなる 境界が明確になり、変更時の影響調査しやすくなる 自動テストを書きやすくなる チーム間のコミュニケーション、システム間の調整コストが減る 11
  • 13. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 マイクロサービス案の検討 12 小規模な WEBサービスを組み合わせる開発手法小規模な WEBサービスを組み合わせる開発手法 マイクロサービスとは マイクロサービスのメリット 堅固かつ明瞭 な境界 異種技術(言語、 DB)を混在可能 サービス単位の きめ細かい性能強化 チーム間のコミュニケー ションコストの低減 必要 今すぐは 不要 今すぐは 不要 今すぐは 不要 マイクロサービス自体は採用しないが、 堅固かつ明確な境界は作り、 必要なときにマイクロサービス化可能なように設計
  • 14. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 Rubyライブラリとして分離 13 電気料金計算 (Ruby のライブラリ) エネチェンジ本体 (Ruby on Rails) ActiveRecord オブジェクト ActiveModel オブジェクト PostgreSQL DBアクセスはエネチェンジ本体だけが行う。 (ライブラリ側ではDBアクセスはしない) DBアクセスはエネチェンジ本体だけが行う。 (ライブラリ側ではDBアクセスはしない) ライブラリ側で必要となる単価情報等のすべ てのデータをシリアライズ ライブラリ側で必要となる単価情報等のすべ てのデータをシリアライズ 引数、返り値ともにJSON で表現できる型 だけで構成されたオブジェクト ※ Hash、Array、String、Numeric など 引数、返り値ともにJSON で表現できる型 だけで構成されたオブジェクト ※ Hash、Array、String、Numeric など 受け取ったデータを元に料金試算処理受け取ったデータを元に料金試算処理 マイクロサービス化を意識した Ruby ライブラリとして分離 DBアクセスの 集中管理 ライブラリの ステートレス化 デプロイの複雑 さを回避 疎結合さの向上 同一Unicorn プロセス 単なる Rubyライブラリなので、同一の Unicorn プロセス上で実行される 単なる Rubyライブラリなので、同一の Unicorn プロセス上で実行される パフォーマンス 向上 将来のマイクロ サービス化を意識
  • 15. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 Python 製電気使用量予測システムとの連携 Ruby (Rails)と Python(Flask)を 同じサーバに配置 別のサーバに配置するよりも下記の観点で優れると判断 運用性 経済性 性能向上 14 電気料金計算 (Ruby のライブラリ) 電気使用量予測 (Python製WEB-APIサーバ) Flask SciPy エネチェンジ本体 (Ruby on Rails) HTTP / WEB-API HTTP / WEB-API 予測 モデル 同一サーバ上 Unicorn
  • 16. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 git submodule の配置 15 エネチェンジ本体 (Ruby on Rails) 電気料金計算 (Rubyのライブラリ) 電気使用量予測 WEB-APIサーバ (Python, Flask) 電気使用量予測 ライブラリ (Python ライブラリ) Git Submodule の配置 実際の依存関係 エネチェンジ本体 (Ruby on Rails) git submodulegit submodule はフラットに配置し、運用性を向上 電気料金計算 (Rubyのライブラリ) 電気使用量予測 WEB-APIサーバ (Python, Flask) 電気使用量予測 ライブラリ (Python ライブラリ) ・ ディレクトリ、ネスト関係が深くなると、運用性が低下する ・ 現在の依存関係が将来にもわたって同じである保証はなく、 フラットとする方が修正・変更を実施しやすいと判断した
  • 17. Ruby Business Users Conference 2018 「Rails と他言語エコシステムとの共存方法」 まとめ 3つの部品の連携等を説明しました Ruby on Rails プロジェクトに VueJS を導入した話 Ruby on Rails で作っていた電気料金試算の部品を Ruby ライブラリとして分割した話 Python で作られた電気使用量予測のシステムを Ruby on Rails とどう連携したかという話 連携方式検討時はいろいろ考慮しました 将来は現時点では分からない 将来に禍根を残さない 学習コスト、運用コストを上げないようにする 参考になりましたら、幸いです 16