Skip to content

Instantly share code, notes, and snippets.

@totobook
Last active August 29, 2015 13:57
Show Gist options
  • Save totobook/9595141 to your computer and use it in GitHub Desktop.
Save totobook/9595141 to your computer and use it in GitHub Desktop.

逆引きRuby

目次

Gem

gem本体をアップデート

gem update --system

gemのコマンドをすべて表示

gem help commands

gemの環境情報を表示

gem environment

インストール済みのパッケージの一覧を表示

gem list

gemでインストールしたすべてのパッケージを更新

gem update

gemパッケージのアップデート後、古いバージョンのパッケージを削除する

gem cleanup

gemが参照するリモートリポジトリを調べる

gem sources -l

gemが参照するリモートリポジトリを追加する

gem sources -a http://hoge.com

gemのパッケージをすべてのリポジトリから探す

gem search hogehoge -r

gemのパッケージが置かれている場所を探す

gem which hogehoge

gemのパッケージを正規表現を使って探す

gem query -n ^hogehoge$ -r

gemパッケージのインストール

gem install hogehoge

gemパッケージのアンインストール

gem uninstall hogehoge

gemパッケージをインストールの際、riやrdocを含まずインストール

gem install hogehoge --no-ri --no-rdoc

gemパッケージをローカル環境にダウンロードしてインストール

gem fetch hogehoge
# Downloaded hogehoge-1.0.0
gem install hogehoge-1.0.0

gemパッケージをバージョン指定してインストール

gem install hogehoge -v 1.0.0

特定gemの利用可能なバージョン一覧

gem query -ra -n  "^rails$"

一度間違えてインストールしてしまったRailsをバージョンダウンさせる

rails -v #=> Rails 4.1.6

# ダメな例
gem uninstall rails

# 成功例
gem uninstal railties -v '4.1.6'

gem install rails -v 3.2.19

gemパッケージをインストールやアップデートする際、そもそもデフォルトでriやrdocを含まないようにする

echo 'install: --no-ri --no-rdoc
update: --no-ri --no-rdoc' > ~/.gemrc

インストール時にSSLエラーになる場合

SSL証明書エラーによりインストール出来ないことがある。

一時的にHTTPSからHTTPに変更することで対応可能

gem source -a http://rubygems.org/
https://rubygems.org is recommended for security over http://rubygems.org
Do you want to add this insecure source? [yn] y
http://rubygems.org/ added to sources

インストール完了後に元に戻す

gem source -r http://rubygems.org/

Pry

ぷらい、と読む。irbはオワコン。

Pryのインストール

gem install pry pry-doc

PryからShellのコマンドを叩く

pry
[1] pry(main)> .ls
[2] pry(main)> .pwd

Pryでtabキーでディレクトリ名を補完

pry(main)> shell-mode

解除するときはもう一度shell-modeを叩けばOK

Pryで評価した過去の式一覧を見る

pry(main)> hist

Pryで有効なオブジェクト一覧を表示

pry(main)> ls

Pryでオブジェクトを調査する

[1] pry(main)> a = "hoge"
[2] pry(main)> ls
locals: _  _dir_  _ex_  _file_  _in_  _out_  _pry_  a  version
[3] pry(main)> cd a
[4] pry("hoge"):1> nesting
Nesting status:
--
0. main (Pry top level)
1. "hoge"
[5] pry("foo"):1> ls
Comparable methods: < <= > >= between?
String methods: ... 
[6] pry("foo"):1> upcase
=> "FOO"

Pryを簡易デバッガとして使う

アプリの適当な場所に以下のコードを差し込むと、ブレークポイントとしてPryコンソールが立ち上がる

binding.pry

Pryの出力をawesome_print経由にする

gem install awesome_print

.pryrcをつくって、標準の出力をawesome_printにする

vi ~/.pryrc
require 'awesome_print'

Pry.print = proc{|output,value| output.puts value.ai }

String

デフォルトエンコーディング

Ruby2.0からデフォルトエンコーディングがUTF-8に。

文字列のエンコーディングを変更する

Stringオブジェクトは、自分自身のエンコーディング情報を持っている。これを変更するには

hoge = "Hoge".encode("EUC-JP")
p hoge.encoding

文字列やバイナリデータを16進数ダンプする

[0].scan(/[0-9a-f]{2}/)

16進数ダンプを文字列やバイナリデータに変換する

["48656c6c6f2c20776f726c64"].pack("H*")

文字列をBase64エンコード

require 'base64'
a = "Hellow World"
p Base64.encode64(a)
b = Base64.encode64(a)
p Base64.decode64(b)

文字列内で変数の展開

文字列内で変数を展開するには#{}を使う

a = "hoge"
puts "Hellow, #{a}"
puts "1 + 3 = #{1 + 3}"

単一引用符や二重引用符を含む文字列を扱う

バックスラッシュ\でエスケープできるが、連続して使うと読みづらいしミスの原因になる

puts "Hellow, \"Hoge\""

文字列の先頭に%おき、半角記号で文字列を囲めばそのまま単一引用符や二重引用符を使える(パーセント記法)。パーセント記法は二重引用符で囲んだ文字列と同じ扱いになる

puts %!"Hi", 'Yahoo'!
puts %!"1 + 3 =" '#{1 + 3}'!

ヒアドキュメントを使う

複数行に渡るような長い文字列を使いたい場合はヒアドキュメントを使う

puts <<EOF
やーこまったこまった
すげー困ってる困ってる
はっはっはっは
EOF

ヒアドキュメントを使って複数のshellコマンド実行結果を文字列に設定する

s= <<`EOS`
date
echo "-----------------------------"
ps
EOS

文字列の結合

# インスタンス自体に結合する場合
str1 = "Hellow"
str1 << " Ruby"
str1.concat(" World!")

# 返り値に結合した文字列を返す場合
str2 = "Hellow"
puts str2 + " World"

文字列を指定いた回数繰り返した値を返す

puts "Hey " * 3

大文字・小文字に揃える

s = "i love Ruby"

# 大文字に揃える
puts s.upcase     #=> "I LOVE RUBY"

# 小文字に揃える
puts s.downcase   #=> "i love ruby"

# 先頭のみ大文字に、残りは小文字に揃える
puts s.capitalize #=> "I love ruby"

upcase、downcase、capitalizeの後ろに!つけると破壊的な操作ができるけど、基本使わん。

大文字と小文字の入れ替え

……いつ使うんだこれ?

puts "i lOVE rUBY".swapcase #=> "I Love Ruby"

コマンドの実行結果を文字列として受け取る

コマンドをバッククォートで囲む。

puts `date`

部分文字列を取り出す

s = "Apple Banana Orange"

p s[0..4] #=> "Apple"
p s[6, 6] #=> "Banana"

# 範囲を指定すればその範囲の文字が、ピンポイント指定だと文字コードが返る
p s.slice(0,3)    #=> "App"
p s.slice(6)      #=> 'B'
p s.slice(13..18) #=> "Orange"

部分文字列を置き換える

s = "Apple Banana Orange"

# 範囲指定
s[0..4] = "Vine"  #=> s = "Vine Banana Orane"

# 開始地点と長さ指定
s[5, 6] = "Lemon" #=> s = "Vine Lemon Orange"

文字列を1文字ずつ処理する

"Hellow Ruby".each_char{|c| puts c}

文字列を1文字ずつバイトで処理する

"Hellow Ruby".each_byte{|c| puts c}

文字列を1行ずつ処理する

s = <<EOS
This is test.

Ruby, the Object Oriented Script Language.
EOS

s.each_line{|line| puts line}

文字列の先頭と末尾の空白文字を削除する

"   Hello, Ruby!   ".strip #=> "Hello, Ruby!"

文字列を整数に変換する

"999".to_i #=> 999

文字列を浮動小数点に変換する

"10.1".to_f #=> 10.1

8進数文字列を整数に変換する

"010".oct #=> 8

16進数文字列を整数に変換する

"0xff".hex #=> 255

ASCII文字<=>コード値に変換

p "R".bytes #=> 82
p 82.chr    #=> "R"
p "%c" % 82 #=> "R"

文字列を中央寄せ・左詰め・右詰めする

CUIツールを作るとき便利

s = "Ruby"

# 10文字を基準にずらす
p s.center(10) #=> "   Ruby   "
p s.ljust(10)  #=> "Ruby      "
p s.rjust(10)  #=> "      Ruby"

「次」の文字列を取得する

シーケンシャルな識別子を出すときに使える、とあるが、なかなか使いドコロがなくて存在を忘れる。

p "9".succ    #>= "10"
p "a".succ    #>= "b"
p "AAA".succ  #>= "AAB"
p "A99".succ  #>= "B00"
p "A099".succ #>= "A100"

文字列中で指定したパターンにマッチする最初の文字列を置換する

s = "Apple Banana Apple Orange"

p s.sub("Apple", "Pine") #=> "Pine Banana Apple Orange"

文字列中で指定したパターンにマッチする全ての文字列を置換する

s = "Apple Banana Apple Orange"

p s.gsub("Apple", "Pine") #=> "Pine Banana Pine Orange"

文字列内に含まれる任意文字列の一を求める

見つからなかったらnilが返る

s = "Apple Banana Apple Orange"

p s.index("Apple")     #=>  0
p s.index("Banana")    #=>  6
p s.index("Apple", 6)  #=> 13

p s.rindex("Apple")    #=> 13
p s.rindex("Apple", 6) #>=  0

文字列の末端の改行を削除する

入力受け取るときに大活躍

p "Hellow, Ruby!\n".chomp

文字列を任意の区切り文字で分割し配列にする

"001,TAKEUCHI Hitoshi,Yokohama".split(",") #=> ["001", "TAKEUCHI Hitoshi", "Yokohama"]

文字列をフォーマットに合わせて変換して出力(sprintf)

p "%d.txt"% 100 #=> "100.txt"

# 複数渡す場合は配列で渡す

p "%s is %s"% ["Ruby", "God"] #=> "Ruby is God"

Integer

整数かどうか判定したい

p 10.integer?
p 1.1.integer?

整数か偶数か判定したい

# 偶数ならtrue,奇数ならfalse
p 10.even?

整数か奇数か判定したい

# 奇数ならtrue,偶数ならfalse
p 11.odd?

整数の絶対値を取得したい

p 10.abs
p -10.abs

整数の値が0かを判定したい

p 0.zero?
p 10.zero?

2つの整数の最大公約数がほしい

p 2.gcd(7)

2つの整数の最大公約数と最小公倍数がほしい

p 3.gcdlcm(7)

起点となる整数から1ずつ減らしながらminまでブロックを繰り返したい

# self.downto(min) {|n|}
10.downto(1) {|n| p n}

起点となる整数から1ずつ増やしながらmaxまでブロックを繰り返したい

# self.upto(max) {|n|}
1.upto(10) {|n| p n}

起点となる整数から指定したstep数ずつ加算しながらlimitまでブロックを繰り返したい

# self.step(limit, step = 1) {|n|}
2.step(10, 2) {|n| p n}

Integer回数だけブロックを繰り返したい。ただし、回数に指定できるのは正の整数のみ

カウントは0からスタートする

# self.times {|n|}
10.times {|n| p n}

10進法から2進法、8進法、16進法に基数変換したい

String#%はsprintfと同じ

# 10進法<=>2進法
"%b" % 251
251.to_s(2)
0b11111011.to_s

# 10進法<=>8進法
"%o" % 8
8.to_s(8)
010.to_s

# 10進法<=>16進法
"%x" % 251
251.to_s(16)
0xfb.to_s

# 任意の位取り記法文字列を整数へ変換したい
"6z".to_i(36)
"18b".to_i(12)
"18b".to_i(16)
"101100".to_i(3)

ちなみにto_sの引数は2 <= x <= 36まで可能(この範囲を超えた引数を与えるとエラー)

階乗冪(かいじょうべき)、順列、階乗、組み合わせの値を求めたい

結論:自前で実装しろ。

モンキーパッチで書くならこんな感じ

class Integer
  def falling_factorial(m)
    return (0..(m - 1)).inject(1) {|r, k| r * (self - k)}
  end

  def rising_factorial(m)
    return (0..(m - 1)).inject(1) {|r, k| r * (self + k)}
  end

  alias permutation falling_factorial

  def factorial
    return self.permutation self
  end

  def combination(m)
    return (self.permutaton m) / (m.permutation m)
  end
end

Array

injectの使い方

# これが
sum = 0
(1..10).each {|i| sum += i}
puts sum

# こうかける
puts (1..10).inject(0) {|sum,i| sum + i}

# ブロックの実行結果でハッシュを返したい場合の書き方
data = [:A, :B, :A, :C, :E, :A, :D, :B, :B, :C, :E]
p data.inject(Hash.new(0)) {|h, key| h[key] += 1; h }

配列を読みやすい文字列に変換して出力(var_dump的な)

# Array#.inspect
p [:A, :B, :A, :C, :E, :A, :D, :B, :B, :C, :E].inspect #=> "[:A, :B, :A, :C, :E, :A, :D, :B, :B, :C, :E]"

配列の末尾に追加

p [] << 1 #=> [1]

正規表現

正規表現の略式記号

  • \w 単語構成文字 [a-zA-Z0-9_]
  • \W 非単語構成文字 [^a-zA-Z0-9_]
  • \s 空白文字 [ \t\r\n\f]
  • \S 非空白文字 [^ \t\r\n\f]
  • \d 10進数字 [0-9]
  • \D 非10進数字 [^0-9]
  • \h 16進数字 [0-9a-fA-F]
  • \H 非16進数字 [^0-9a-fA-F]

Rails

Railsのバージョン確認

rails -v

新規プロジェクトの作成

rails new hogehoge

簡易Webサーバーを起動する

rails server

サーバーを立ち上げた際、Javascriptランタイムがないとエラーに成った場合

NodeJSをyumで入れる

yum install nodejs npm --enablerepo=epel

ActiveRecordが生成するSQLをrails console上に表示する

$ rails console
irb> ActiveRecord::Base.logger = Logger.new(STDOUT)
irb> User.find(1)

その他

sudo gemやsudo bundleとした時にコマンドが見つからないと出た時

sudo時にPATHが通ってないのが原因

visodoでsudo時のPATH指定があるので、そこに追加する。追加するパスはwhich gemと叩いた時の場所による

sudo su -
visodo

- Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
+ Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/local/rbenv/shims/:/usr/bin

参考サイト

参考文献

  • Ruby逆引きレシピ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment