プログラミング学習記録ブログ

ちなみに、外国人なので、日本語が少しおかしいかも、、すみません

Railsにおける、findとwhereの違い

 showupdateなど、よく使われる.findなんですが、最近.whereというメソッドの存在を知りました。
 使ってみたら、.whereのほうが配列としてreturnしてくるが、.findならそうreturnしてこないらしい。。。。これで、複数のデータなら.where、個別なら.findでいいのかな?と思い、ネットで調べてみたら、違いはありました。。(今までの憶測はなんだろう=)

  • where returns an ActiveRecord::Relation (not an array, even though it behaves much like one), which is a collection of model objects. If nothing matches the conditions, it simply returns an empty relation.

  • find (and its related dynamic find_by_columnname methods) returns a single model object, or possibly a collection of model objects in an Array (not a Relation). If nothing is found, an ActiveRecord::RecordNotFound exception is raised.

 確かに、この場合だと、個別なら.findの方が良いですよね。。ふーむ

Yauthについて笑

(※プログラミングに関係ないが、面白くて、ITの専門用語もたくさん出ているので、良い勉強になるかもしれません笑)

引用先:↓本当に面白かった笑
YAuthスペック : D-7 <altijd in beweging>

※※※※※※※※※※※※※※※※※※※※※※以下は転載内容※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Yauthとは"Yome(嫁) Auth"の事で主に男性が婚姻関係、もしくは親密な関係にある女性に対しての認証を得るために使われるプロトコルです。トランスポートレイヤーは電話やメールが使われる事が多いですが、スペック上の規定は特になく、プラッガブルな実装を可能にしています。

プロトコルに参加するのはPeer (同僚・友達)、Client (認証を得たい人物), End Point (嫁)の三者です。プロトコルが発動する前に、PeerよりClientにProbe (お誘い)メッセージが送信されます。この時点ですでにキャッシュされたEnd PointよりのレスポンスをClientが持っている場合はただちにClientからPeerへ返答が返ります。

キャッシュされたレスポンスがない場合はClientよりEnd Pointに実装依存のトランスポートレイヤーに乗せてクエリーが投げられます。書式はYAuth スペック1.0では

AUTH $reason

で、$reasonは省略可能ですが、End Pointの実装によっては$reason無しでは認証が絶対に下りないようになっている場合もあるので、なるたけ省略しないほうがよいでしょう。

これに対してEnd Pointは非同期でレスポンスを返してきます。現在定義されているステータスコードは以下の通りです:

YAuth 200 - 認証成功
YAuth 201 - 認証は成功したが、End Pointがよそに愛人を作成した (bulkneets)
YAuth 202 - 認証は成功したが、本文内容は「勝手にすれば?(次回の認証は失敗する可能性が高い) 」 (Yappo)
YAuth 204 - 認証は成功したが、無言(次回の認証は失敗する可能性が高い)
YAuth 300 - 無効。選択肢が複数存在する。例:1. 大人しく帰ってきて無傷、2. 後で見返りを提示する、3. あとで半殺し (zigorou)
YAuth 302 - 無効。成功とも失敗とも言えない。
YAuth 305 - 無効。第三者の仲介を必要とします。(bulkneets)
YAuth 400 - 認証失敗(そもそも認証という行為を否定)。End Pointが鬼嫁だった場合等 (Yappo)
YAuth 401 - 認証失敗。愛人への認証を嫁に出していませんか?(Yappo)
YAuth 402 - 認証は一応成功だが、後で罰金、もしくはプレゼントをEnd Pointに渡さないとretroactiveに認証拒否。(daiba / otsune)
YAuth 403 - 認証失敗。
YAuth 404 - 認証失敗が続いたため、End Pointが実家に帰った、等
YAuth 406 - 認証失敗。着信拒否されました(Yappo)
YAuth 409 - 認証失敗。End Pointは現在間男に夢中 (tokuhirom) もしくはホストクラブに夢中 (daiba)
YAuth 410 - 無効。End Pointは知らない間にいなくなった (acotie)
YAuth 411 - 認証失敗。いつまでに帰ってくるか明示しなさい (zigorou)
YAuth 412 - 認証失敗。そもそも彼女も嫁もいません。
YAuth 413 - 無効。あうぅ。こんなおっきなりくえすとはいらないよぉ・・・(Yappo)
YAuth 414 - 無効。あうぅ。こんなおっきなURIはいらないよぉ・・・(Yappo)
YAuth 423 - 認証失敗。クレジットカードがロックされました (Yappo) 実装はWebDAV経由での操作の場合のみ。
YAuth 500 - 認証失敗。なお、家に入れない可能性が高い。
YAuth 502 - 認証失敗。認証方法がよくありません。セックス中に再度認証してみてください (Yappo)
YAuth 507 - 認証失敗。あんた今そんなにお金持ってないんだから許せるわけないでしょ! (zigorou)

実装依存のステータスは以下の通り

YAuth 456 - Zigorou (456) 版にのみ実装。嫁が押し入れにitkzを飼い出す (Yappo)

なお現在Experimentalステータスで出されているRFCにはクレジットカード等のログから認証の必要性が後から露見し(「ちょ、この『ラブマーケット』ってなんのお店よ!」「ち、ちがう、それはただのスナック・・・ぷぎゃー><」)、その時点で認証を行うDelayed YAuth等のバリエーションが存在する。

※※※※※※※※※※※※※※※※※※※※※※※※以上は転載内容※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

最後のitkzなんですが、エンジニアの糸柳和法さんらしいです。笑↓

糸柳和法とは (イトヤナギカズノリとは) [単語記事] - ニコニコ大百科

面白かった面白かった。笑

RailsTutorial第六章前半のRspec

 昨夜第五章のRspecを簡約化し、早速第六章に進もうと思ってやってみたら、またもエラーが出ました。。。(うぅ、Rails4対応ではないですかよ〜

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

 具体的には、6.2.1のところに、テスト用dbでテストを行うために、テストdbを起動することが必要になっています。Tutorialには

$ rake test:prepare

と書いており、しかしそのまま実行してみたら、下記のエラーが出ました。
 
 

rake aborted!  

Don't know how to build task 'test:prepare'

(See full trace by running task with --trace)

調べてみたら、rails4.1でdeprecateされたようです 。

rpsec - RSpecでテストデータベースの準備 - Qiita
 

このサイトを参考して、Rails4.1では下記のコードを実行しないと解消されないらしい。。

bundle exec rake db:migrate RAILS_ENV=test

これでテスト通れました。めでたしめでたし〜
 
 
補足: 上記の参考サイトを読んだらわかると思いますが、最少に

bundle exec rake db:create:all

これを執行すれば、developer, test, productionのdbを起動するので、はまらないと思います。

ではでは〜

RailsTutorial第五章のRspec

詰まったところ。。(学習メモ)

 RailsTutorialはRails4対応になっているはずですが、
 ちょこちょこエラーが起こりますので記録します。  

 Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

 第五章の「Rspecを洗練される」のところ、Tutorialの通りにやっても以下のエラーが出ます。

f:id:ChonMeng-WONG:20140813234505p:plain

 undefined method "full_title" for #  <RSpec::Core::ExampleGroup::Nested_1::Nested_1::Nested_1:0x007ff1d94ac8b0>

 どうやら、full_titleメソッドが見つからないらしい。
 でもTutorialの通りにやっていますし、一緒にTutorialをやっていて、先に進んだ友人のコードも見せてもらいましたが、全く同じ(汗。。。。

 しかたがなく、ググってみたら、下記のアドバイスがありました。↓

railstutorial.org - RSpec title test fails with the variable full_title, but passes with string text the variable full_title provides to the title - Stack Overflow

spec/requests/static_pages_spec.rbinclude ApplicationHelperを入れれば解決。
Helperの部分を自動的に読み込んでくれないらしいね。。。(Guardに関係しているらしいが、、)

f:id:ChonMeng-WONG:20140813234519p:plain

これでテスト通れました。

久しぶりの更新。。。

Rubyの勉強

Rubyの参考サイト&課題

 Githubの後、Rubyの学習をしました。

 プログラミング入門 - Rubyを使って -, by Chris Pine, 日本語ver. by S. Nishiyama

 ↑こちらのサイトで勉強しました〜確かに琉球大学のkono先生のサイトで、基礎としてとても良いサイトです〜

 Rubyの固有メソッドについての解説が少ない気がしますが、Class, method, Procなど、Rubyの基礎構造について詳しく説明してくれます。

 動画付きのRuby講座↓(こちらもわかりやすい♬)

 Ruby入門 (全23回) - プログラミングならドットインストール

Ruby課題の回答

 演習問題の要求は少し曖昧で、たぶん人によるソースコードとその出力も違うと思います。でも、自分が思った通りに結果が出力してくれれば良いのだろう〜笑
 一応、僕のコードはこちらです。↓

 ChonMeng-WONG/fjord-ruby · GitHub

 拙いコードですみません。。。
 皆さんにわかりやすくするために、ソースコードは、ほぼ行ごとにコメントを書いていますので、
よければ参考してください。

 ※ちなみに、個人的には、返り値&Procの辺が難しいと思います。。。。

Rspecについて

主に参考したサイト

Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)

 なぜ手動ではなく自動テストが良いの?という疑問を持っている方がこちら↓のサイトを読んでおいたほうが良いのだろう。

ビヘイビア駆動開発 - Wikipedia

一応、書いてみた。

 ChonMeng-WONG/fjord-RSpec · GitHub

 ClassMethodを使ったのは第八章以降になるんので、、、  でもこちらもあまり詳しくなく、苦戦しましたので、あまり説明とかはできません。。。(うぅ。)
そしてすべてのRubyファイルもテストできるわけではありません。puts "Hello World!"だけのファイルは、本当にHello World!が出力されるかどうか、テストできません。

 この説明し方が良いかどうかわかりませんが、テストをするのに、puts "Hello World!"みたいなコードより、ClassMethodを使って範囲を囲んであげてからできるようになります。
 ※そもそも、putsだけだったら返り値がnilでなにも返してこないんですが。。。

 今はRailsについて勉強していますが、始めたばかりでブログに何を書けば良いのかわからなくて、詰まったところや気になるところがあったら更新します〜〜〜
 あっ、このサイト↓で勉強しています〜たぶんRails学習者の定番サイトかな笑
 

 Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

ではではZzzzzzz

Github-clone時について

一回目のgithubgit cloneする時、http式とssh式があります。
今回はssh方式でやってみましたが、ssh-keyの生成からgitへgit cloneまでやりました。

Generating SSH Keys · GitHub Help

しかし、最後のところに

f:id:ChonMeng-WONG:20140714105833p:plain

 というエラーが出ました。sshgithubに接続は成功しましたが、何らかの理由でpushはできませんでした。調べてみたら、clone時はsshのリンクをhttpのリンクにしてしまったからです。
 もう一回remoteしても、remote already finishedというメッセージが出ました。

 ここで、httpのリンク→sshリンクに変更する方法は、.git/configを開き、その中には

[remote "origin"] url = https://github.com/jinkojima/hogehoge.git 

があります。この文を

[remote "origin"] url = ssh://git@github.com/jinkojima/hogehoge.git

これに変更すれば、pushを成功になります。

まぁ、、最初にsshとhttpを間違わなければ済むことなんですが、間違っても修正することができます。新たにリポジトリを作成しなくても♬