Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyには魔法はありません

Rails / Rubyの魔法が多すぎると聞いたことがあるかもしれません(または自分で言ったことさえあります)…

  • しかし、そのアイデアはどこから来たのですか?
  • Railsマジックとは正確には何ですか?
  • そして、その魔法を払拭するために何ができるでしょうか?

これが私の考えです

何かが魔法のように感じるとき、それはあなたが知らない何かがあるからです、それはいくつかの情報が欠けています。

それは魔法のトリックのようなものです。トリックを知っていれば魔法はありません

Rubyには魔法はありません

>

ソフトウェア開発では、トリックを知ることは、物事が実際にどのように機能するかを理解することと同じです。 。

例を見てみましょう!

この例はBCryptに関するものです 、パスワードを安全に保存するために使用されるハッシュアルゴリズム。 bcryptを介してRubyに実装されています 宝石。

BCryptの使用方法は次のとおりです 「テスト」という単語をハッシュするには:

 require'bcrypt' BCrypt ::Password.create( "testing")# "$ 2a $ 10 $ 3o.xrISG8fqKfzKqDpgKn.3cwjFV // 9C9cZ7MuK5S9sNKFBivB7YG" BCrypt ::Password.create( "testing")# "$ BFb / e3cWuAIyelcmkfGtE.GTifXHxig4IzVbdZs9C1zSpF / Jr6c3W "BCrypt ::Password.create(" tests ")#" $ 2a $ 10 $ Q952BVgM783Y4kPvwvxwC.CS2DWUX9jQu 

毎回異なるハッシュを取得する方法に注意してください。ただし、MD5(使用しないでください!)やSHA1などを使用すると、特定の文字列に対して常に同じ出力が得られます。

BCryptはなぜですか 別の方法で動作しますか?

何が起こっているのかをすぐに説明しますが、最初に2つの bcryptを比較する方法を見てみましょう。 ハッシュ、1つはデータベースからのもの、もう1つはユーザー入力(フォームなど)からのものです。

 BCrypt ::Password.new(@ user.hash)==params [:password]#true 

左側の部分(BCrypt::Password.new )はBCryptです オブジェクト。データベースに格納されているハッシュをパラメータとして受け取ります。

右側の部分(params[:password] )は、ユーザーがログインしようとしているプレーンテキストのパスワードです。

この場合、適切なユーザーとパスワードの組み合わせが使用されていると想定しています。

では、なぜこれがtrueと評価されるのでしょうか。 ?

これを理解するには、次の2つのことを知っておく必要があります。

  1. BCryptは「ソルト」と呼ばれるものを使用します。これは、セキュリティを強化するために使用されるランダムな値です。 事前に計算されたハッシュに対して。ソルトはハッシュ自体に保存されます。
  2. Rubyでは、構文のように見えるものの多くは単なるメソッドです 。これは、double equals演算子(==)の場合です。 。

それを知っていると、BCrypt 独自の==を定義します メソッド。パスワードを比較するときにそれを考慮に入れることができるように、その「塩」値を抽出する方法を知っています。

言い換えれば

BCrypt#== 保存されたハッシュから「salt」値を取得します。

次に、このソルトを使用してプレーンテキストのパスワード(ユーザー入力)をハッシュし、パスワードが有効な場合に両方のハッシュが同じになるようにします。

ソースコードを見る場合 次のようになります:

 def ==(secret)super(BCrypt ::Engine.hash_secret(secret、@salt))end 

superを覚えておいてください 同じメソッドを呼び出します(この場合は== )親クラスで。

BCrypt::Passwordの親クラス Stringです 。

メソッドがすべてです

理解しておくべき重要なことの1つは、いくつかのキーワードといくつかの構文要素(括弧など)を除いて、すべてがクラスとメソッドに関することです。

使用しているクラスがわかっている場合(classを使用して確認できます) メソッド)どの操作(メソッド)が利用可能かをいつでも知ることができます。

ただし、オブジェクトなしでメソッド呼び出しがある場合もあります。

これは多くの場合、メソッドが現在のクラスで定義されていることを意味しますが、常にそうであるとは限りません。

123を置く

putsはどこにありますか 定義されていますか?調べてみましょう:

 method(:puts).owner#カーネル

混乱を招く可能性のあるもう1つのことは、メタプログラミングです。メタプログラミングを使用すると、プログラムの実行中にメソッドを作成、変更、または削除することもできます。これらのことにより、コードはより不透明でわかりにくくなります。

利用可能なメタプログラミング方法とその機能を理解することで、混乱を減らすことができます。

概要

物事がどのように機能するかを深く理解することで、「魔法」を払拭し、より優れたコードを記述し、より優れた開発者にすることができることを学びました。

Rubyのスキルを向上させたい場合は、私の本、Ruby Deep Diveをチェックしてください。この本は、基本とより高度な概念の間のギャップを埋めるように設計されています🙂


  1. Rubyでの挿入ソートを理解する

    注:これは、Rubyを使用したさまざまなソートアルゴリズムの実装を検討するシリーズのパート4です。パート1ではバブルソート、パート2では選択ソート、パート3ではマージソートについて説明しました。 データを並べ替えるためのさまざまな方法を引き続き検討するため、挿入並べ替えに目を向けます。挿入ソートが好きな理由はたくさんあります!まず、挿入ソートは安定です。 、これは、等しいキーを持つ要素の相対的な順序を変更しないことを意味します。 インプレースアルゴリズムでもあります 、は、並べ替えられた要素を格納するための新しい配列を作成しないことを意味します。最後に、挿入ソートは、すぐにわかるように、実

  2. Ruby2.6の9つの新機能

    Rubyの新しいバージョンには、新しい機能とパフォーマンスの改善が含まれています。 変更についていきますか? 見てみましょう! 無限の範囲 Ruby 2.5以前のバージョンは、すでに1つの形式の無限範囲をサポートしています( Float ::INFINITY を使用) )、しかしRuby2.6はこれを次のレベルに引き上げます。 新しい無限の範囲 次のようになります: (1..) これは、(1..10)のような終了値がないため、通常の範囲とは異なります。 。 使用例 : [a, b, c].zip(1..) # [[a, 1], [b, 2], [c, 3]] [1,2,3,