ようへいの日々精進XP

よかろうもん

2018 年 07 月 28 日 (土)

ジョギング

  • 香椎浜 x 2 周
  • なんか, 両足が筋肉痛気味だったのでゆっくりと
  • 左足太もも前あたりに突っ張るような痛み

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

8 時間耐久カラオケ

奥さんと 8 時間耐久カラオケを実施した. ほぼ 8 時間歌いっぱなしで喉がへんな感じになってしまった. 奥さんは平気で歌っていたので, 鍛え方が違うなーと思った次第. 総じて楽しかった. 猛暑でつらい休日の過ごし方はコレでで決まりかもしれない.

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (18) 標準添付ライブラリ (1) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

標準添付ライブラリ (1) 基礎力確認問題より

Q26. 以下のコードを実行したらどうなるか. テストされるクラスファイル foo.rb は存在していると仮定.

require 'test/unit'
require 'foo'

class TC_Foo < Test::Unit::TestCase
  def foo_test
    # テストコード...
  end
end

以下, 解答.

  1. foo_test が規則に則っていないので, テストは実行されない

以下, 解説より抜粋.

  • Test::Unit のテストメソッド名は test_ で始める

以下, 正しいコード.

require 'test/unit'
require 'foo'

class TC_Foo < Test::Unit::TestCase
  def test_foo
    # テストコード...
  end
end

標準添付ライブラリ (2) 基礎力確認問題より

Q27. socket ライブラリにあるクラスを全て選べ.

以下, 解答.

  1. UDPSocket
  2. BasicSocket
  3. TCPSocket

以下, 解説より抜粋.

  • socket ライブラリに, BasicServer クラスや UDPServer クラスは存在しない
  • ちなみに, TCPSerever は存在する (TCP/IP ストリーム型接続のサーバ側のソケットのクラス)

尚, BasicSocket を親として, 以下のような親子関係になっている.

# Ruby 2.5.1 で確認 (activesupport が Ruby 2.2.2 以上を要求する為)
irb(main):001:0> require 'active_support/core_ext/class/subclasses'
=> true
irb(main):002:0> require 'socket'
=> true
irb(main):003:0> 
irb(main):004:0> p BasicSocket.subclasses
[Socket, IPSocket, UNIXSocket]
=> [Socket, IPSocket, UNIXSocket]
irb(main):005:0> p UNIXSocket.subclasses
[UNIXServer]
=> [UNIXServer]
irb(main):006:0> p IPSocket.subclasses
[TCPSocket, UDPSocket]
=> [TCPSocket, UDPSocket]
# TCPServer は TCPSocket の子クラスとなる
irb(main):007:0> p TCPSocket.subclasses
[TCPServer]
=> [TCPServer]

標準添付ライブラリ (3) 基礎力確認問題より

Q28. 以下の実行結果になるように [ x ] に記述する適切なコードを選べ.

# コード
require 'date'

date = Date.new(2000, 10, 10)
puts date [ x ] 1

# 実行結果
2000-11-10

以下, 解答.

以下, irb にて確認.

irb(main):001:0> require 'date'
=> true
irb(main):002:0> date = Date.new(2000, 10, 10)
=> #<Date: 2000-10-10 ((2451828j,0s,0n),+0s,2299161j)>
irb(main):003:0> puts date >> 1
2000-11-10
=> nil

以下, 解説より抜粋.

  • date + 1 とすると, date の 1 日後の日付を返す
  • date - 1 とすると, 1 日前の日付を返す
  • date << 1 は 1 ヶ月前, date >> 1 は 1 ヶ月後を返す

以下, irb にて確認.

irb(main):003:0> puts date >> 1
2000-11-10
=> nil
irb(main):004:0> puts date + 1
2000-10-11
=> nil
irb(main):005:0> puts date - 1
2000-10-09
=> nil
irb(main):006:0> puts date << 1
2000-09-10
=> nil
irb(main):007:0> puts date >> 1
2000-11-10
=> nil

標準添付ライブラリ (4) 基礎力確認問題より

Q29. 以下の記述で適切なものを全て選べ

以下, 解答.

  1. StringIO は IO と同じインターフェースを持つ
  2. Float オブジェクトと Rational オブジェクトの演算結果は Float オブジェクトとなる
  3. DateTime オブジェクトに 1 加算すると, 翌日のデータとなる

以下, irb で確認出来るものは irb で確認.

# StringIO は IO と同じインターフェースを持つ
irb(main):010:0> sio = StringIO.new("hoge", 'r+')
=> #<StringIO:0x005622d72857a8>
irb(main):011:0> sio.read
=> "hoge"
irb(main):012:0> sio.rewind
=> 0
irb(main):013:0> sio.read(0)
=> ""
irb(main):014:0> sio.read(1)
=> "h"
irb(main):015:0> sio.read(2)
=> "og"
irb(main):016:0> sio.rewind
=> 0
irb(main):017:0> sio.read(1)
=> "h"
irb(main):018:0> sio.write("OGE")
=> 3
irb(main):019:0> sio.rewind
=> 0
irb(main):020:0> sio.read
=> "hOGE"

# Float オブジェクトと Rational オブジェクトの演算結果は Float オブジェクトとなる
irb(main):021:0> (1.0 + 1r).class
=> Float
irb(main):022:0> (1 + 1r).class
=> Rational
irb(main):023:0> (1i + 1r).class
=> Complex
irb(main):024:0> (1 + 1i).class
=> Complex

# DateTime オブジェクトに 1 加算すると, 翌日のデータとなる
irb(main):001:0> require 'date'
=> true
irb(main):002:0> date.class
=> DateTime
irb(main):004:0> date = DateTime.now()
=> #<DateTime: 2018-07-15T09:31:32+09:00 ((2458315j,1892s,381051256n),+32400s,2299161j)>
irb(main):005:0> date + 1
=> #<DateTime: 2018-07-16T09:31:32+09:00 ((2458316j,1892s,381051256n),+32400s,2299161j)>

以下, 解説より抜粋.

  • rdoc において * は番号無しのリストを生成する
  • Thread クラスには run は無い
    • インスタンスメソッドには run は存在する
      • ドキュメントより引用: 停止状態(stop)のスレッドを再開させます。 Thread#wakeup と異なりすぐにスレッドの切り替えを行います。
    • 新しいスレッドを生成するのは new, start, fork なので注意する

以下, Thread クラスのメソッドを確認した図.

irb(main):001:0> t = Thread.new{}
=> #<Thread:0x0055b0d90c5dc0 run>
irb(main):002:0> t.methods
=> [:pending_interrupt?, :raise, :join, :value, :kill, :terminate, :exit, :run, :wakeup, :[], :[]=, :key?, :keys, :priority, :priority=, :status, :thread_variable_get, :thread_variable_set, :thread_variables, :thread_variable?, :alive?, :stop?, :abort_on_exception, :abort_on_exception=, :safe_level, :group, :backtrace, :backtrace_locations, :inspect, :set_trace_func, :add_trace_func, :nil?, :===, :=~, :!~, :eql?, :hash, :<=>, :class, :singleton_class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :singleton_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
irb(main):007:0> t = Thread.new{}
=> #<Thread:0x0055b0d9089848 run>
irb(main):008:0> t = Thread.start{}
=> #<Thread:0x0055b0d907ca80 run>
irb(main):009:0> t = Thread.fork{}
=> #<Thread:0x0055b0d906b230 run>
irb(main):010:0> t = Thread.run{}
NoMethodError: undefined method `run' for Thread:Class

標準添付ライブラリ (5) 基礎力確認問題より

Q30. 以下の記述で適切なものを全て選べ

以下のコードは HTTP ダウンロードしたデータを表示するコードである. [ x ] に記述する適切なコードを選べ.

require 'open-uri'

[ x ]('https://docs.ruby-lang.org/ja/2.1.0/doc/index.html') do |f|
  print f.read
end

以下, 解答.

  1. open

以下, irb にて確認

# ページ全体がダンプされないように, 読み込みサイズを指定した (f.read(100))
irb(main):001:0> require 'open-uri'
=> true
irb(main):002:0> 
irb(main):003:0* open('https://docs.ruby-lang.org/ja/2.1.0/doc/index.html') do |f|
irb(main):004:1*   print f.read(100)
irb(main):005:1> end
<!DOCTYPE html>
<html lang="ja-JP">
<head>
  <meta http-equiv="Content-Type" content="text/html; cha=> nil

以下, 解説より抜粋.

  • open-uri は Kernel モジュールの open (Kernel.#open) を再定義して, HTTP で指定したファイルを取得する

フムフム.