ようへいの日々精進XP

よかろうもん

2018 年 04 月 27 日(金)

ジョギング

  • 香椎浜 x 2 周
  • テンポ良く走れたと思う
  • 両足の太もも裏に張りを感じる

日課

  • お休み

PyFukuoka #4

初めて #pyfukuoka に参加して, LT までしてきた.

speakerdeck.com

最近, moto をギョームで使うことが増えてきたので, 自分の理解の整理がてらに資料にまとめた. 早口とカミカミで聞いている方々に申し訳ない気分で一杯だったけど, 久しぶりに人前で話すことが出来てエキサイティングだった.

ところで, 初めての #pyfukuoka だったけど, 若い方が積極的にネタを持ち寄って「俺にしゃべらせろ」みたいな雰囲気があって, とても刺激を受けたし, 自分の学びの少なさを反省する良い機会になったと思う. また, ブログでを読ませて頂いて, その存在が気になっていたつるべーさんにもお会いしてお話することが出来て良かった. ブログの文面からにじみ出てくるマジメそうな感じそのままで, インフラの仕事をはじめて 2 ヶ月しか経っていないということらしいけど, きっと半年後くらいには, ペパボの諸先輩達の指導の元で凄いエンジニアになっているんだろうなという思いしかなかった.

帰りにくさかべさん, つるべーさん, ゆじかわさんの四人で会場近くの小洒落てるんだけど, ちょっと五月蝿い居酒屋で軽く飲みつつ, PyCon Kyushu の話等で盛り上がった.

その後, 香椎に帰ってきてから, 少しお腹が空いたので「もりす」で反省会.

ハイボールをちびちび呑みながら, PyCon Kyushu に CfP 出してみようかなと思いつつ, 過去の PyCon の登壇資料等を見たりしていた. 結論, 俺にはムリだということで, 聞くだけの参加になりそう. また, 6/30 は結婚式記念日なので, 懇親会は不参加になる予定.

今日のるびぃ ~ Ruby技術者認定試験【Gold】模擬問題を解いてみる (re: 6) ~

もう何度か解いているけど, 再び, Ruby技術者認定試験【Gold】模擬問題 を 3 ~ 5 問くらいずつ解いていく.

Q16. Object#freeze

以下のコードの実行結果として正しいものを選択する.

# コード
char = { :a => "A" }.freeze
char[:a] = "B"
p char

以下, irb による実行例.

irb(main):010:0> char = { :a => "A" }.freeze
=> {:a=>"A"}
irb(main):011:0> char[:a] = "B"
RuntimeError: can't modify frozen Hash
        from (irb):11
        from /path/to/.rbenv/versions/2.1.10/bin/irb:11:in `<main>'

以下, 解説より抜粋.

  • freeze メソッドはオブジェクトを変更不可能にするメソッド
  • ハッシュオブジェクトの値を変更しようとしている行で RuntimeError が発生して例外終了する

ドキュメントより抜粋.

irb(main):001:0> a1 = "foo".freeze
=> "foo"
irb(main):002:0> a1 = "bar"
=> "bar"
irb(main):003:0> a2 = "foo".freeze
=> "foo"
irb(main):004:0> a2.replace("bar")
RuntimeError: can't modify frozen String
        from (irb):4:in `replace'
        from (irb):4
        from /path/to/.rbenv/versions/2.1.10/bin/irb:11:in `<main>'

ちなみに, replace メソッドは self の内容を other の内容で置き換える.

str = 'a'
str.replace('b') #=> b

Q17. Proc

以下のコードの実行結果から __(1)__ に当てはまるものを選択する.

# コード
sum = Proc.new{|x, y| x + y}
puts __(1)__

# 実行結果
3

sum.call(1, 2)

以下, irb による実行例.

irb(main):001:0> sum = Proc.new{|x, y| x + y}
=> #<Proc:0x005645fe92a0f0@(irb):1>
irb(main):002:0> puts sum.call(1, 2)
3
=> nil

以下, 解説より抜粋.

  • Proc.new ではブロックで指定した手続きを表すオブジェクトである
  • 手続きを呼び出す時は Proc オブジェクトに対して call メソッドを呼び出す
  • ブロック引数は call メソッドの引数で渡すことが出来る

以下のように Proc.newlambda に書き換えても同様の結果を得ることが出来る.

irb(main):001:0> sum = lambda{|x, y| x + y}
=> #<Proc:0x0055c4e3706978@(irb):1 (lambda)>
irb(main):002:0> puts sum.call(1, 2)
3
=> nil

但し, Proc.new と比較すると, ブロック引数の数に厳密である.

irb(main):001:0> sum = Proc.new{|x, y| x + y}
=> #<Proc:0x0055f0e05420f0@(irb):1>
irb(main):002:0> sum.call(1, 2, 3)
=> 3
irb(main):003:0> sum = lambda{|x, y| x + y}
=> #<Proc:0x0055f0e04ff6d8@(irb):3 (lambda)>
irb(main):004:0> sum.call(1, 2, 3)
ArgumentError: wrong number of arguments (3 for 2)
        from (irb):3:in `block in irb_binding'
        from (irb):4:in `call'
        from (irb):4
        from /path/to/.rbenv/versions/2.1.10/bin/irb:11:in `<main>'

Q18. ライブラリ

stringio ライブラリの説明として正しいものを選択する.

1. 文字列をIOオブジェクトのように扱うことができる

以下, irb にて StringIO クラスの確認.

irb(main):002:0> sio = StringIO.new("hoge", 'r+')
=> #<StringIO:0x0055c8787eaef0>
irb(main):003:0> p sio.read
"hoge"
=> "hoge"
irb(main):004:0> sio.rewind
=> 0
irb(main):005:0> p sio.read(1)
"h"
=> "h"
irb(main):006:0> sio.write("OGE")
=> 3
irb(main):007:0> sio.rewind
=> 0
irb(main):008:0> p sio.read
"hOGE"
=> "hOGE"

フムフム.