LoginSignup
1
1

More than 1 year has passed since last update.

snippet: ruby

Last updated at Posted at 2015-07-09

CentOS6でRuby2系を入れる

から ruby-2.2.3-1.el6.x86_64.rpm, ruby-2.1.7-1.el6.x86_64.rpm を利用させてもらうか、

  • RPM resource Rubyからsrpmとってきてビルドする。
  • rbenvで入れるのもよいかと

ファイル書き込み

File.open("tmp.txt", "a+") do |f|
  f.print "あいうえお"
end

カレントディレクトリ

Dir.pwd

Dir.glob(Dir.pwd+"/img/1*.jpg").sort.each do |img|
  p img
end

bundleコマンド

  • Gemfileに書いてあるgemをインストールする。
bundleコマンドのインストール
gem install bundler
# システム全体に入ってしまうため、カオスになる!
bundle install

# gemをvendor/bundlerにまとめて保管。
bundle install --path=vendor/bundler

# vendor/bundler/ruby/2.0.0/bin/ のコマンドを使えるようにいい感じにしてくれる君
bundle exec qiita_scouter a yokomotod

bundle installが失敗する場合

エラー内容
$ sudo bundle install
Gem::RemoteFetcher::FetchError: bad response Not Found 404 (https://rubygems.global.ssl.fastly.net/gems/rspec-core-3.3.1.gem)
An error occurred while installing rspec-core (3.3.1), and Bundler cannot continue.
Make sure that `gem install rspec-core -v '3.3.1'` succeeds before bundling.
対処
gem install rubygems-update
update_rubygems

rspec入門

rspecコマンドを入れる
gem install rspec
ディレクトリ作成
rspec --init
使い方
rspec spec/〜.rb

端数を切り捨てて単位をつける方法

def to_jpn_unit(num)
  if num > 10**12
      (num/10**12).to_s + "兆"
  elsif num > 10**8
      (num/10**8).to_s + "億"
  elsif num > 10**4
      (num/10**4).to_s + "万"
  end
end

p to_jpn_unit(12312133) #"1231万"
p to_jpn_unit(12312133000) #"123億"
p to_jpn_unit(1231213000003) #"1兆"

改行を置換

ruby -pe 'gsub(/\n/,"")' a.txt

gemをオフラインインストール

bundle package

vendor/cache/ を新しいrailsプロジェクトにコピー

bundle install --local

変数

グローバル変数(先頭が$)
def foo
 $greeting = "Hello"
end
p $greeting #Hello"
定数(先頭がアルファベットの大文字)
Const = "Hello Ruby!"
p Const #Hello Ruby!
現在実行されているプログラムのファイル名
p __FILE__
現在実行されている行
p __LINE__

インクリメント・デクリメント

a += 1

処理の中断

exit 0
exit 1
abort "終了します"

引数

if ARGV.length != 1 then
  abort "引数の数が1ではないので終了します。"
end
yyyymmdd = ARGV[0]
p yyyymmdd

ヒアドキュメント

body <<-EOS
こんにちは
こんばんわ
EOS

if

age = 1
if age >= 12 then
  p "adult fee\n"
else
  p "child fee\n"
end
三項演算子
age = 1
p (age >= 12) ? "adult" : "child"

mail送信

send.rb
require "mail"

mail = Mail.new do
  from    "user1"
  to      "user2"
  subject "kenmei"
  body    "honbun"
end

mail.delivery_method :smtp, {
  enable_starttls_auto: false,
}
mail.charset = 'utf-8'
mail.deliver!

/usr/lib/ruby/2.1.0/openssl/ssl.rb:232:in `post_connection_check': hostname "127.0.0.1" does not match the server certificate (OpenSSL::SSL::SSLError)

と出るときはenable_starttls_auto: false,つければ送れる。

  • archlinuxの場合pacman -Sy ruby-mailしておく。

mail送信2

send.rb
require "mail"

mail = Mail.new do
  from    "from@example.co.jp"
  to      "to@example.co.jp"
  subject "subject text"
  body    File.read("body.txt")
  add_file "picture.jpg"
end

mail.delivery_method :smtp, {
  address:   'example.co.jp',
  port:      587,
  domain:    'example.co.jp',
  user_name: 'user1'
  password: 'oodieQu3'
  enable_starttls_auto: false,
}

mail.deliver!

ruby1.8以下のハッシュの書き方

1.8まで
mail.delivery_method :smtp, {
  :enable_starttls_auto => false,
}
1.9以降
mail.delivery_method :smtp, {
  enable_starttls_auto: false,
}

mailcatcher

m1.png

gem install mailcatcher
mailcatcher -f

mailtest.rb
require 'mail'
require 'mail-iso-2022-jp'

mail = Mail.new(:charset => 'ISO-2022-JP') do
  from    'fromer@aaa.com'
  to      'toer@bbb.com'
  subject 'メールです'
  body <<-EOS
本文です
ああ
EOS
end

mail.delivery_method :smtp, {
  address:   '127.0.0.1',
  port:      1025,
  domain:    'bbb',
  user_name: 'tester',
  password:  ''
}

mail.deliver!

htmlメールの例

mailtest.rb
  mail = Mail.new(:charset => 'ISO-2022-JP') do
    from    'fromer@aaa.com'
    to      'toer@bbb.com'
    +   format  'html'
    subject 'メールです'
    body <<-EOS
  本文です
- ああ
+ <font color="blue">ああ</font>
  EOS
  end

クラス

クラスメソッド
class Hoge
  def self.hoge
    puts "hoge"
  end
end
Hoge.hoge # => hoge
クラスメソッド
class Hoge
  class << self
    def hoge
      puts "hoge"
    end
  end
end
Hoge.hoge # => hoge
インスタンスメソッド
class Hoge
  def hoge
    puts "hoge"
  end
end
Hoge.new.hoge # => hoge
initialize
class Foo
  def initialize
    @foo = "first"
  end
  def getFoo
    @foo
  end
end

f1= Foo.new()
p f1.getFoo #first
クラス変数(先頭にアットマーク2つ(@@)。クラス内からのみ参照可能。インスタンス間で共有)
class Foo
  @@foo = "first"
  def bar 
    p @@foo
  end
  def change
    @@foo = "second"
  end
end

f1 = Foo.new()
f1.bar #first

f2 = Foo.new()
f2.bar #first
f2.change
f1.bar #second
f2.bar #second
#f1.foo や f1.@@fooはエラー
インスタンス変数(先頭に@。インスタンス間で共有されない)
class Foo
  def initialize
    @foo = "first"
  end
  def getFoo 
    @foo
  end
  def setFoo(val)
    @foo = val
  end
end

f1 = Foo.new()
p f1.getFoo

f2 = Foo.new()
p f2.getFoo #first
f2.setFoo('second')
p f2.getFoo #second
p f1.getFoo #first

invalid multibyte char (US-ASCII)

# encoding: utf-8

すればよいです。

case

# encoding: utf-8

def road_signal(color)
  case color
  when "赤"
    p "stop"
  when "黄色"
    p "warning"
  else
    p "go"
  end
end

road_signal("青")

2つの配列を合体(transpose)

colors = ["blue", "yellow", "red"]
actions = ["go", "warning", "stop"]
road_signals = [colors,actions].transpose

p road_signals
# [["blue", "go"], ["yellow", "warning"], ["red", "stop"]]
ランダム
r = road_signals
p r[rand(0..(r.length) -1)]
配列のハッシュ化
h = Hash[*road_signals.flatten]
p h
# {"blue"=>"go", "yellow"=>"warning", "red"=>"stop"}

サンプル

例1
#encoding : utf-8

def current_signal()
    road_signals = [
      ["赤", "止まれ"],
      ["青", "行け"],
      ["黄色", "止まれなければ注意して行け"],
      ["桃色", "帰れ"]
    ]
    max = (road_signals.length) -1
    num = rand(0..max)
    color = road_signals[num][0]
    action = road_signals[num][1]
    message = "%sです。「%s」" % [color, action]
end

p current_signal()
p current_signal()
例2
#encoding : utf-8

def current_signal(r)
    num = rand(0..(r.length) -1)
    message = "%sです。「%s」" % [r[num][0], r[num][1]]
end

colors = ["赤", "青", "黄色", "桃色"]
actions = ["止まれ", "行け", "止まれなければ注意して行け", "帰れ"]
road_signals = [colors,actions].transpose

p current_signal(road_signals)
p current_signal(road_signals)
例3
#encoding : utf-8

class RoadSignal
  def initialize()
    @colors = ["赤", "青", "黄色", "桃色"]
    @actions = ["止まれ", "行け", "止まれなければ注意して行け", "帰れ"]
  end
  def look()
    num = rand(0..(@colors.length) -1)
    message = "%sです。「%s」" % [@colors[num], @actions[num]]
  end
end

signal = RoadSignal.new()
p signal.look
p signal.look
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1