ジョギング
日課
- (腕立て x 50 + 腹筋 x 50) x 3
73 回目の広島に原爆が投下された日
- 全ての被災者に合掌
- 年々, 報道での取り上げられ方が小さくなっている感
今日のるびぃ ~ いろいろ ~
色々と気になったことをメモる. 尚, irb に動作確認環境は以下の通り.
$ ruby --version ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux] $ irb --version irb 0.9.6(09/06/30)
const_missing
class Object def const_missing(const) const = '-1' end end class Class def const_missing(const) const = '0' end end class Cls1 def const_missing(const) const = '1' end end class Cls2 < Cls1 CONST_1 = '123' def method1 puts CONST_1 puts CONST_2 end end Cls2.new.method1
上記の例だと, CONST_2
において, Class#const_missing
まで遡る.
... 略 ... irb(main):026:0> irb(main):027:0* Cls2.new.method1 123 0 => nil
さらに, 以下のような場合には...
class Object def const_missing(const) const = '-1' end end class Class def const_missing(const) const = '0' end end class Cls1 def self.const_missing(const) const = '1' end end class Cls2 < Cls1 CONST_1 = '123' def method1 puts CONST_1 puts CONST_2 end end Cls2.new.method1
- const_missing はクラスメソッドとして定義されている必要がある為, Cls2 から継承ツリーを辿って, 最初に見つかる
Cls1.const_missing
で捕捉される
irb(main):026:0> irb(main):027:0* Cls2.new.method1 123 1 => nil
正規表現
# 正規表現 1 irb(main):001:0> %r|http://www(\.)(.*)/| =~ "http://www.abc.com/" => 0 irb(main):002:0> $0 => "irb" irb(main):003:0> $1 => "." irb(main):004:0> $2 => "abc.com" # 正規表現 2 irb(main):005:0> %r|(http://www(\.)(.*)/)| =~ "http://www.abc.com/" => 0 irb(main):006:0> $0 => "irb" irb(main):007:0> $1 => "http://www.abc.com/" irb(main):008:0> $2 => "." irb(main):009:0> $3 => "abc.com"
()
内のパターンにマッチした部分文字列が$1
から始まる特殊変数に代入されている$0
はスクリプト名 (上記の例だとirb
) が入る- 「正規表現 2」 の場合, 最初の
()
にはhttp://www.abc.com/
がマッチする
map, collect, inject
irb(main):001:0> [1, 2, 3].map {|x| x ** 2} => [1, 4, 9] irb(main):002:0> [1, 2, 3].collect {|x| x ** 2} => [1, 4, 9] irb(main):003:0> [1, 2, 3].inject([]) {|x, y| x << y ** 2} => [1, 4, 9]
- inject はリストの畳み込み演算を行う
# リストの合計 irb(main):004:0> p [2, 3, 4, 5].inject {|result, item| result + item } 14 => 14 # リストの自乗和 irb(main):005:0> p [2, 3, 4, 5].inject(0) {|result, item| result + item**2 } 54 => 54
lazy
p (1..Float::INFINITY).lazy.map {|x| x ** 2 }.take(3).inject(0, &:+)
Enumerable#lazy は実際に値が必要になるまで値を生成せず, take や first 等, 値を返すメソッドが呼ばれた際に必要な数だけ値を評価し, リストとして返すメソッドである.
irb(main):006:0> p (1..Float::INFINITY).lazy.map {|x| irb(main):007:1* x ** 2 irb(main):008:1> }.take(3).inject(0, &:+) 14 => 14
Enumerable#lazy から値を取り出す場合...
irb(main):010:0> lazy = (1..Float::INFINITY).lazy => #<Enumerator::Lazy: 1..Infinity> irb(main):011:0> lazy.take(3) => #<Enumerator::Lazy: #<Enumerator::Lazy: 1..Infinity>:take(3)> irb(main):012:0> lazy.take(3).force => [1, 2, 3] irb(main):013:0> lazy.first(3) => [1, 2, 3]
- Enumerator::Lazy#take を利用すると, 配列ではなく Enumerator::Lazy を返すので,
Enumerator::Lazy#force
を合わせて利用する - Enumerable#first を利用すると, 配列として値を取得出来る
socket
socket ライブラリに含まれるクラス.
- UDPSocket
- TCPSocket
- BasicSocket
階層で表すと以下のようになる.
socket └── BasicSocket └── IPSocket ├── TCPSocket │ ├── SOCKSSocket │ └── TCPServer └── UDPSocket
self
self が何を参照しているのか.
class A $a = self def hoge $b = self end end a = A.new print A == $a, A.new == $b
以下, irb にて確認.
irb(main):001:0> class A irb(main):002:1> $a = self irb(main):003:1> def hoge irb(main):004:2> $b = self irb(main):005:2> end irb(main):006:1> end => :hoge irb(main):007:0> a = A.new => #<A:0x0055c2177251a8> irb(main):008:0> print A == $a, A.new == $b truefalse=> nil irb(main):009:0> print A == $a, A.new.hoge == $b truetrue=> nil irb(main):010:0> p $a A => A irb(main):011:0> p $b #<A:0x0055c2176f9df0> => #<A:0x0055c2176f9df0>
- クラス定義中の
self
は, そのクラスのオブジェクトである - インスタンスメソッド中の
self
は, そのクラスのオブジェクトである $a
にはクラス A が代入され,$b
は,hoge
が実行されなければ値は代入されない
今日の AWS ~ リージョンとアベイラビリティゾーン ~
リージョン
- 2016 年 7 月現在, 世界中に 13 ヶ所のリージョン
- GovCloud と北京リージョンについては通常のユーザーは利用出来ない
アベイラビリティゾーン
サービス
- リージョン毎に管理されるリージョンサービス
- S3
- DynamoDB
- SQS
- AZ 毎に管理されるサービス
- EC2
- RDS
- ELB
- ElastiCache
- どのリージョンからでも利用可能なグローバルサービス
- IAM
- Route53
- CloudFront
フムフム.