Enviar pesquisa
Carregar
実録!Railsのはまりポイント10選
•
89 gostaram
•
24,544 visualizações
Drecom Co., Ltd.
Seguir
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 53
Recomendados
大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会
大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会
Takayuki Kyowa
AWSでDockerを扱うためのベストプラクティス
AWSでDockerを扱うためのベストプラクティス
Amazon Web Services Japan
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
Tetsutaro Watanabe
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
Kaname Motoyama
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
Mais conteúdo relacionado
Mais procurados
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
Yuta Shimada
動的コンテンツをオリジンとしたCloudFrontを構築してみた
動的コンテンツをオリジンとしたCloudFrontを構築してみた
Taiki Kawamura
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
Marp Tutorial
Marp Tutorial
Rui Watanabe
ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
Hiroshi Tokumaru
aws lambdaでpythonを実行するときのチューニング案を試してみた!
aws lambdaでpythonを実行するときのチューニング案を試してみた!
Shun Fukazawa
Firebase Authを Nuxt + Railsの自前サービス に導入してみた
Firebase Authを Nuxt + Railsの自前サービス に導入してみた
Tomoe Sawai
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
joisino
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
詳説データベース輪読会: 分散合意その2
詳説データベース輪読会: 分散合意その2
Sho Nakazono
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
【DL輪読会】マルチモーダル 基盤モデル
【DL輪読会】マルチモーダル 基盤モデル
Deep Learning JP
MQTTとAMQPと.NET
MQTTとAMQPと.NET
terurou
MySQL負荷分散の方法
MySQL負荷分散の方法
佐久本正太
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano
ホモトピー型理論入門
ホモトピー型理論入門
k h
DynamoDBの初心者に伝えたい初めて触るときの勘所
DynamoDBの初心者に伝えたい初めて触るときの勘所
Ryo Sasaki
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
Amazon Web Services Japan
Mais procurados
(20)
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
動的コンテンツをオリジンとしたCloudFrontを構築してみた
動的コンテンツをオリジンとしたCloudFrontを構築してみた
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Marp Tutorial
Marp Tutorial
ウェーブレット木の世界
ウェーブレット木の世界
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
aws lambdaでpythonを実行するときのチューニング案を試してみた!
aws lambdaでpythonを実行するときのチューニング案を試してみた!
Firebase Authを Nuxt + Railsの自前サービス に導入してみた
Firebase Authを Nuxt + Railsの自前サービス に導入してみた
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
詳説データベース輪読会: 分散合意その2
詳説データベース輪読会: 分散合意その2
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
【DL輪読会】マルチモーダル 基盤モデル
【DL輪読会】マルチモーダル 基盤モデル
MQTTとAMQPと.NET
MQTTとAMQPと.NET
MySQL負荷分散の方法
MySQL負荷分散の方法
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
ホモトピー型理論入門
ホモトピー型理論入門
DynamoDBの初心者に伝えたい初めて触るときの勘所
DynamoDBの初心者に伝えたい初めて触るときの勘所
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
Destaque
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編
Kazuya Numata
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
Drecom Co., Ltd.
フライングゲットガチャ セミナー資料
フライングゲットガチャ セミナー資料
Drecom Co., Ltd.
ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみた
Drecom Co., Ltd.
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
Drecom Co., Ltd.
5年後のデータサイエンティスト
5年後のデータサイエンティスト
Drecom Co., Ltd.
Railsによるワイルドなソフトウェア開発
Railsによるワイルドなソフトウェア開発
Drecom Co., Ltd.
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
Drecom Co., Ltd.
エンジニア生存戦略
エンジニア生存戦略
Drecom Co., Ltd.
activerecord-turntable
activerecord-turntable
Drecom Co., Ltd.
Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)
Yohei Yasukawa
ソーシャルゲームスケールアウトの歴史
ソーシャルゲームスケールアウトの歴史
Drecom Co., Ltd.
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
Drecom Co., Ltd.
ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術
Drecom Co., Ltd.
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
Drecom Co., Ltd.
地獄Spec
地獄Spec
Drecom Co., Ltd.
ドリコム流。教育アプリにおけるゲーミフィケーションノウハウ
ドリコム流。教育アプリにおけるゲーミフィケーションノウハウ
trendism
MySQL Index勉強会外部公開用
MySQL Index勉強会外部公開用
CROOZ, inc.
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
Webアプリケーションは難しい
Webアプリケーションは難しい
Takafumi ONAKA
Destaque
(20)
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
フライングゲットガチャ セミナー資料
フライングゲットガチャ セミナー資料
ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみた
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
5年後のデータサイエンティスト
5年後のデータサイエンティスト
Railsによるワイルドなソフトウェア開発
Railsによるワイルドなソフトウェア開発
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
エンジニア生存戦略
エンジニア生存戦略
activerecord-turntable
activerecord-turntable
Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)
ソーシャルゲームスケールアウトの歴史
ソーシャルゲームスケールアウトの歴史
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
地獄Spec
地獄Spec
ドリコム流。教育アプリにおけるゲーミフィケーションノウハウ
ドリコム流。教育アプリにおけるゲーミフィケーションノウハウ
MySQL Index勉強会外部公開用
MySQL Index勉強会外部公開用
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
Webアプリケーションは難しい
Webアプリケーションは難しい
Semelhante a 実録!Railsのはまりポイント10選
Awsデータレイク事例祭り dmm.com YUKI SASITO.pdf
Awsデータレイク事例祭り dmm.com YUKI SASITO.pdf
YUKI SAITO
ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
Go Sueyoshi (a.k.a sue445)
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
Narami Kiyokura
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
gree_tech
HerokuでRailsアプリ運用の パフォーマンス、SEO対策
HerokuでRailsアプリ運用の パフォーマンス、SEO対策
Salesforce Developers Japan
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
gree_tech
db tech showcase 東京 2014 - Couchbase Serverを用いた大規模データ収集基盤
db tech showcase 東京 2014 - Couchbase Serverを用いた大規模データ収集基盤
Daichi Koike
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門
じゅん なかざ
drecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battle
Mitsuki Kenichi
Running Apache Spark on AWS
Running Apache Spark on AWS
Noritaka Sekiyama
#cwt2016 Cloudera Managerを用いた Hadoop のトラブルシューティング
#cwt2016 Cloudera Managerを用いた Hadoop のトラブルシューティング
Cloudera Japan
[AWSマイスターシリーズ] Amazon DynamoDB
[AWSマイスターシリーズ] Amazon DynamoDB
Amazon Web Services Japan
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Ryo Nakamaru
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント
Kentaro Matsui
Asakusa バッチの運用を支える技術
Asakusa バッチの運用を支える技術
KinebuchiTomo
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
Akihiro Kuwano
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Shinpei Ohtani
【AWS Summit Tokyo 2017】Amazon ECS と SpotFleet を活用した低コストでスケーラブルなジョブワーカーシステム
【AWS Summit Tokyo 2017】Amazon ECS と SpotFleet を活用した低コストでスケーラブルなジョブワーカーシステム
Kazuki Matsuda
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Yahoo!デベロッパーネットワーク
20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services
Amazon Web Services Japan
Semelhante a 実録!Railsのはまりポイント10選
(20)
Awsデータレイク事例祭り dmm.com YUKI SASITO.pdf
Awsデータレイク事例祭り dmm.com YUKI SASITO.pdf
ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
HerokuでRailsアプリ運用の パフォーマンス、SEO対策
HerokuでRailsアプリ運用の パフォーマンス、SEO対策
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
db tech showcase 東京 2014 - Couchbase Serverを用いた大規模データ収集基盤
db tech showcase 東京 2014 - Couchbase Serverを用いた大規模データ収集基盤
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門
drecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battle
Running Apache Spark on AWS
Running Apache Spark on AWS
#cwt2016 Cloudera Managerを用いた Hadoop のトラブルシューティング
#cwt2016 Cloudera Managerを用いた Hadoop のトラブルシューティング
[AWSマイスターシリーズ] Amazon DynamoDB
[AWSマイスターシリーズ] Amazon DynamoDB
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント
Asakusa バッチの運用を支える技術
Asakusa バッチの運用を支える技術
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
【AWS Summit Tokyo 2017】Amazon ECS と SpotFleet を活用した低コストでスケーラブルなジョブワーカーシステム
【AWS Summit Tokyo 2017】Amazon ECS と SpotFleet を活用した低コストでスケーラブルなジョブワーカーシステム
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services
Mais de Drecom Co., Ltd.
コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活
Drecom Co., Ltd.
サービスのインシデントを解決するには.pdf
サービスのインシデントを解決するには.pdf
Drecom Co., Ltd.
ドリコムサマージョブ報告 by 佐々木 誠治
ドリコムサマージョブ報告 by 佐々木 誠治
Drecom Co., Ltd.
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介
Drecom Co., Ltd.
HTML5 ゲームフレームワーク開発について
HTML5 ゲームフレームワーク開発について
Drecom Co., Ltd.
「AROW」お披露目(導入編)
「AROW」お披露目(導入編)
Drecom Co., Ltd.
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
Drecom Co., Ltd.
AROW の紹介 〜概要編〜
AROW の紹介 〜概要編〜
Drecom Co., Ltd.
AROW の紹介 〜実践編〜
AROW の紹介 〜実践編〜
Drecom Co., Ltd.
rails-developers-meetup-day4
rails-developers-meetup-day4
Drecom Co., Ltd.
html5conf2018-sponsor-session
html5conf2018-sponsor-session
Drecom Co., Ltd.
DApps のユーザ認証に web3.eth.personal.sign を使おう!
DApps のユーザ認証に web3.eth.personal.sign を使おう!
Drecom Co., Ltd.
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法
Drecom Co., Ltd.
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ
Drecom Co., Ltd.
今月のレッツゴー陰陽師!
今月のレッツゴー陰陽師!
Drecom Co., Ltd.
位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよ
Drecom Co., Ltd.
カンバンと朝会とわたくし
カンバンと朝会とわたくし
Drecom Co., Ltd.
Mais de Drecom Co., Ltd.
(17)
コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活
サービスのインシデントを解決するには.pdf
サービスのインシデントを解決するには.pdf
ドリコムサマージョブ報告 by 佐々木 誠治
ドリコムサマージョブ報告 by 佐々木 誠治
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介
HTML5 ゲームフレームワーク開発について
HTML5 ゲームフレームワーク開発について
「AROW」お披露目(導入編)
「AROW」お披露目(導入編)
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
AROW の紹介 〜概要編〜
AROW の紹介 〜概要編〜
AROW の紹介 〜実践編〜
AROW の紹介 〜実践編〜
rails-developers-meetup-day4
rails-developers-meetup-day4
html5conf2018-sponsor-session
html5conf2018-sponsor-session
DApps のユーザ認証に web3.eth.personal.sign を使おう!
DApps のユーザ認証に web3.eth.personal.sign を使おう!
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ
今月のレッツゴー陰陽師!
今月のレッツゴー陰陽師!
位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよ
カンバンと朝会とわたくし
カンバンと朝会とわたくし
実録!Railsのはまりポイント10選
1.
実録! Railsのはまりポイント10選
2012/03/26 第2回 渋谷Edge Rails勉強会 藤田 武雄 Copyright © Drecom Co., Ltd.
2.
自己紹介 • 藤田 武雄 •
株式会社ドリコム • ソーシャルゲーム事業本部 • アプリケーションエンジニア • 最近は主に社内ライブラリの開発を 担当 Copyright © Drecom Co., Ltd.
3.
今日の内容 • Railsを使用したソーシャルゲームの開 発時にはまったポイントをご紹介 •
実際に社内であった事例です • ほとんどRails3採用後の話 Copyright © Drecom Co., Ltd.
4.
Case1 and/or
Copyright © Drecom Co., Ltd.
5.
はまり例 a = b
or c • こういう意味にしたかった a = (b or c) • 実際の動きは (a = b) or c • bの値をaに代入し、それが偽であればc を評価する Copyright © Drecom Co., Ltd.
6.
演算子の優先順位 • and/orは優先順位が一番低い • 対策1:
括弧をつける a = (b or c) • 対策2: &&/¦¦を使う a = b || c Copyright © Drecom Co., Ltd.
7.
ちなみにRails本体は • Contributing to
Ruby on Rails • 5.3 Follow the Coding Conventionsに は • Prefer &&/¦¦ over and/or • と書かれている • http://guides.rubyonrails.org/ contributing_to_ruby_on_rails.html Copyright © Drecom Co., Ltd.
8.
Case2 scope
Copyright © Drecom Co., Ltd.
9.
はまり例 scope :started, where(‘start_at
<= ?’, Time.now) • どういうことが起こりうるか • 開始時刻になってもキャンペーンがス タートしない • 設定した時刻にバナーが切り替わら ない Copyright © Drecom Co., Ltd.
10.
なぜ? • クラスがロードされた時点でwhereの 中にあるTime.nowの評価が行われる •
結果、アプリケーションサーバを起動 した時間で固定されてしまう Copyright © Drecom Co., Ltd.
11.
lambdaを渡す scope :started, lambda
{ where('start_at <= ?', Time.now) } • lambdaの中身は都度評価される • edgeではwhereを直接書くやり方は deprecatedとなった • https://github.com/rails/rails/commit/ 0a12a5f8169685915cbb7bf4d0a7bb48 2f7f2fd2 Copyright © Drecom Co., Ltd.
12.
Case3 クラスのインスタンス変数
Copyright © Drecom Co., Ltd.
13.
インスタンス変数の遅延 初期化 @foo ||= bar
• 初期化の手間を省くためによく使われ る • barの実行結果をキャッシュする効果も • クラスのインスタンス変数では注意が 必要 Copyright © Drecom Co., Ltd.
14.
よくない例 class Baz def
self.foo @foo ||= bar end end • barがDBから取得した値だとDBを更新 しても返り値が変化しない! Copyright © Drecom Co., Ltd.
15.
起こったこと • データを追加したのに反映されない • よくわからんからunicornを再起動 •
うまくいった • そんなこともありました Copyright © Drecom Co., Ltd.
16.
なぜ? • 通常はオブジェクトのインスタンスの 寿命は1リクエストの間だけ •
一方、クラス自体はリクエストを返し た後も生き続ける • クラスのインスタンス変数に入れる とずっと保持される Copyright © Drecom Co., Ltd.
17.
対策 • むやみにクラスのインスタンス変数に 入れない •
意味をわかっていてやるのであればOK Copyright © Drecom Co., Ltd.
18.
Case4 textあふれ
Copyright © Drecom Co., Ltd.
19.
データ破損 • textカラムにJSONを格納していた • ある日突然データが壊れた!
Copyright © Drecom Co., Ltd.
20.
原因 • mysqlのtextは65535バイトまで • それ以上のものを保存すると後ろが切
れるが保存自体エラーにはならない • 読み込むとJSONとしては壊れているの でパースエラー Copyright © Drecom Co., Ltd.
21.
対策 • その1: validates_length_ofを設定 •
その2: 文字数を減らす • その3: mediumtext(16MBまで)などに 変更する • どれぐらい増えるか見積もりしておけば はみ出ないように設計見直しできるはず • AR::Store(YAML)にも気をつけよう Copyright © Drecom Co., Ltd.
22.
Case5 index名長さ制限
Copyright © Drecom Co., Ltd.
23.
index名の長さ • 複数カラムにindexを張った時に長さ制
限に引っかかった • mysqlは64バイトまでしか使えない index_テーブル名_on_カラム名_and_カラ ム名_… Copyright © Drecom Co., Ltd.
24.
index名を短くする • デフォルトを変更するモンキーパッチ
をあてた • テーブルごとにuniqueになればよいの でテーブル名不要 カラム名_and_カラム名_... Copyright © Drecom Co., Ltd.
25.
パッチ module ActiveRecord module
ConnectionAdapters module SchemaStatements def index_name(table_name, options) if Hash === options if options[:column] "#{Array.wrap(options[:column]) * '_and_'}" elsif options[:name] options[:name] else raise ArgumentError, "You must specify the index name" end else index_name(table_name, :column => options) end end end end end Copyright © Drecom Co., Ltd.
26.
Case6 tinyint
Copyright © Drecom Co., Ltd.
27.
tinyintの扱いの罠 • アプリリリース前にDBAの協力の下、 テーブル構成をチューニングした
• int → tinyint • するとアプリの動作がおかしくなった • DBに入っている数値は変わってないの に取ってきた値が全然違う! Copyright © Drecom Co., Ltd.
28.
原因と対策 • ActiveRecordはtinyintのカラムを booleanとして扱う •
対策: boolean以外ではtinyintを使わな い(smallintにするなど) Copyright © Drecom Co., Ltd.
29.
Case7 参照分散時のミス
Copyright © Drecom Co., Ltd.
30.
data_fabric • 参照分散のためのplugin • 利用者数が増え、masterだけでさばききれな
くなったため導入 • action単位でaround_filterをかけて振り分け • slaveの情報を元にmaster側を更新しない ようにaction単位にした • アクセスの多いマイページなどはslaveへ逃が す Copyright © Drecom Co., Ltd.
31.
事故発生! • あるときレプリケーション遅延が起 こってslaveの古い情報を元にmasterに
更新がかかってしまった • データ不整合発生! • そんな実装はしていない認識だった • 調査するとマイページのviewで呼び出 しているhelperからupdateが… Copyright © Drecom Co., Ltd.
32.
対策 • helperからupdateしない! • 参照振り分け用around_filterの外側に
before_filterを設定し、update処理部 分を移した Copyright © Drecom Co., Ltd.
33.
Case8 ランキング集計
Copyright © Drecom Co., Ltd.
34.
ランキング集計 • イベントランキングを毎時集計 • 一人ずつselectして順位をupdateする実装
になっていた • 参加ユーザ数が増えると集計時間がどんど ん長くなる • 集計時間が30分を超えた時点で状況を検知 • 前月までは大丈夫だったのに… Copyright © Drecom Co., Ltd.
35.
対応前のサーバ負荷 • DBサーバのCPU使用率
Copyright © Drecom Co., Ltd.
36.
対策 • 方針としてはtransaction数を減らす • 裏で新規テーブルを作成して、1000件
ずつbulk insert • 全部入ったらrenameで入れ替え • bulk insertにはactiverecord-import を使用 Copyright © Drecom Co., Ltd.
37.
コード例 CREATE TABLE IF
NOT EXISTS tmp_scores LIKE scores; TRUNCATE TABLE tmp_scores; class TmpScore < ActiveRecord::Base; end TmpScore.import([:user_id, :value, :rank], scores) RENAME TABLE scores TO scores_old, tmp_scores TO scores; DROP TABLE scores_old; Copyright © Drecom Co., Ltd.
38.
対応後のサーバ負荷
Copyright © Drecom Co., Ltd.
39.
別の方法 • Redisのsorted setを使う •
リアルタイムにランキングを更新でき る • 数万人規模でも大丈夫 • そのままでは同率順位を表現できない Copyright © Drecom Co., Ltd.
40.
Case9 double submit protection
Copyright © Drecom Co., Ltd.
41.
double submit protection •
二重送信を検知してくれるplugin • 二重送信を防ぎたいフォーム(orリンク) のあるページでsessionにtokenを保存 し、パラメータにも同じ物をつける • 次のページでは両者を付きあわせて、 session内のtokenを無効にする Copyright © Drecom Co., Ltd.
42.
sessionの罠 • Railsのsessionの扱いではまった • レスポンスを返すまでsessionの実体が
更新されない! • 処理に時間がかかるとすり抜けてしま う Copyright © Drecom Co., Ltd.
43.
処理の流れ user
app session memcache request load write ココが問題 response write Copyright © Drecom Co., Ltd.
44.
対策 • レスポンス返すまで待っていられない のでsessionを使うのをやめる •
pluginに手を入れてtokenをRedisに保 存するように変更 Copyright © Drecom Co., Ltd.
45.
Case10 daemon-spawn +
resque Copyright © Drecom Co., Ltd.
46.
daemon-spawn • rubyプログラムをデーモン化するため のライブラリ •
resqueのworkerをデーモン化した時に 問題が起こった Copyright © Drecom Co., Ltd.
47.
何が起こったか • rails runnerで起動していた •
redisへのコネクションを張るpluginが あった • forkするときにコネクションがコピー されて全workerで共有されてしまい redisへの接続が不安定に Copyright © Drecom Co., Ltd.
48.
対策 • rails runnerを使わなくした •
自前で必要なものをrequireするスクリ プトに書き換え Copyright © Drecom Co., Ltd.
49.
もうひとつの問題 • stopした時に処理中のプロセスが落と される •
処理中ステータスの変なデータが残っ てしまった Copyright © Drecom Co., Ltd.
50.
原因 • daemon-spawnのstop時のシグナルが デフォルトではTERM •
rescueはTERMを受け取ると処理中で も即終了してしまう Copyright © Drecom Co., Ltd.
51.
対策 • daemon-spawnの起動スクリプトで明 示的にQUITを指定した
• ドキュメントに載ってない • 実装を読んでみて指定できることがわ かった Copyright © Drecom Co., Ltd.
52.
まとめ • 社内ではまった例をご紹介しました • pluginではまったときは実装を追いか
けることも必要 Copyright © Drecom Co., Ltd.
53.
ご清聴ありがとうございました
Copyright © Drecom Co., Ltd.
Notas do Editor
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n