ようへいの日々精進XP

よかろうもん

2018 年 08 月 06 日 (月)

ジョギング

  • 香椎浜 x 2 周
  • 引き続き, 徹底的に熱い (暑いではなく, もはや熱い)
  • 流石にクラクラしてしまった
  • 足にもすごく疲労が溜まっている感

日課

  • (腕立て 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

フムフム.