この記事は NIFTY Advent Calendar 2017 の8日目の記事です。
7日目は @esu_eichi さんの クレジットカードを使わないでlinebotを作ったときの話 でした。
はじめに
開発ではRubyを使うことが多いのですが、よく使うgemを紹介します。
ここで紹介しているのは有名なものばかりですので、この記事を読んで興味が出た方は
RubyGems.org や The Ruby Toolbox で探してみるといいでしょう。
Pry
irb
の強化版で、同じく対話式でオブジェクトを確認できます。
gem install pry
でインストールします。
また、プラグインも豊富で、pry-doc
や pry-byebug
、rails console
を pry
で使える pry-rails
などもあります。 一緒にインストールしておくと便利です。
インストールしたら pry
コマンドで対話モードに入ります。
$ pry
pry(main)>
require でライブラリを読み込んだり
pry(main)> require 'net/http'
=> true
どんなオブジェクトが作成されたか確認できます
pry(main)> uri = URI.parse("https://www.google.co.jp/")
=> #<URI::HTTPS https://www.google.co.jp/>
pry(main)> response = Net::HTTP.get_response(uri)
=> #<Net::HTTPOK 200 OK readbody=true>
pry(main)> response.code
=> "200"
ls
コマンドで、定義された変数(上で定義したresponse)や、メソッドが確認できます
pry(main)> ls
self.methods: inspect to_s
locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_ response
cd
コマンドでオブジェクトに移動できます
pry(main)> cd response
pry(#<Net::HTTPOK>):1>
ls
で確認してみると... そのオブジェクトのメソッドなどが確認できます
pry(#<Net::HTTPOK>):1> ls
Net::HTTPHeader#methods:
[] connection_close? content_type= each_key initialize_http_header range= size
[]= connection_keep_alive? delete each_name key? range_length sub_type
add_field content_length each each_value length set_content_type to_hash
basic_auth content_length= each_capitalized fetch main_type set_form type_params
canonical_each content_range each_capitalized_name form_data= proxy_basic_auth set_form_data
chunked? content_type each_header get_fields range set_range
Net::HTTPResponse#methods:
body code decode_content entity error_type http_version message read_body reading_body uri value
body= code_type decode_content= error! header inspect msg read_header response uri=
self.methods: __pry__
instance variables: @body @body_exist @code @decode_content @header @http_version @message @read @socket @uri
locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_
pry-doc
をインストールしておくと、show-method
で内容を確認できます
pry(#<Net::HTTPOK>):1> show-method header
...
def header #:nodoc:
warn "#{caller(1)[0]}: warning: Net::HTTPResponse#header is obsolete" if $VERBOSE
self
end
他にも edit
コマンドでファイルの編集ができます(エディタが起動)
pry(#<Net::HTTPOK>):1> edit header
...
147 def header #:nodoc:
148 warn "#{caller(1)[0]}: warning: Net::HTTPResponse#header is obsolete" if $VERBOSE
149 self
150 end
...
使いこなすと、開発がスムーズに行えるようになるので、オススメです。
faker
様々なダミーデータを作成できるライブラリです。
サンプルやテストでデータを用意するときに重宝します。
require 'faker'
Faker::Internet.user_name #=> "laria"
Faker::Internet.password #=> "FeSv8eJoVbYv7"
Faker::DragonBall.character #=> "Super Saiyan 3 Goku"
Faker::Job.title #=> "Chief Banking Assistant"
# 一部日本語にも対応
Faker::Config.locale = :ja
Faker::Name.last_name #=> "清水"
大量にユーザーを作ったりできます。
users = 1000.times.map do
name = Faker::Name.name
email = Faker::Internet.email
User.new(name, email)
end
サンプルデータ作るの面倒なので、手軽に作成できてよいです。
ReFe2
日本語ドキュメントで有名な「るりま」を端末で見ることができます。
いちいちブラウザを開く必要がありません。
以下のようインストールします。
$ gem install refe2
$ bitclust setup
refe
コマンドが使えるようになりました。 Net::HTTP.get_response
のドキュメントを見てみましょう
$ refe Net::HTTP.get_response
require 'net/http'
Net::HTTP.get_response
--- get_response(uri) -> Net::HTTPResponse
--- get_response(host, path = nil, port = nil) -> Net::HTTPResponse
指定した対象に GET リクエストを送り、そのレスポンスを
[[c:Net::HTTPResponse]] として返します。
対象の指定方法は [[c:URI]] で指定するか、
(host, port, path) で指定するかのいずれかです。
@param uri データの取得対象を [[c:URI]] で指定します。
@param host 接続先のホストを文字列で指定します。
@param path データの存在するパスを文字列で指定します。
@param port 接続するポートを整数で指定します。
@see [[m:Net::HTTP#get]]
メソッド名だけでも検索可能
$ refe get_response
クラスなどは説明が長いのでless
などでみてください。
$ refe String | less
こちらも気軽に確認ができて便利です。
Rubocop
The Ruby Style Guide に沿った
コーディングスタイルをチェックしてくれます。
例えば、以下のようなコードを書いてしまったとして...
# bad
class Person
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def first_name
@first_name
end
def last_name
@last_name
end
end
rubocop
コマンドを実行すると...
$ rubocop bad.rb
Inspecting 1 file
C
Offenses:
bad.rb:8:3: C: Use attr_reader to define trivial reader methods.
def first_name
^^^
bad.rb:12:3: C: Use attr_reader to define trivial reader methods.
def last_name
^^^
1 file inspected, 2 offenses detected
attr_reader
を使え、と怒られます。
以下のよう修正して...
# good
class Person
attr_reader :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
end
確認すると...
$ rubocop good.rb
Inspecting 1 file
.
1 file inspected, no offenses detected
怒られなくなりました!
しかし、プロジェクトのコーディングスタイルに合わない場合もあると思います。
その場合、調整が可能で .rubocop.yml
にルールの設定ができます。
また、meowcop
という gem
を利用しても調整可能です。
さいごに
簡単にインストールできて試せて、楽しいな〜と思う一方、まだまだ使いこなせてない気がします。
今後も頑張りたいと思います。
明日は @motaHack さんの記事です。お楽しみに。