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

決済API と Ruby 🍣 時々 Rails

Omise JapanのLead Developerです。OmiseやRubyのことをメインに書きます。

組み込み変数/定数

Ruby Ruby 2.4.0

組み込み変数(Ruby Predefined Variables)

Rubyでの組み込み変数は Kernelの特殊変数 へまとめられています。 Kernel.global_variables で出力されるものが組み込み変数名称一覧です。

識別子 初期値 概要 スコープ
$_ String, nil 最後に Kernel.#gets または Kernel.#readline で読み込んだ文字列です。 EOF に達した場合には、 nil になります。 (覚え方: Perlと同じ)
Kernel.#print のような Perl 由来の幾つかのメソッドは、引数を省略すると代わりに $_ を利用します。
ローカルスコープかつスレッドローカル
$~ MatchData, nil 現在のスコープで最後に成功したマッチに関する MatchDataオブジェクトです。 Regexp.last_match の別名です。このデータから n 番目のマッチ ($n) を取り出すためには $~[n] を使います。 ローカルスコープかつスレッドローカル
$;
$-F
Regexp, String, nil String#split で引数を省略した場合の区切り文字です。 グローバルスコープ
$@ [String], nil 最後に例外が発生した時のバックトレースを表す配列です。 Kernel.#raise によって設定されます。 スレッドローカル
$! Exception, nil 最後に例外が発生したときの Exception オブジェクトです。 該当する例外がないときは nil です。Kernel.#raise によって設定されます。 スレッドローカル、読み取り専用
$SAFE Fixnum, 0 カレントスレッドのセーフレベルを表す整数です。セーフレベルについては セキュリティモデル を参照してください。Thread.current.safe_level と同じです。 スレッドローカル
$& String, nil 現在のスコープで最後に成功した正規表現のパターンマッチでマッチした文字列です。 最後のマッチが失敗していた場合には nil となります。Regexp.last_match[0] と同じです。 ローカルスコープかつスレッドローカル、読み取り専用
$` String, nil 現在のスコープで最後に成功した正規表現のパターンマッチでマッチした 部分より前の文字列です。 最後のマッチが失敗していた場合には nil となります。Regexp.last_match.pre_match と同じです。 ローカルスコープかつスレッドローカル、読み取り専用
$‘ String, nil 現在のスコープで最後に成功した正規表現のパターンマッチでマッチした 部分より後ろの文字列です。 最後のマッチが失敗していた場合には nil となります。Regexp.last_match.post_match と同じです。 ローカルスコープかつスレッドローカル、読み取り専用
$+ String, nil 現在のスコープで最後に成功した正規表現のパターンマッチで マッチした中で最後の括弧に対応する部分文字列です。最後のマッチが失敗していた場合には nil。 ローカルスコープかつスレッドローカル
$= bool, false 過去との互換性のために残されていますが、もはや何の意味もありません。値は常に false です。代入しても無視されます。 グローバルスコープ
$KCODE
$-K
nil この特殊変数は何の影響も持たなくなりました。値を代入しても無視され、参照すると常に nil です。
$, String, nil デフォルトの出力フィールド区切り文字列です。 Array#join で引数を省略した場合と、 Kernel.#print の各引数の間で出力されます。 グローバルスコープ
$/
$-0
String, nil 入力レコード区切りを表す文字列です。 awk の RS 変数のように働きます。Kernel.#gets のような「行」単位の読み込みメソッドが「行」の区切りとして使用します。 Rubyがコマンドオプション -0 付きで起動されたときには -0 で指定された値が規定値となります。そうでないとき、規定値は “\n” です。この変数に nil を設定すると読み込みメソッドはファイル全体を一度に読み込みます。 空文字列 “” を設定するとパラグラフモードとみなされ、 2 つ以上連続した改行が「行」の区切りになります。$/ には正規表現は使えません。 グローバルスコープ
$\ String, nil 出力レコード区切りを表す文字列です。 Kernel.#print が最後にこの文字列を出力します。 グローバルスコープ
$stdin object 標準入力です。 グローバルスコープ
$>
$stdout
object, Object::STDOUT 標準出力です。 グローバルスコープ
$stderr object 標準エラー出力です。 グローバルスコープ
$< IO すべての引数または標準入力で構成される仮想ファイルです。 定数 Object::ARGF の別名です。 グローバルスコープ、読み取り専用
$. Fixnum, 0 いずれかの IO オブジェクトが最後に読んだ行の行番号です。 Object::ARGF などの IO 互換のオブジェクトも $. を更新します。 グローバルスコープ
$FILENAME String 仮想ファイル Object::ARGF で現在読み込み中のファイル名です。 ARGF.class#filename と同じです。 グローバルスコープ
$-i bool in-place 置換モードで用いられます。 グローバルスコープ
$* [String] Rubyスクリプトに与えられた引数を表す配列です。 組み込み定数 Object::ARGV の別名です。 グローバルスコープ
$:
$-I
$LOAD_PATH
[String] Rubyライブラリをロードするときの検索パスです。Kernel.#load や Kernel.#require がファイルをロードする時に検索するディレクトリのリストを含む配列です。 グローバルスコープ
$\ String, nil 出力レコード区切りを表す文字列です。 Kernel.#print が最後にこの文字列を出力します。 グローバルスコープ
$“
$LOADED_FEATURES
[String] Kernel.#require でロードされたファイル名を含む配列です。Kernel.#require で同じファイルを 複数回ロードしないようにするためのロックとして使われます。 グローバルスコープ
$? Process::Status, nil このスレッドで最後に終了した子プロセスのステータスです。Process::Status オブジェクトが入っています。 子プロセスの終了時ステータスは Process::Status#exitstatus で得られます。 スレッドローカル、読み取り専用
$$ Fixnum 現在実行中の Ruby プロセスのプロセス ID です。 Process.#pid と同じです。 グローバルスコープ
$VERBOSE
$-v
$-w
bool, nil 冗長メッセージフラグです。Rubyインタプリタへの コマンドラインオプション -v でセットされます。警告レベルは三段階あり、それぞれ以下の通りです。
nil : 警告を出力しない
false : 重要な警告のみ出力 (デフォルト)
true : すべての警告を出力する
$VERBOSEはグローバルスコープ
$-W 0, 1, 2 コマンドラインオプション -W を指定したとき、 そのコマンドライン引数の値が設定されます。 グローバルスコープ、読み取り専用
$DEBUG
$-d
bool この値が真のときはインタプリタがデバッグモードになります。 グローバルスコープ
$0
$PROGRAM_NAME
String 現在実行中の Ruby スクリプトの名前を表す文字列です。 グローバルスコープ
$1
$2
$3
$4…
String, nil 最後に成功したパターンマッチで n 番目の括弧にマッチした値が格納されます。 該当する括弧がなければ nil が入っています。(覚え方: \数字 のようなもの)番号 n はいくらでも大きな正整数を利用できます。 ローカルスコープかつスレッドローカル、読み取り専用
$-p bool コマンドラインオプション -p を指定したとき true に設定されます。 この変数には代入できません。 グローバルスコープ、読み取り専用
$-l bool コマンドラインオプション -l を指定したとき true に設定されます。 この変数には代入できません。 グローバルスコープ、読み取り専用
$-a bool 自動 split モードを表すフラグです。コマンドラインオプション -a を使ったとき true に設定されます。 この変数には代入できません。 グローバルスコープ、読み取り専用

組み込み定数(Ruby Predefined Constants)

定数 概要
TRUE true と同義
FALSE false と同義
NIL nil と同義
ARGF $< と同義。引数(なければ標準入力)で構成される仮想ファイル。
ARGV $* と同義。Rubyスクリプトに与えられた引数。
DATA スクリプトの __END__ (スクリプトの終り) 以降をアクセスする File オブジェクト。
ENV 環境変数を表す(疑似)連想配列。
RUBY_PLATFORM Rubyインタプリタのプラットフォームを示す文字列。
RUBY_RELEASE_DATE Rubyインタプリタのリリース日を示す文字列。
RUBY_VERSION Rubyインタプリタのバージョンを示す文字列。
STDERR 標準エラー出力。 $stderr のデフォルト値。
STDIN 標準入力。 $stdin のデフォルト値。
STDOUT 標準出力。 $stdout のデフォルト値。
TOPLEVEL_BINDING トップレベルでのバインディングオブジェクト。

Ruby - 実行環境 コマンドラインオプション

Ruby 2.4.0 Ruby

docs.ruby-lang.orgさんのRubyの起動からコマンドラインオプションについて自己学習を含めて書いて見ました。 わかりにくいところもあるので、少し手を加えています。 今後、ちょいちょい例などを更新しようかと思います。

Rubyの起動

Rubyインタプリタの起動は以下の書式のコマンドラインにより行います。

ruby [ option ...] [ -- ] [ programfile ] [ argument ...]

それでは左から書式内容をみていきましょう。

option

後述のコマンドラインオプション のいずれかを指定します。 -- は、オプション列の終りを明示するため に使用できます。

programfile

Ruby スクリプトを記述したファイル(hoge.rbなど)です。これを省略したり- を指定した場合には標準入力を Ruby スクリプトとみなします。programfile が `#!‘ で始まるファイルである場合、特殊な解釈が行われます。詳細は後述のインタプリタ行の解釈で説明します。

argument

指定した文字列は組み込み定数 Object::ARGV の初期値として設定されます。 標準のシェルがワイルドカードを展開しない環境 (Win32)では、Ruby インタプリタが自前でワイルドカードを展開して Object::ARGV に設定します。 この場合ワイルドカードとして * , ? , [] , **/ が使用できます。 Win32 環境で、 ワイルドカード展開を抑止したい場合は引数をシングルクォート(‘) で括ります。

ためしに Object::ARGV に引数が入っているかを確認してみます。 以下をコマンドラインから実行。

ruby -v -d -rdate -e"p Object::ARGV" -- uri.rb "hello"

すると下記のように、Object::ARGV が最終行に配列(["uri.rb", "hello"])で出力されます。

ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]
Exception `LoadError' at /Users/akira/.rbenv/versions/2.4.0/lib/ruby/2.4.0/rubygems.rb:1345 - cannot load such file -- rubygems/defaults/operating_system
Exception `LoadError' at /Users/akira/.rbenv/versions/2.4.0/lib/ruby/2.4.0/rubygems.rb:1354 - cannot load such file -- rubygems/defaults/ruby
["uri.rb", "hello"]

コマンドラインオプション

optionフラグ 内容
-0 入力レコードセパレータ($/)を8進数で指定します。
数字を指定しない場合はヌルキャラクタがセパレータになります ($/ = “\0” と同じ)。
数の後に他のスイッチがあっても構いません。
-00で、パラグラフモード($/=“"と同じ)。
-0777で (そのコードを持つ文字は存在しないので)ファイルの内容を全部一度に読み込むモード($/=nilと同じ)に設定できます。
-a -n や -p と併用し、オートスプリットモードをONにします。オートスプリットモードでは各ループの先頭で $F = $_.splitが実行されます。 -n か -p を併用しない時にはこのオプションは意味を持ちません。
-n このフラグがセットされるとプログラム全体が sed -nやawk のように while gets do ... ; end で囲まれているように動作します。
-p -n フラグの動作にプラスして各ループの最後に変数 $_ の値を出力するようになります。
-C スクリプトの実行前に指定したディレクトリへ移動します。スクリプト実行後には、現在のディレクトリに戻ります。
ruby -C ~/ -e "p Dir.glob('*')"
=> ["dirname", ...]
-c スクリプトの文法エラーチェックを行い問題がなければ Syntax OK と出力します。
ruby -c hello.rb
=> Syntax OK
–copyright コピーライトを表示します。
ruby --copyright
=> ruby - Copyright (C) 1993-2016 Yukihiro Matsumoto
-d
–debug
デバッグモードでスクリプトを実行します。$DEBUG を true にします。Threadで例外が発生した場合に、プログラム自体を終了させる3つの方法のうちのひとつはこのデバッグモードです。
ruby -d -e "Thread.new { sleep 1; Thread.main.raise 'Error' }; begin; sleep; rescue => ex; puts ex.message; end"
=> Error
-Eex[:in]
–encodingex[:in]
デフォルトの外部と内部のエンコーディングを : 区切りで指定します。
ruby -EUTF-8:Shift_JIS -e "p 'やあ'"
=> \u3084\u3042
ruby -E:Shift_JIS -e "p 'やあ'"
=> \u3084\u3042
ruby -EShift_JIS: -e "p 'やあ'"
=> \u3084\u3042
-e script このオプションはevalと同じです、コマンドラインの文字列からスクリプトを実行します。 -e オプションをつけると引数からファイル名を取りません。
ruby -e "p 'Hello'"
=> Hello
-Fregexp -Fオプションでは -a オプションで $F = $_.split のregexを指定します。
-h
–help
-h オプションをつけるとオプションの概要が表示されます。 --help の場合はさらに多くの情報を表示します。
-i[extension] -i は inplace edit を行います。拡張子をしていすると元のファイルはその拡張子を追加して保存されます。拡張子をつけないとバックアップファイルはつくりません。
echo matz > /tmp/junk
cat /tmp/junk
=> matz

ruby -p -i.bak -e '$_.upcase!' /tmp/junk
cat /tmp/junk
=> MATZ

cat /tmp/junk.bak
=> matz
-Idirectory ファイルをロードするパスを追加します。指定したパスはRubyの配列引数 $: に追加されます。
ruby -I./ hello.rb
-l 行末の自動処理を行います。まず、$\ を $/ と同じ値に設定し、print での出力時に改行を付加するようにします。それから、 -n フラグまたは -p フラグが指定されていると gets で読み込まれた各行の最後に対して String#chop! を行います。
-rfeature スクリプト実行前に feature で指定されるライブラリを Kernel.#require します。 -n 、-p オプションとともに使う時に特に有効です。
ruby -rdate -e "p Date.new"
=> #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)>
-s スクリプト名に続く, - で始まる引数を解釈して, 同名のグローバル変数に値 を設定します。-- なる引数以降は解釈を行ないません。該当する引数は Object::ARGV から取り除かれます。
-S スクリプト名が / で始まっていない場合、環境変数 PATH の値を使ってスクリプトを探すことを指定します。これは、#! をサポートしていないマシンで、 #! による実行をエミュレートするためのフラグです。
-T[level] 不純度チェックを行います。level を指定すると安全度レベルをその レベルに設定します。level 省略時は 1 を指定したのと同じです。 CGIプログラムなどでは -T1 程度を指定しておく方が良いでしょう。 $SAFE に指定したレベルがセットされます。
-v
–verbose
はじめにrubyのバージョンを出力し、$VERBOSEにtrueをセットします。その後、他の引数があれば冗長モード(verbose)で実行します。
–version rubyのバージョンを出力します。ruby --version
=> ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]
-w $VERBOSEにtrueをセットし、冗長モードになります。
-W[level] 冗長モードを三段階のレベルで指定します。
-W0 : 警告を出力しない
-W1 : 重要な警告のみ出力(デフォルト)
-W2 or -W : すべての警告を出力する
-x[directory] メッセージ中のスクリプトを取り出して実行します。スクリプトを 読み込む時に、#! で始まり, "ruby"という文字列を含む行までを 読み飛ばします。スクリプトの終りはEOF(ファイル の終り), ^D (コントロールD)、 ^Z (コ ントロールZ)または予約語 __END__で指定されます。ディレクトリ名を指定すると、スクリプト実行前に指定されたディ レクトリに移動します。
-y
–yydebug
コンパイラデバッグモード。スクリプトを内部表現にコンパイルする時の構文解析の過程を表示します。

インタプリタ行の解釈

コマンドラインに指定したスクリプトが #! で始まるファイルで、その行に ruby という文字列を含まない場合、その行を読み飛ばします。#! に続く 文字列が ruby という文字列を含む行を見つけたらその行以下を Ruby スク リプトとして実行します。

例えば、以下のようなスクリプトを sh で実行すると sh から Ruby を起動することができます。

#!/bin/sh
exec ruby -x "$0" "$@"

#!ruby
p ARGV
puts "Hello, World!"

これは Ruby をスペースを含むパスにインストールした場合などに有用。

シェバン(shebang)での小技

ちょっとした小技?というところで、シェバンでもコマンドラインオプションを指定することができます。

#! /path/to/your/ruby -d
# ファイル一行目のシェバンでもコマンドラインオプションを使うことができる

p $DEBUG
# => true

あんまり使わないと思いますが、作業中に用途に合わせて使う場合もあるかも。

参考リンク

Rubyの起動 (Ruby 2.4.0)

OmiseのテストカードのGem作りました

Omise omise_test_cards Omise Charges API Omise Token API

Omiseのテストカードをウェブサイトから調べる手間を省く方法としてGem(omise_test_cards)を公開しました。

f:id:akinrt:20170310170758p:plain

omise_test_cards のインストール

gem install omise_test_cards

Pryでちょっと動かしてみる

cards = OmiseTestCards.test_cards

cards.successful_charge.code
# => "successful_charge"

cards.successful_charge.description
# => "these credit card numbers can be used in test mode"

cards.successful_charge.cards
# => <Hashie::Array [#<Hashie::Mash brand="Visa" number="4242424242424242">, #<Hashie::Mash brand="Visa" number="4111111111111111">, #<Hashie::Mash brand="MasterCard" number="5555555555554444">, #<Hashie::Mash brand="MasterCard" number="5454545454545454">, #<Hashie::Mash brand="JCB" number="3530111333300000">, #<Hashie::Mash brand="JCB" number="3566111111111113">]>

cards.successful_charge.cards.first.brand
# => Visa

cards.successful_charge.cards.first.number
# => 4242424242424242

ちなみに、Omiseのテストカードは10種類のステータス別のカードがあります。

cards = OmiseTestCards.test_cards

cards.successful_charge
cards.invalid_security_code
cards.fail_3ds_card_enrollment
cards.fail_3ds_card_validation
cards.insufficient_fund
cards.stolen_or_lost_card
cards.failed_processing
cards.payment_rejected
cards.failed_fraud_check
cards.invalid_account_number

このうちの cards.successful_charge に含まれるカードのいずれも、正常にテストでChargeができるカードになります。 それ以外のカードは、利用できないステータスなので、charge.paid? でChargeに失敗して入れば、 charge.failure_code を見て、エラー処理を入れてあげるといいでしょう!

Omise RubyライブラリはOmiseErrorをraiseするので、こんな感じでテストするといいですね。

require "omise"
require "omise_test_cards"

Omise.api_key = "SET_YOUR_TEST_SECRET_KEY"
Omise.vault_key = "SET_YOUR_TEST_PUBLIC_KEY"

# get sampla card
sampel_card = OmiseTestCards.test_cards.successful_charge.cards.first

begin
  # create token
  token = Omise::Token.create(card: {
    name: "TARO OMISE",
    number: sampel_card.number,
    expiration_month: 3,
    expiration_year: 2019,
    city: "Tokyo",
    postal_code: "1510051",
    security_code: 123
  })

  # Charge 100000 JPY
  charge = Omise::Charge.create({
    amount: 100_000,
    currency: "jpy",
    card: token.id
  })

  if charge.paid
    # handle success
    puts "thanks"
  else
    # handle failure
    raise charge.failure_code
  end
rescue OmiseError => e
  # handle OmiseError raised by omise library
  raise e.message
end

リンク

github.com

omise_test_cards | RubyGems.org | your community gem host