【RoR】Ruby on Rails Part18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2014/01/11(土) 20:04:00.68ID:???http://kohada.2ch.net/test/read.cgi/php/1382097427/
http://unkar.org/r/php/1382097427/
■参考サイト
<英語>
本家: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
0352nobodyさん
2014/06/02(月) 01:04:22.83ID:cdjAC42fすんません。ざっくりとしかイメージがわいていないのでw
国内対応だけだったら駅と緯度経度データベース作って、距離検索でしょうけど。グーグルとかの最寄駅はどういうアルゴで出るのかね。
海外対応までしようと思ったらグーグル使わんとにっちもさっちもいかんのか。
経験者がいれば、ざっくりとした回答が欲しかった
0353nobodyさん
2014/06/02(月) 17:13:24.71ID:???表示中のランドマーク取得でいけそう
0354nobodyさん
2014/06/02(月) 21:41:15.02ID:IKV43VQr<label>の生書きでなく、f.labelを使ってできませんか?
この方が書いてるもう一個の方法はできるのですが、labelのブロックで色々大きさとか調節したいんです。
http://gpsoft.dip.jp/hiki/?Rails%A4%C7%A5%C1%A5%A7%A5%C3%A5%AF%A5%DC%A5%C3%A5%AF%A5%B9%A4%CE%A5%E9%A5%D9%A5%EB%A4%F2%A5%AF%A5%EA%A5%C3%A5%AF%A4%B9%A4%EB
•<input>を<label>の子要素とする
<label><input type="checkbox" name="check1" />Check1</label>
0355nobodyさん
2014/06/03(火) 08:00:47.64ID:???すればいいじゃん
0356nobodyさん
2014/06/03(火) 08:59:59.19ID:???http://dev.classmethod.jp/smartphone/swift/
米アップル、iOSアプリの新開発言語にSwiftを導入
http://ggsoku.com/2014/06/ios-8-swift/
米アップルは2日(現地時間)、iOS 8に新開発言語「Swift」を導入すると発表した。
Swiftは非常に軽快に動くことが特徴であり、Objective-CとC言語の中間に位置するようなイメージであるという。
コード体系はC言語を踏襲。
CocoaやCocoa Touchに対応することはもちろん、LLVMコンパイラを利用してビルドされる。
LLVM
http://ja.wikipedia.org/wiki/LLVM
LLVM とは、コンパイル時、リンク時、実行時などあらゆる時点でプログラムを最適化するよう設計された、任意のプログラミング言語に対応可能なコンパイラ基盤である。
LLVM は、JavaとJava VMの関係のように、まず仮想機械をターゲットとした中間コード(ビットコード)を生成し、その仮想機械向けコードを特定のマシンの機械語に変換する。
playgrounds を使うとインタラクティブに実行できる。
https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/Art/largeshot_2x.png
0357nobodyさん
2014/06/03(火) 12:38:52.70ID:???0358nobodyさん
2014/06/03(火) 17:17:13.70ID:???コントローラのメソッドから特定の返り値を取得したいのですが、
stubを使って書く際のObjectをどのように指定したら良いか分かりません。
[ここに何かが必要だと思うけど分かりません].stub(:method).and_return(value)
スタブで取得することは可能でしょうか?
可能な場合どのようにオブジェクト指定したらよいのでしょうか?
0359nobodyさん
2014/06/03(火) 20:38:27.53ID:Ip12GRTVえぇ、それはできますよ。
>>354にある通り、ラジオボタンやチェックボックスを内包したラベルを作りたいのです。
これがrailsから導く方法が難しいんですよね。
0361nobodyさん
2014/06/04(水) 19:29:38.02ID:6xizC0Eiなるほど。なかなかハードル高そうですが、手っ取り早く記述だけで何とかなるもんじゃないんですね。
先の例のもう片方のように。
0362nobodyさん
2014/06/04(水) 20:10:21.69ID:???<% f.label 'check1' do %>
<font size=7>Check1</font>
<% end %>
0363nobodyさん
2014/06/04(水) 21:51:45.24ID:efQEBuMUありがとうございます!!!!!
さすがです!!
0364nobodyさん
2014/06/06(金) 05:18:00.21ID:???今までDeviseとconfirmableを使い
メール認証のみで会員登録制度を強いてきました。
しかし、この度OmniAuthを使い
FacebookやTwitterを利用し当サイト利用の敷居を低くしようと思っています。
しかし気になる問題があります。
今までは会員登録だったため
登録が行われると
UserテーブルにUserレコードが生成され
且つ関連テーブルのProfileにもレコードが出来ていました。
Userには登録メアドのemailカラムを含め、アカウント名であるaccountカラムが、
Profileにはニックネームのnicknameカラムなどがあります。
そして、会員が投稿すると、これらアカウント名やニックネームが表示されたり、
サイト内でのメッセージのやりとりはemail宛へ転送されます。
もし、facebookやtwiter認証した場合はこれらは全てnilになりますよね?
OmniAuthで認証した会員の場合はUserレコードやProfileレコードは生成されませんよね?
となると、何を元に誰が投稿したのか?といったものを取得できるのでしょうか?
0365nobodyさん
2014/06/06(金) 05:59:22.66ID:???0366nobodyさん
2014/06/06(金) 06:25:27.83ID:???そこらへんをどうするかイマイチぴんと来ていません
調べたところOmniAuthでもTwitterの場合だとメアドが取得できないみたいなので
どのようにして正しいメアドを取得してUserテーブルのemailカラムに格納するか?
今までの数千に渡るユーザーのuid(ユニーク)はどうするかなど
似たようなこと(deviseのメール認証必須会員登録制→OmniAuthでTwitter、Facebookでも登録できるように)をしたことある人がいたらアドバイスをください
0367nobodyさん
2014/06/06(金) 06:34:40.87ID:???初ユーザーが訪問
↓
Facebookアカウントで登録ログイン
↓
トークンごしに取得できたauth['name']など
ユーザーの各種情報を利用して
Userレコードを追加(メール認証しなくてオーケー)
それ以降のコールバックについては、userレコードが存在する場合はuserレコードの追加は行わず
ただのログイン処理だと見なす
ただし、この場合Twitterだけメアドが手には入らないから切り分けが必要そう。。。。
そもそも登録の際にニックネームとメアドしか聞いてなかったから
Twitter認証してメアド登録してもらうほうが手間がかかってしまう気がする。。。。
0368nobodyさん
2014/06/08(日) 10:47:59.45ID:???なんらかのリンクをクリック
非同期通信
結果を表示
という事をよくやるのですが、大抵のサイトではクリックしたあとにグルグルと画像が回ると思います
これをRailsでやろうと思うとjqueryで無理やりフックしないとダメですか?なにかしらスマートな方法がないかなーと考えていたのですが
0369nobodyさん
2014/06/08(日) 13:59:51.28ID:???0370nobodyさん
2014/06/08(日) 14:19:06.97ID:???0371nobodyさん
2014/06/08(日) 14:27:10.31ID:???0372nobodyさん
2014/06/11(水) 12:14:10.18ID:???アクティブユーザーがそこそこ賑わっていて常にユーザー情報の更新や
投稿が行われるサイトは
よーく設計してdalliとかredisを使いつつページキャッシュやフラグメントキャッシュも使いこなさないと激重くない?
indexとかも貼るべきには貼ってるし検索とかはsolrを使ってる
しかし糞重い
ページがサクサクロードできるようなサイトって
変更あったら書き出してページキャッシュか何かにしてんの?
さくらVPS SSD2GB 2コアを使ってても
こんなに遅く感じる
0373nobodyさん
2014/06/11(水) 13:54:35.52ID:???何が重いの?プロファイリングしてみた?
Railsで重いサイトは大体は集約関数周りでこけてることが多いな
ページキャッシュはある程度の規模からやってるとは思うけど
フラグメントキャッシュまでやってるところはあまりなくね?
0374nobodyさん
2014/06/11(水) 15:08:34.00ID:???miniprofiler使ってる
時間がかかってるのは
複数のテーブルを紐づけて
関連先のカラムでソートかけて取り出したりとかが重いね
それにロードするごとに沢山のコードが動く
会員制だから仕方ないよね
ちなみに会員制敷いてると
ページキャッシュ無理じゃね?
0375nobodyさん
2014/06/11(水) 15:15:12.82ID:???カウンターキャッシュみたいに
countカラムを用意するのが定石?
そしてメッセージの送信後に送信先相手のcount件数を計って更新ってな具合にすべきかな?
0376nobodyさん
2014/06/11(水) 15:53:19.51ID:???各会員専用が主だとページキャッシュは無理だね
一部なら、そこだけ非同期にしてキャッシュする
MySQLかな?JOIN先ソートとか苦手だけど、それが重いなら対処すべきよ
きちんとインデックス使われてるのかね?
たくさんのコードってSQL?会員制だから仕方ないとかは内容次第だろうね
共通部分をできる限りキャッシュするしね
0377nobodyさん
2014/06/11(水) 20:13:40.78ID:???0378nobodyさん
2014/06/11(水) 20:36:00.81ID:???一部ならそこは非同期ってなると
結局フラグメントキャッシュになるよね?
>>376, >>377
そうMySQL
きちんとインデックスって
これらを守ってインデックス貼ってるんだけど
・○○○_idなどアソシエーションに使われるカラムには全てindexを貼っている
・検索対象となるカラムには全てindexを貼っている(且つsolrを利用)
0379nobodyさん
2014/06/11(水) 20:36:33.73ID:???0380nobodyさん
2014/06/11(水) 20:37:05.37ID:???そんなに早いの?
ニコ生みたいにリアルタイムで更新されまくるような仕組みもイケちゃう系?
0381nobodyさん
2014/06/11(水) 20:38:21.89ID:???SQLクエリ見たところで
何がボトルネックになって
こんなに時間がかかってるのか分からない
1つのコード実行した、それだけでも時間がかかりまくってるし
0382nobodyさん
2014/06/11(水) 20:40:37.57ID:???非同期部分を除いてキャッシュするって意味
フラグメントキャッシュは概念全然別
>>381
時間がかかっていることが多いSQLの実行計画を見るのは定石
0383nobodyさん
2014/06/11(水) 21:41:42.39ID:???0385nobodyさん
2014/06/12(木) 05:44:15.06ID:???キャッシュも殆ど使ってないしリアルタイム制すごい高いけど余裕で400ms以内で返せてる
Railsが悪いんじゃなくて設計が悪いんじゃない
何が遅いかも調べられてないのにスペックだけ良くしても意味が無いよ
0386nobodyさん
2014/06/12(木) 07:49:02.68ID:???例えば常にアクティブユーザーが100人いたとして
ツイートするごとにユーザーのポイントが加算されるような
究極のリアルタイム性の高い計算と更新が行われるような会員制だと
キャッシュなしじゃ厳しくないか?
0387nobodyさん
2014/06/12(木) 07:50:37.57ID:???ちなみに
apache?
nginx?
だとしたらMySQLの設定側(チューニング)に問題あるのかな
混んでないときでも
1ページ開くときにクエリ実行だけで1300msとかかる
重いページだと3000ms以上
どうなってんだー
0388nobodyさん
2014/06/12(木) 09:36:29.91ID:Jzl38UQKhttp://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
0390nobodyさん
2014/06/13(金) 10:36:58.72ID:???出力時になぜか
○○○.jpg?758856
みたいに訳の分からないパラメーターが勝手につくんだけと
これって無くせる?
0391nobodyさん
2014/06/13(金) 11:00:11.81ID:???0392nobodyさん
2014/06/13(金) 11:12:13.86ID:???えっ?
?173747みたいなのがつくとキャッシュされてるの?
assets使ってprecompileしてるから
?27447みたいなのが付くのかな
これが付くとgoogleの画像検索とかにヒットしなくなりそうじゃない?
0393nobodyさん
2014/06/13(金) 16:06:57.01ID:???Rails関係ないからこれはおまけだからな!
画像ファイルをキャッシュする設定にしていた場合ブラウザは
「キャッシュが残っていればそれを使うし、サーバーには問い合わせない」
から、サーバー上でファイルを変更してもその変更したファイルを取得してくれない
これは画像だけじゃなくてcssとかもそう。変更したのに変更されてない不具合の9割はこれ
その対策としてどうすればいいかというと
hoge-hoge.jpgってファイルを使っていたなら、ファイル名をhogehoge-hoge2.jpgみたいに変更すれば違うファイルとして扱われるからキャッシュを無視してリロードしてくれる
でも全ファイル毎回ちょこっとずつファイル名かえるなんて正気じゃないよな?
そこで、hoge-hoge.jpg?20140613みたいな感じで?とキーを送る、そうすると?以降だけ変えれば違う名前のファイルとしてキャッシュを取り直してくれるんだ
これによって俺らはファイル名を毎回変更するなんて手間をかけずにみんなに新しいファイルを届けられてるわけだ
んで、この手法はもう15年以上使われてるから画像検索うんぬんとかなんも心配しなくてもいい感じにやってくれるよ
0394nobodyさん
2014/06/13(金) 17:08:50.74ID:???非常にわかりやすい説明をありがとう
なるほどね前回のキャッシュを読み込ませないための工夫だったってことね
そして、Googleなど検索エンジンは
?以降は無視して画像をインデックス化していってくれてるってことか
ありがとう
0395nobodyさん
2014/06/13(金) 19:09:01.06ID:???turbolinksの素晴らしさと優位性を力説してもらえないだろうか?
0396nobodyさん
2014/06/13(金) 20:18:11.06ID:???リンクをクリックすると、ページ遷移ではなく Ajax でサーバにアクセスする
返ってきた結果から body 要素の内容だけ抜き出して置き換えてくれる
またブラウザのヒストリも書き換えてくれるので、戻るボタンもきく
スタイルシートやスクリプトを評価しなおさなくて済む分、早い
プログラマは上記の処理内容をほとんど意識する必要がなく、お手軽
0397nobodyさん
2014/06/13(金) 21:24:40.13ID:???ゲームサーバとしてJSONしか返さんのならrails3で十分?
0398nobodyさん
2014/06/13(金) 22:22:55.28ID:???0399nobodyさん
2014/06/14(土) 00:36:00.18ID:???どれくらい早くなるの?
俺の見解だと
Rails3みたいに違うページをロードしても
同じスタイルシートやjsが指定されていたら
キャッシュから読み込まれるから早い遅いをあまり感じなく思えるんだけど
0400nobodyさん
2014/06/14(土) 00:37:52.20ID:???それにページによってヘッダ内の読み込むjsを変えてる場合
それだとturbolinksは使えないってこと?
要は<head>内のスタイルシートやjsを固定して読み込みを早くしませんか?ってことだよね?
0408nobodyさん
2014/06/14(土) 09:50:36.58ID:???0410nobodyさん
2014/06/14(土) 12:24:13.21ID:???railsが遅い問題とturbolinksで解決できる問題は関係ない
turbolinksが解決してるのはクライアントサイドの速度
レスポンスが遅いのとスループットが低いのを混同する奴がいるけど
アクセスが少なくてもレスポンスの遅さは影響する
Railsが遅いのはRubyとアプリサーバの影響の部分が大きい
フレームワークの性能が悪くて遅いCakePHPなどとは一緒にしてはいけない
0411nobodyさん
2014/06/14(土) 13:16:46.10ID:???Rubyやアプリケーションサーバが覿面に効いてくるのは相当のアクセス数がある場合だけだよ
たいていはDBアクセスがネック
0413nobodyさん
2014/06/14(土) 13:59:30.64ID:???0414nobodyさん
2014/06/14(土) 14:11:20.22ID:???JSONに変換して返すだけの計測は健闘しているけども
DBが絡むとボロボロな結果が出てるよね
0415nobodyさん
2014/06/14(土) 14:13:35.20ID:???RubyのDBアクセスライブラリはほとんどCライブラリのラッパだよ
それがクソってことはCライブラリがクソってことかいな?
>>413
SQLでもパフォーマンスを出すためにはテクニックが必要なように、
ActiveRecordもパフォーマンスを出すにはそれなりのコツは要るね
0416nobodyさん
2014/06/14(土) 14:42:10.53ID:???「メッセージ受信ページ」を開くと、たった10件表示するだけなのに4秒近くかかります。
コードがシンプルなはずなのにページのローディングが遅すぎて問題点も特定できません。どこがネックになっているか分かる方はいらっしゃいませんか?
gem「mailboxer(https://github.com/mailboxer/mailboxer)」
-notifications 10万レコード
-conversations 10万レコード(上記テーブルと対にしている)
-receipts 20万レコード(上記テーブルにぶら下がる。つまり1つのconversations(メッセージ)に対し「送信者」と「受信者」の2レコードがぶら下がる)
上記3テーブルから構成。メッセージのやりとりを可能にするgemが「mailboxer」
これを利用して現在ログイン中の受信メッセージを表示する時に下記のように記述しています。
【コントローラ】
@messages = current_user.mailbox.inbox.page(params[:page]).per(10)
【ビュー】ここで表示しているのは送信者の名前と、送信者のプロフィールページへのリンク。題名とメッセージ詳細ページへのリンク。それと受信日時くらい
<% @messages.each do |m| %>
<tr <%= 'class=unread’ if m.is_unread?(current_user) %> >
<td><%= check_box_tag "id[]",m.id %></td>
<td>
<% if m.is_read?(current_user) %>
既読
<% else %>
未読
<% end %>
</td>
<td> <%= profile_link(m.last_sender) if m.last_sender != current_user %><%= "自分" if m.last_sender == current_user %> </td>
<td><%= link_to m.subject, show_messages_path(:id => m) %></td>
<td><%= today_datetime(m.last_message.created_at) %></td>
</tr>
0422nobodyさん
2014/06/14(土) 15:04:12.96ID:???とりあえず簡単に試せそうだからやってみた
@messages = current_user.mailbox.inbox.page(params[:page]).per(10).includes(:profile)
としたら下のエラーが出たよ
Association named 'profile' was not found; perhaps you misspelled it?)
テーブル名は100%間違えていない
profileテーブルはuserテーブルに属していて「nickname」などのカラムを持つ
なぜエラーになるんだorz
0426nobodyさん
2014/06/14(土) 23:41:06.34ID:???他の言語、フレームワークより高いみたいね
特に海外で
herokuが理由かね?
0427nobodyさん
2014/06/15(日) 06:42:29.71ID:4wiy7qvnhttp://b.hatena.ne.jp/entry/japan.zdnet.com/business-application/sp/35049207/
0428nobodyさん
2014/06/15(日) 18:32:22.22ID:???http://www.computerworld.jp/topics/601/
MySQLにはDDLトランザクション処理がないので、
http://www.infoq.com/jp/news/2009/05/heroku-provisionless-revolution
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.4.2 ロールバックできないステートメント
http://dev.mysql.com/doc/refman/5.1/ja/cannot-roll-back.html
0429nobodyさん
2014/06/15(日) 18:34:46.84ID:???http://www.excite.co.jp/News/column_g/20140402/Cobs_49962.html
バグ報告に対するMySQL(Oracle)とMariaDBの対応の違い | スラッシュドット・ジャパン オープンソース
http://opensource.slashdot.jp/story/13/09/11/0431225/バグ報告に対するMySQL(Oracle)とMariaDBの対応の違い
0430nobodyさん
2014/06/15(日) 21:18:37.12ID:???しかしphpにはフラレて
mysqlへの接続でGPLでないCライブラリが使えるのはphpだけってのも有名な話
0431nobodyさん
2014/06/15(日) 23:58:13.28ID:???0432nobodyさん
2014/06/16(月) 17:42:43.28ID:???0433nobodyさん
2014/06/16(月) 18:24:31.83ID:???0435nobodyさん
2014/06/16(月) 18:53:02.87ID:???http://tech.a-listers.jp/2014/06/16/dhh-won-lemans/
0436nobodyさん
2014/06/16(月) 20:07:18.06ID:???modelのカラムが全然違うものを無理やりくっつけて、cancanを使うと変になりますか?
model
・admin
・operator
に分ける場合、役割だけが違う。modelの基本的なカラムは大体同じ
・human
・dog
・bird
に分ける場合、基本的なカラムが違う。
これをcancanで分けると、、なんか難しくなる。
ちゃんと説明できてますでしょうか。。
0437nobodyさん
2014/06/16(月) 20:10:14.89ID:???0438nobodyさん
2014/06/16(月) 20:50:56.20ID:???一個一個送信処理書けばそれでいいってのはそうなんですが
0439nobodyさん
2014/06/17(火) 02:21:46.07ID:/dvue0X5ただINFO:Runnningテストファイル名しか表示されなくて、肝心のテスト結果がわからないんだけど、
これってどういうことなの?
0440nobodyさん
2014/06/17(火) 11:52:40.62ID:???何かライセンス問題があるのでしょうか?
MITライセンスですよ
0441nobodyさん
2014/06/17(火) 13:09:28.88ID:???http://nippondanji.blogspot.jp/2009/05/foss-license-exception.html
0442nobodyさん
2014/06/17(火) 23:45:27.91ID:???フォローしてるユーザーのタイムラインの表示ってかなり時間かかっちゃうと思うんですがいい方法ありませんか?
User
id:
account:
Follow
id:
user_id:
follow_id:
Tweet
id:
text:
user_id:
こんな感じのDBだとして
user_ids = Follow.where(user_id: session[:user_id]).select("follow_id")
tweet_list = Tweet.where(user_id: user_ids).order("id DESC")
こういうふうに取得してるんですが取得するデータが増えてくるとめちゃくちゃ重くなります
0445nobodyさん
2014/06/18(水) 08:48:35.40ID:???0446nobodyさん
2014/06/18(水) 11:01:55.47ID:???受託開発でもmysqlを使用するだけであればライセンスは問題ないと思っていました
大体をライセンス譲渡としているので問題なさそうです。他はGPLにすれば良さそうです。無理ならばmysql2をやめる選択でしょうか
0449nobodyさん
2014/06/18(水) 15:32:05.66ID:???- 8台のSun X4100s
- 16GBの memcached
で解決かw
0450nobodyさん
2014/06/18(水) 15:33:31.99ID:???こんなレベル
0451nobodyさん
2014/06/18(水) 17:50:58.41ID:???■ このスレッドは過去ログ倉庫に格納されています