【RoR】Ruby on Rails Part16
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2013/01/31(木) 08:07:31.27ID:GGHiBszvhttp://kohada.2ch.net/test/read.cgi/php/1341589839/
http://unkar.org/r/php/1341589839
■参考サイト
<英語>
本家:http://rubyonrails.org
API document:http://api.rubyonrails.com/
開発者のblog:http://weblog.rubyonrails.org/
参考wiki:http://wiki.rubyonrails.org/rails
http://ruby-toolbox.com/
http://rubygems.org/
http://agilewebdevelopment.com/plugins/top_rated
<日本語>
Rails' wiki: http://wiki.fdiary.net/rails/
http://doc.ruby-lang.org/ja/1.9.3/doc/index.html
0577nobodyさん
2013/08/08(木) NY:AN:NY.ANID:x7tUE+P1http://www.mongohq.com/pricing
Plans and Pricing | MongoLab: MongoDB-as-a-Service
https://mongolab.com/products/pricing/
0578nobodyさん
2013/08/08(木) NY:AN:NY.ANID:???ならどうして最初からすべてmongodbでやらないの?
mongodbはMySQLに比べて
圧倒的に早いんだよね?
自分の認識では
mongodbってmemcachedの
フラグメントキャッシュみたいに
キーと内容だけを保持するシンプルなもの
なんだけどあってる?
だからこそ使い勝手が悪いから
単純なところのテーブル(DB)だけを
mongodbで実装
あってる?
0579nobodyさん
2013/08/08(木) NY:AN:NY.ANID:???そんなにメリットあるかいな?
使えるgemはほとんど未対応だろうし
0580nobodyさん
2013/08/08(木) NY:AN:NY.ANID:???ずいぶんとまぁ印象だけで語ってるなぁ
0581nobodyさん
2013/08/08(木) NY:AN:NY.ANID:???mongodbはスキーマレスな上に、各々が配列やハッシュを持てるからRDBSよりも自由度がはるかに高い
書き込み性能は段違いだが、読み込み速度は大差ないか劣る可能性もある
最大の弱点はトランザクションが効かないことで、テーブル構成が複雑で整合性が必要な箇所には使われない
だから使い分けが必要なの
わかる?
0583nobodyさん
2013/08/08(木) NY:AN:NY.ANID:???RoRでirbを使用してデバッグしているのですがhelperのメソッドを更新してreload!を実行したのですが、更新がされず毎回exitして再度irbを立ち上げてる状況です。
すでに定義済みのメソッドの中身を書き換えてもreload!では反映されないのでしょうか?
0584446
2013/08/10(土) NY:AN:NY.ANID:OMYv+fV8質問させていただいた件、解決しました。
書込みができなかったのでお礼が遅れてしまいましたが、ありがとうございました。
0585nobodyさん
2013/08/12(月) NY:AN:NY.ANID:???| id. | language |typed│
|001| Ruby │ 0│
|002| Perl │ 0│
|003| Python │ 0│
|004| C++ .│ 1│
|005| Java │ 1│
こんな感じの検索結果を受け取ったときに、そこで更にtypedによってレコードを分割したいときは
どうすればいいでしょうか
0586nobodyさん
2013/08/13(火) NY:AN:NY.ANID:ZYgjO/1Sのようにして >>585 の結果を得ているとする。
A: DBから別々に取ってくる
result はActiveRecord::Relation のインスタンス(まだ配列は返ってきていない)だが、
これはさらに条件を . でつなげることが出来る。この場合、ANDで条件を追加する形になる。
typed = result.where(typed, 1)
typeless = result.where(typed: 0)
2つの変数ともに Relation のまま(= 必要になるまでSQLは実行されない)。
必要なら to_a とか。大抵ぎりぎりまで Relation のままでOKなはず。
B: Rubyレベルで分ける。
こっちだと、SQLを実行してレコード一式読み込んでから、メモリ内で分ける。
B-1: Enumerable#partition を使う
2つに分けるなら partition が使える。
typed, typeless = result.partition{|x| x.typed == 1 }
B-2: Enumerable#group_by を使う
lang_groups = result.group_by {|x| x.typed }
typed = lang_groups[1]
typeless = lang_groups[0]
0587nobodyさん
2013/08/13(火) NY:AN:NY.ANID:ZYgjO/1Sアプリ生成後のREADMEによれば、 reload! でリロードされるのはコントローラと
モデルのコードだけのような。
0589nobodyさん
2013/08/15(木) NY:AN:NY.ANID:9ap0WrHOhttp://blog.f-secure.jp/archives/50708704.html
http://jp.wsj.com/article/SB10001424127887323338404579001681390701184.html
0590nobodyさん
2013/08/16(金) NY:AN:NY.ANID:???そんなに速度が変わりますか?
プリコンパイル実行で毎回5分ほど待たなきゃいけないし
画像一つ追加するのにこれだけ大変だから気になりました
画像一つフォルダにつっこんで
イメージタグを記述のほうが楽ですので。
0591nobodyさん
2013/08/16(金) NY:AN:NY.ANID:???0592nobodyさん
2013/08/16(金) NY:AN:NY.ANID:???0593nobodyさん
2013/08/16(金) NY:AN:NY.ANID:???下記のエラーがどうしてもわかりません。
ActionController::RoutingError (uninitialized constant CommentsController):
環境はruby:2.0,rails:4.0です。
環境が新しくなったことの弊害だと思うのですが、どなたか教えていただけると有り難いです……
ちなみにrake routesでルーティングはしっかりできているように見えます
0595593
2013/08/16(金) NY:AN:NY.ANID:???失礼しました。
下記がソースです、見られるでしょうか。
https://github.com/248/rails_blog
RoutingErrorが出ているものをコミットしてあります。
0600nobodyさん
2013/08/17(土) NY:AN:NY.ANID:???コントローラの名前が間違ってる。
coments_controller.rb
↓
comments_controller.rb
0602nobodyさん
2013/08/17(土) NY:AN:NY.ANID:???って書いてあるんだからもうちょっと注意してたら分かったかもね!頑張って!
0603nobodyさん
2013/08/17(土) NY:AN:NY.ANID:LZQA7c0bActionController:: RoutingError(定数CommentsControllerを初期化されていない):
翻訳
http://translate.google.co.jp/
0604nobodyさん
2013/08/17(土) NY:AN:NY.ANID:???【芸能】女優の日南響子(19)、車にひかれ一時意識不明に 「フラフラと放心状態、車道に自ら入って行ったようにも見えた」と目撃談★2
http://awabi.2ch.net/test/read.cgi/mnewsplus/1376716736/l50
0605nobodyさん
2013/08/19(月) NY:AN:NY.ANID:???https://blog.twitter.com/2013/new-tweets-per-second-record-and-how
0606nobodyさん
2013/08/19(月) NY:AN:NY.ANID:???http://www.atmarkit.co.jp/news/201004/19/twitter.html
RORのままアーキテクチャの変更で10000%高速化したとな。
ttp://b.hatena.ne.jp/entry/highscalability.com/scaling-twitter-making-twitter-10000-percent-faster
ミニブログの Twitterのstats(統計)データ。
http://kaworu.jpn.org/kaworu/2008-01-16-2.php
- 350,000を超えるユーザ。
- 秒間600リクエスト
- 平均毎秒200-300コネクション。最大時は秒間800コネクション
- MySQLは秒間2,400リクエストを処理する
- 180のRailsインスタンスがある。MongrelのWebサーバを使っている。
- 1つのMySQLサーバ(1つの大きな 8コアのサーバ)と1つのスレーブ。スレーブは、統計とレポートのための読み込み専用(リードオンリー)。
- 雑用処理をするための30+のプロセス
- 8台のSun X4100s
- Railsでのリクエストの処理時間は200 msec
- データベースにかかる時間の平均は、50-100 msec
- 16GBの memcached
0607nobodyさん
2013/08/19(月) NY:AN:NY.ANID:???viewで適用させる方法は分かるけど
controllerで判断させるにはどうすればいいの?
やっぱりあらかじめ
localeファイルに各文章を格納してて
それをコントローラーで読み込まなきゃダメ?
0608nobodyさん
2013/08/19(月) NY:AN:NY.ANID:???多言語対応させたいってこと?
0609nobodyさん
2013/08/19(月) NY:AN:NY.ANID:/LpY+15W0610nobodyさん
2013/08/21(水) NY:AN:NY.ANID:???javascriptのコードを他人にパクられるのを防ぐ抑止力になる?
0611nobodyさん
2013/08/21(水) NY:AN:NY.ANID:???関係ない部分含めて丸パクされたら結局パクられるからならないともいえるかもしれない
0612nobodyさん
2013/08/21(水) NY:AN:NY.ANID:???関係ない部分も含めて丸パクってどういう意味?
javascriptをパクられなくするのって無理だよね
0613nobodyさん
2013/08/21(水) NY:AN:NY.ANID:???precompileするとコード全部ひとまとめにされるじゃん?
それ丸ごとコピペすればパクることができるじゃん?
って言うアホみたいな意味しかないです
あくまで抑止力って話でしょう
0614nobodyさん
2013/08/21(水) NY:AN:NY.ANID:???パクられてもいいようなものしか書かない
あとは工夫してサーバーサイドと組み合わせて何とかする
0615nobodyさん
2013/08/21(水) NY:AN:NY.ANID:???>>614
ありがとうございます
たとえば、とあるサイトのhtmlソースを取得して
その中からクレイピングするのを
javascriptで実施したら
とあるサイトに残るアクセスログのIPはクライアントPCのIP
サーバーサイドで実施したら
とあるサイトに残るアクセスログのIPはサーバーPCのIP
という認識であってますでしょうか?
0616nobodyさん
2013/08/23(金) NY:AN:NY.ANID:cyaglvKCこれがコンパイル通りません
どうしてでしょうか
0617nobodyさん
2013/08/24(土) NY:AN:NY.ANID:???<%= %> の中は Ruby のコードを書く
"<%= @hoge %>" は Erb のコード
@hoge.to_s に直せ
0619nobodyさん
2013/08/24(土) NY:AN:NY.ANID:???いったんPOSTしたあと、ブロウザを更新してしまうと、
またPOSTさせてしまうことになります。
POSTさせたあとは、ヘッダーを書きかえるとかはRailsでは可能なんでしょうか
0620nobodyさん
2013/08/24(土) NY:AN:NY.ANID:c/4DiZCS0622nobodyさん
2013/08/25(日) NY:AN:NY.ANID:???たとえばRecordモデルの中に
integerのカラム「time」があったとします
timeにはマラソンの結果タイムが秒単位で格納されます
一時間の場合→3600 (1時間)
そのときに
3600→ 01:00:00
1815→ 00:30:15
のように変換して表示させたいです。
そこでapplication_helperに変換用の関数を作りました。
しかし、1ページ内で1000レコードを表示するとしたら、
ページのロード時に関数の呼び出しが毎回1000回行われ計算されます。
これは現実的ではないですよね?
それとも、このくらいの計算ならhelperでも問題ないですか?
�@helperで関数呼び出し表示
�Aレコードが作成される時点で表示用stringカラムを準備しておいて保存→表示時はこれを表示
どちらの設計手法が一般的か教えていただければ幸いです。
0624nobodyさん
2013/08/25(日) NY:AN:NY.ANID:???ありがとうございます
処理負荷コストで考えるべきは
mysqlなどデータベース関連のクエリくらいですか?
だからcountとかはカウンターキャッシュで処理?
rubyの演算だけで処理できる部分はhelperでOK!くらいの考えでいいですか?
0625nobodyさん
2013/08/25(日) NY:AN:NY.ANID:???ただ1000レコード表示(helperの関数を1000回呼び出し)されるわけですが
仮にこのページを1000人が同時に開こうとする場合
1000人×1000回計算→100万回の計算が行われますよね
これでも�@のhelperに頼るやり方が正攻法ですか?
0626nobodyさん
2013/08/25(日) NY:AN:NY.ANID:+qyGnGohPremature optimization is the root of all evil. --D. E. Knuth
0628nobodyさん
2013/08/25(日) NY:AN:NY.ANID:???データの完全性という点でも、安易に表示用カラムを追加することは
お勧めできません。
大きなお世話でしょうが、私ならまずは1ページに1000レコードを
表示する設計の方をどうにかします。
0631nobodyさん
2013/08/26(月) NY:AN:NY.ANID:???シーク時間はシーク範囲によって異なりますが、仮に 5ms とした場合、並列でI/Oを出せない IDE では 200 IOPS が限界となります。
http://pc.casey.jp/archives/153904156
http://e-words.jp/w/IOPS.html
Amazonクラウド、2テラバイトのSSD、60GBメモリ搭載で12万IOPSを実現するインスタンスを発表 − Publickey
http://www.publickey1.jp/blog/12/amazon2ssd60gb12iops.html
0632nobodyさん
2013/08/26(月) NY:AN:NY.ANID:???Book.joins(:author).where("authors.name = ?", name).order(:created_at)
上記のようなのを高速化したくてBookにauthors_nameというカラムを追加したのですが。
0633nobodyさん
2013/08/26(月) NY:AN:NY.ANID:ETC/yj1b0634nobodyさん
2013/08/27(火) NY:AN:NY.ANID:???カラムを追加した方はindexを利用出来てます。
0635nobodyさん
2013/08/27(火) NY:AN:NY.ANID:rt0S8jbJhttp://itpro.nikkeibp.co.jp/article/COLUMN/20110606/361088/
0636nobodyさん
2013/08/28(水) NY:AN:NY.ANID:???データ量次第だけど、あまりそこで正規化崩したくないなぁ。
本-著者の関連テーブルにインデックス張ればなんとかなったのでは感も。
0637nobodyさん
2013/08/28(水) NY:AN:NY.ANID:???Author.where(name : name).books
みたいに二回クエリ投げる方が早かったりするかも。
0638nobodyさん
2013/08/28(水) NY:AN:NY.ANID:72lLJVGO<div class="hoge">Hoge</div>
<% end %>
これを一行で書く方法はないのでしょうか。
<%="<div class='hoge'>Hoge</div>" if value %>
としたらエラーが出ました。
0639nobodyさん
2013/08/28(水) NY:AN:NY.ANID:Me59r7Ml<%= render partial 'hogediv' if value %>
0640nobodyさん
2013/08/28(水) NY:AN:NY.ANID:Me59r7Ml0641nobodyさん
2013/08/28(水) NY:AN:NY.ANID:???ほれ一行
0643nobodyさん
2013/08/28(水) NY:AN:NY.ANID:???ありがとうございます。
mysql だと複数のテーブルから検索したり並べ替えすると
explain で using temporary, using filesort が出ちゃうんですよね。
検索すると正規化を崩すしかないと書かれていた・・・
よくある問題だと思うのでどう対処されてるのか知りたかったんです。
0644nobodyさん
2013/08/28(水) NY:AN:NY.ANID:???value を定義したら >>638 のままで動いたよ。rails4。
ただ html_safe しないとエスケープされた。
<% value = true %>
<%="<div class='hoge'>Hoge</div>".html_safe if value %>
0645nobodyさん
2013/08/29(木) NY:AN:NY.ANID:z/QhLx6C本当に異次元に低レベルの質問で恐縮なのですが、
ここで使われているファイルを一覧できるツールというのは、
例えばどういったものがオススメなのでしょうか?
というか、私は、このツールに辿り着いていません。
深夜・週末起業家というのもあって気持ち悪い程低レベルかもしれませんが、宜しくお願い致します。
0646nobodyさん
2013/08/29(木) NY:AN:NY.ANID:z/QhLx6C自己解決しました。
失礼いたしました。
0647nobodyさん
2013/08/29(木) NY:AN:NY.ANID:z/QhLx6C解決してませんでした。
すみません。
0648nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???ボクはWindowsでもLinuxでもemacsのdiredで確認してます。
もう少しコンピュータ全般の事を学んでからじゃないと
railsに限らずサイトを作るのは難しいかもしれません。
0649nobodyさん
2013/08/29(木) NY:AN:NY.ANID:z/QhLx6C仰る通りですね。先にアイディアが浮かんだので手当り次第にプログラム関係本を読んではいますが、教養的に幅広く習得するにはかなりかかりますね。
実の所、今日、webrickを開けたばかりです。
dired含め調べてみます。ありがとうございました。
0650nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???小規模ならrailsよりsinatraの方がシンプルで良いかもしれません。
0651nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???>>637みたいに著者で絞り混んで、著者の本を取ってくるっていう二回クエリ投げるのはどうよ。
これはjoinする訳じゃないからMySQLでも十分早いはずだよ。
DB⇔rails間がネットワーク的に細かったり遠かったりという事情がない限りこれで問題ないかと。
0652nobodyさん
2013/08/29(木) NY:AN:NY.ANID:ZEP+9UcVspeakerdeck.com/mirakui/high-performance-rails-long-edition
0653nobodyさん
2013/08/29(木) NY:AN:NY.ANID:ZEP+9UcVel.jibun.atmarkit.co.jp/rails/2011/09/web9-1e8b.html
スタートアップ企業で8年間Webの開発をしてみての反省点いろいろ - Masatomo Nakano Blog
独自フレームワークはやめよう
6. サーバ周りの人材をしっかり確保しよう
b.hatena.ne.jp/entry/blog.madoro.org/mn/84
Ruby on Rails が簡単というのはウソ - #生存戦略 、それは - subtech
subtech.g.hatena.ne.jp/secondlife/20120309/1331279496
0654nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???みたいなことをしてUser群を抽出しても
レンダーするときに再び
User1レコードごとにsqlクエリを吐き出してるっぽいです。
これはどうしてですか?
お陰で体感ロード時間が遅いです。
ロード時間をマシにするなら
joinsの代わりにincludesとかを使うんでしょうか?
0655nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???joinsは上の例で言うとprofileのカラムから検索"だけ"したい時に使う。
includesでも検索出来るけど、rails4からはreferencesを指定しないと警告される。
0656nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???ありがとうございます
例えば世界中のサッカーリーグで考えると
Country (それぞれの国)
Team (プロリーグのチーム)
User (プロサッカープレイヤー)
Profile (プレイヤーの詳細プロフィール)
Mvp (国を代表するトップ選手)
の5つのモデルがあるとします
Countryは複数のTeamを持っています。
同様に国ごとで
複数のMVP(プレイヤー)を持っているとします。
Teamには複数のUserが所属していて、
Userはそれぞら1つのProfileをもっていたとしたとき
国単位で見たときにこれら全てをincludesするなら
@coubtry = Country.find(params[:id]).includes(teams: [users: [:profiles]], mvps: [users: [:profiles]] )
のようにすればいいのでしょうか?
0657nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???includes(:teams => {:users => :profile}, :mvps => {:users => :profile})
0658nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???Country.includes(hogehoge).find(1) となりますね。
0659nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???>>658
ありがとうございました
非常に参考になります
試してみたところ
なぜか変更以前よりロード時間が長くなりました
sqlの数は明らかに減ってるんですが。。。。
こういうこともあるんですね。
0660nobodyさん
2013/08/29(木) NY:AN:NY.ANID:???それだと問題なくindexも使えますね。
ベンチマークでは、最初に作者を検索するのことを除外すれば
カラムを追加したのと同程度の結果になりました。
ただ、元になる作者が複数、たとえば
Author.where(sex: "man") これらの本が欲しいとなると・・・
0661nobodyさん
2013/08/30(金) NY:AN:NY.ANID:???あんま知られてないけどあった気がするが…思い出せん
0663nobodyさん
2013/08/31(土) NY:AN:NY.ANID:pHhaBgx0先輩諸氏に感謝しております。
今後もお世話になるかと思いますが宜しくお願い致します。
0664nobodyさん
2013/09/01(日) 21:16:06.01ID:???完了でsaveメソッドを呼び出す前に確認の時点でバリデーションを行い、エラーメッセージを出力したいのですがどうしたらいいでしょうか
new→valid?メソッドでバリデーションの成否自体を行うことはできるのですが、エラーメッセージの出力がわかりません
0665nobodyさん
2013/09/01(日) 21:25:12.30ID:???下のリンクを読めば簡単でしたね
ttp://yoshitetsu.rackbox.net/active_record_validations.html
0666nobodyさん
2013/09/02(月) 07:55:13.98ID:???0667nobodyさん
2013/09/02(月) 10:56:10.90ID:???キャッシュ関係がよく分からない
0668nobodyさん
2013/09/03(火) 03:13:00.11ID:???記法やモデルのメソッドが追加されたり小さな変更はそこそこあるけど、確かに大きな変更点はあまりない印象だね
というよりRails自体が成熟してきてるのが原因だと思うが
0669nobodyさん
2013/09/03(火) 07:33:17.72ID:???cakephpのほうが体感的に早くない?
0670nobodyさん
2013/09/03(火) 08:33:07.31ID:???masterブランチにもないし、今後も取り込まれそうにない?
0671nobodyさん
2013/09/03(火) 08:56:33.25ID:???ちなみにCakeはPHPフレームワークの中では最遅の部類
0673nobodyさん
2013/09/03(火) 21:39:32.25ID:LahgdGM9Rails3.2では、assets/javascripts以下に配置された.jsは基本的に全て読みこまれるんですよね?
とりあえず、Rails側からデータをassets/javscripts/***.jsに渡したいのですが、
その場合、HogeControllerが、hoge.html.erbに書いた<%= @hoge.json %>にまずJSON形式でグローバルスコープで書きだしてから、
assets/javscripts/***.jsからその書きだしたJSONを参照するしかないのでしょうか?
この方式を採用したら、ユーザーが現在見ているHTMLのソースに
{"name": "Hoge", "age": Hage } とかデータがそのままべた書きされてしまうのでできれば避けたいのですが・・・
他に何かいい方法はありますか?
0674nobodyさん
2013/09/03(火) 22:13:36.80ID:08+4VxZe今後どうなるかは分からんけど、 rails-queue という gem に切り出されているのを
3.2 で使っている。
>>673
JSONを吐くリソースURLを用意して、JSからそこにリクエストすればいいのでは?
0675nobodyさん
2013/09/03(火) 23:23:49.53ID:???それもいいかもしれませんが、
実はHogeControler#indexの中で既にそのレコードは呼び出していて、そこからhoge.erb.htmlだったり、.jsだったりが描画されるんです。
それだったら、.jsからまた改めてそのレコードを呼びだすAPIを叩いてレコードをまた読み込むよりは、
HogeControler#indexが終わって、Viewをレンダリングするときに、そのレコードをViewに渡したほうがよくないでしょうか・・・・
もちろんそう重いクエリではないので、二度クエリを実行してもそこまでパフォーマンスは低下しませんが・・・
0676nobodyさん
2013/09/04(水) 00:06:31.28ID:???Viewに渡して処理していいなら、それでいいと思うよ。
最初に>>675がjsに渡したいって書いたから>>674のような答えになるわけで。
■ このスレッドは過去ログ倉庫に格納されています