読者です 読者をやめる 読者になる 読者になる

猫の魔法

主にruby系の技術メモを記載

再考:classとそれが読み込んでいるmoduleの一覧を表示する方法

今日、Module#ancestorsという インスタンスメソッドを目にしたのだが、このメソッドを使えば、このブログの一番最初に書いたプログラムがもっと簡単に組める事に気がついた。 nekomaho.hatenablog.jp def display_class_modules(class_name) class_name.anc…

is_a?についてのメモ

Highlineのソースを読んでいたら以下の部分でちょっと考えてしまった。 if template_or_question.is_a? Question template_or_question else Question.new(template_or_question, answer_type, &details) end 悩んだのはtemplate_or_question.is_a? Question…

deviseのメールアドレスバリデーション

最近deviseを使う事があったのだが、メールアドレスのバリデーションがどうなっているのか気になっったので調べてみた。 devise/devise_test.rb at master · plataformatec/devise · GitHub メールアドレスのバリデーションテストは上記で行っている。 で、…

has_many throughの苦悩

railsのhas_many throughの使い方が分からなかったという話。 モデルの関連付けでhas_manyは分かりやすい。1対多のモデルは1側にhas_manyをつければいい。 問題はhas_many throughでこれが良く分からない。多対多の時につけるというが多対多の場合、リレーシ…

個人的メモ:Rails AntiPatterns(21):最後

CHAPTER10 Building for Failure 発生した障害は素早く復旧される事と、黙って失敗しない事が大事 AntiPattern: Continual Catastrophe 前段の処理が失敗しているのにも関わらず、それをキャッチ出来ずに後続処理が動いてしまうのはよくない。 Solution: Fai…

個人的メモ:Rails AntiPatterns(20)

AntiPattern: Wet Validations DBによってはvalidationで指定された制約をサポートしていない場合がある。その場合、DB上で発生する不整合データを検知出来ない可能性がある。 Solution: Eschew Constraints in the Database ★適切なgemを使うことで上記を回…

個人的メモ:Rails AntiPatterns(19)

Solution: Never Use External Code in a Migration migrationをする際にDB上のデータを一緒に変更する事はよくある事だが、upメソッド内にrubyでその手順を直接書くべきではない 理由はパフォーマンスと、DBから見た外部依存性がrails側にできてしまう為で…

個人的メモ:Rails AntiPatterns(18)

Chapter 9 Databases railsはORMマッパーによって、DBの事を意識せずに済むように設計されているが、それでも気にしなければいけない点はある AntiPattern: Messy Migrations railsはmigrationによってDBへ直接変更を加えなくてもよくなっているが、時間が立…

個人的メモ:Rails AntiPatterns(17)

Solution: Move Processing into Background Jobs 処理時間がwebでの応答に不適切なくらい掛かる場合はcronやキューイングといった。バックグラウンドJobの仕組みを検討した方がいい cronの場合スクリプトを別に作ってそれを動かす。 例えば、テーブルのカウ…

個人的メモ:Rails AntiPatterns(16)

忙し過ぎて時間が空いてしまった。 CHAPTER 8 Scaling and Deploying AntiPattern: Painful Performance 単純なパフォーマンスの問題を防ぐ為の事例を紹介する。 Solution: Don’t Do in Ruby What You Can Do in SQL RubyでSQLで出来る事をやらせないように…

個人的メモ:Rails AntiPatterns(15)

CHAPTER 8 Scaling and Deploying AntiPattern: Sluggish SQL Solution: Reassess Your Domain Model 高度に正規化されたテーブルはテーブル間の結合によってパフォーマンスの問題を起こしやすい。 単純に結合させるのではなく必要な要素をrails側で取得する…

個人的メモ:Rails AntiPatterns(14)

CHAPTER 8 Scaling and Deploying AntiPattern: Sluggish SQL パフォーマンス最もネックになるのはDB。indexの貼り方と副問い合わせを使った方がいいシチュエーション、ドメインモデルを使った方がいいシチュエーションを考える。 Solution: Add Indexes 主…

個人的メモ:Rails AntiPatterns(13)

今日はあまり進まず。 CHAPTER 8 Scaling and Deploying AntiPattern: Disappearing Assets Capistranoなどのデプロイツールを使ってアプリをリリースする際にユーザの添付ファイルなど、関係ないファイルもデプロイ対象になる Capisrranoの設定で回避出来る…

個人的メモ:Rails AntiPatterns(12)

CHAPTER 8 Scaling and Deploying ソフト作った後保守にも非常に労力が掛かる。 この章ではスケーリングについての問題を考える AntiPattern: Scaling Roadblocks 不必要なスケーリングを考慮する必要はないが、簡単に出来る方法でスケーリングを確保する方…

個人的メモ:Rails AntiPatterns(11)

CHAPTER7 Testing AntiPattern: Unprotected Jewels プラグインやgemはよくテストされている事が重要だが、実際にプラグインや、gemを作る際にテストを作るのは簡単ではない。 gemやプラグインは不特定多数の物から呼ばれるため、テストを行う際にテスト用の…

個人的メモ:Rails AntiPatterns(一覧)

記事が増えてきたので目次用のページを作成 *個人的メモ:Rails AntiPatterns(21):最後 - 猫の魔法 個人的メモ:Rails AntiPatterns(19) - 猫の魔法 個人的メモ:Rails AntiPatterns(18) - 猫の魔法 個人的メモ:Rails AntiPatterns(17) - 猫の魔法 個人的メ…

個人的メモ:Rails AntiPatterns(10)

CHAPTER7 Testing AntiPattern: Mock Suffocation Solution: Tell, Don’t Ask スタブが多く出来る物はスタブになっている側の機能が特定の機能を実行するのに多くの質問をしている可能性がある。 質問として分かれてしまっているmethodを意味のある単位に集…

個人的メモ:Rails AntiPatterns(9)

最近仕事が忙しく読む速度が落ちがち。 CHAPTER7 Testing AntiPattern: Lost in Isolation モックを使いすぎると改修の際にテストが漏れる事がある 特にモジュール間の結合点は今回の事象が起こりやすい ★あんまり理解出来てないが、前後の話を統合すると結…

個人的メモ:Rails AntiPatterns(8)

CHAPTER7 Testing AntiPattern: Fixture Blues Solution: Refactor into Contexts fixstureを使った書き方は一見シンプルだが、テストを複数の人が書いたり何度も改修が入ると何をしてるか分からなくなる。 まずはfixtureで記載していた部分を必要な要素が見…

個人的メモ:Rails AntiPatterns(7)

CHAPTER7 Testing railsはテストを比較的簡単に行えるのでTDD(test-driven development)やBDD(behavior-driven development)に向いている Shouldaというフレームワークを使ってテストフレームワークの機能を説明している。 AntiPattern: Fixture Blues テス…

個人的メモ:Rails AntiPatterns(6)

CHAPTER 5 Services AntiPattern: Kraken Code Base ある程度の期間をかけて巨大になってしまったアプリケーションのこと modelの数が多くなるとそれに比例して保守性が下がる。 Solution: Divide into Confederated Applications 一番いいのはお互い関係な…

個人的メモ:Rails AntiPatterns(5)

CHAPTER 5 Services ここで言うサービスとはサービスクラスのそれというよりAPIやウェブサイトと言った外部が提供or外部に提供する物の総称の事。 AntiPattern: Fire and Forget 外部のAPIを呼ぶ際に、「例外返却される可能性があるメソッド」の例外を取得し…

個人的メモ:Rails AntiPatterns(4)

Rails AntiPttrnsに関する個人的メモ。今日読んだとこまで。 CHAPTER 4 Controllers Solution: Refactor Non-RESTful Actions into Separate Controller この章ではRESTfullなContollerが責務を負いすぎている例として、認証管理を上げている。 認証機構はUs…

個人的メモ:Rails AntiPatterns(3)

Rails AntiPttrnsに関する個人的メモ。今日読んだとこまで。 CHAPTER 4 Controllers AntiPattern: Bloated Sessions Railsは仕組み上ステートレスな動きを得意としている。 ステートフルな動きをなんらかの理由でしなければいけない場合、その内容をクッキー…

個人的メモ:Rails AntiPatterns (2)

Rails AntiPttrnsに関する個人的メモ。今日読んだとこまで。 CHAPTER 4 Controllers AntiPattern: Fat Controller コールバックは条件付きにすることも出来る。 モデル側に処理を寄せる場合はトランザクション処理をコントローラ側に持たせる必要はない。 _i…

個人的メモ:Rails AntiPatterns

Rails AntiPttrnsに関する個人的メモ。今日読んだとこまで。 CHAPTER 4 Controllers AntiPattern: Homemade Keys 認証用のロジックは独自の物を作らない。セキュリティホールになる。gemを使ったほうがいい。 認証機構用のgemとしてClearanceとAuthlogicが紹…

JSON.parseのquirks_modeと2.4.0での変更

どんだけJSONネタで引っ張るのかという話もあるが、色々と調べて見て分かった事があったのでブログに記録しておく。 JSON.parseでは:quirks_modeというオプションがある。 通常JSONを解析する場合、そのトップレベルはオブジェクト若しくは配列になっている…

JSON.loadはオプションが取れる

先日の記事の中でJSON.loadのgithubの実装を紹介した。 Rubyの公式ドキュメント(以下るりま)JSON.loadの説明とgithubのコードを眺めていてあれ?るりまの説明と実装が違う。。。と言う事に気がついた。 るりま側のloadの定義は以下の通り load(source, proc …

rubyの標準ライブラリのバージョンの調べ方

使用しているrubyの標準添付ライブラリが、どのバージョンを使っているか知りたい場合は、 ライブラリをrequireしてモジュール名::VERSIONで取得する事が出来る。 irb(main):001:0> require 'csv' => true irb(main):002:0> p CSV::VERSION "2.4.8" => "2.4.…

JSON.parseとJSON.loadの違い

JSON.parseとJSON.loadの差が何なのか分からなかったので調べてみた。 ※下記の参考のStackOverflowの内容がその答えだが、裏を取りたかった。 require 'json' File.open("hoge.json") do |f| JSON.parse(f.read) == File.open("hoge.json"){ |f| JSON.load(f…

classとそれが読み込んでいるmoduleの一覧を表示する方法

クラスの継承関係と各クラスで読み込んでいるモジュールの一覧を表示したかったので作ってみた。 def display_class_modules(class_name) print "class:#{class_name},modules:#{class_name.included_modules}","\n" if class_name.respond_to?(:included_mo…