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

新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

学習記録:Ruby、Hadoop

[Ruby] 制御構造/メソッド/組み込み関数

内容:3章 制御構造/メソッド/組み込み関数

演算子
  • 初めて見たものを以下抜粋。
演算子 意味 使用例 備考
** べき乗 a ** b (aのb乗) a **= bも書ける
<=> 大小を表す a <=> b (a a-bとほぼ同義だが、a-bが定義できないが大小関係があるクラスで便利
not, and, or ~, &&, ‖と同じ意味 a and b
&&= a && (a = b)と同じ意味 aが真なら、bをaに代入
‖= a ‖ (a = b)と同じ意味 aが偽もしくは未定義なら、bをaに代入 初期化で便利
=~, === 正規表現にマッチするなら〜 /r/ =~ a
!~ 正規表現にマッチしないなら〜 /r/ !~ a
  • メソッドとして定義されている演算子
    • 論理演算(|, ^, &)、比較(==, >...)、演算(+, -...)など
    • 1.+(1)のように書くが、シンタックスシュガーとして1 + 1のように書ける
    • 再定義も可能(不可能なものもある) ex) def ==(other) ...
基本的な制御構造
  • 条件分岐:if文
    • if~elsif~else~end(普通のif文)
    • unless~else~end (unless文。elsifは使用できない)
    • ifやunlessは最後に評価された値を返す
str =
  if 0.zero?
    '0です'
  else
    '0じゃないです'
  end

puts str #=> 「0です」が表示
    • 後置if, 後置unless(条件式が真/偽なら直前の式を実行)
puts '0でした' if n.zero?
puts '0じゃないです' if n.zero?
  • 条件分岐:case文
    • case節に比較対象の値、when節にそれと比較する値を記述
    • ===で比較していき、最初に真となったwhenに続く式が実行される。breakは不要。
    • 全て偽だったとき、else節があればそれに続き式が実行
    • ","で区切ると、どれかが真になればそのwhenに続く式が実行される
stone = 'ruby'

case stone
when 'ruby'
  puts '7月'
when 'peridot', 'sardonyx'
  puts '8月'
else
  puts 'わかりません'
end
    • caseでは、ある範囲に含まれているか、正規表現にマッチするかなどが自然に記述可能
    • ifと同じく、最後に評価された値を返す
  • ※:===演算子の振る舞い
    • 基本的には==と同じように振る舞うが、いくつかのクラスでは異なる振る舞い
    • Range:引数が自身の範囲内に含まれれば真
    • Regexp:引数の文字列がマッチすれば真
    • Proc:右辺を引数にして手続きオブジェクトを実行した結果を返す
    • Module, Class:引数が自身もしくは自身のサブクラスのインスタンスなら真
  • 繰り返し:while, until
    • 与えられた条件式が真/偽の間、中の式を繰り返し実行
languages = %w(Perl Python Ruby)
i = 0
while i < languages.length
  puts "lang = #{languages[i]}"
  i += 1
end
    • 後置while, 後置untilもある
    • do-whileはbeginとendで囲んだ後置whileのような形になる
begin
   process1
   process2
end while needed?
  • 繰り返し:for
    • forではループの内外で変数のスコープが変わらないため、下記のnameがループ外で参照できる
for name in %w(Alice Bob Carol)
  puts name
end

puts name
  • ※ただし、繰り返しを行う便利なメソッドが豊富に用意されているので、これらの文を使って繰り返し処理を使うことは稀
    • 例えば、無限ループにはloopメソッドを使用 : loop do ... end
    • n回の繰り返し行う場合、Integerクラスのtimesメソッド:2.timed do ... end
  • ジャンプ構文
    • break: ループ内で呼び出すとその処理を中断
    • next: 次の繰り返しに移る(continue的なもの)
    • redo: その繰り返しをやり直す
  • プログラムの終端
    • __END__を書くとそれ以降はプログラムとして実行されない
    • __END__以降のデータはDATA定数にFileオブジェクトとして保持され、実行時に参照可能
例外処理
  • 例外発生後の流れ
    • 例外が発生すると、コールスタックを遡って最終的にトップレベルまで伝搬
    • 捕捉する処理がないとき、インタプリタは例外メッセージを出力して異常終了する
  • 例外を制御する
    • 例外を発生させる
      • Kernel.#raiseメソッドを使用
      • 第一引数に文字列を指定した場合、それを例外のメッセージとしてRuntimeErrorを発生させる
      • 第一引数に例外クラスを指定できる。その場合例外メッセージは第二引数
    • 例外を捕捉する
      • rescue節を書く
      • => eと変数を指定することで、例外オブジェクトが変数(この場合e)に代入される
begin
  raise StandardError, 'error!!!'
rescue => e
  puts "Error occurred (#{e.class})"
end
    • 例外オブジェクトのメソッド
      • e.class:例外のクラス名を返す
      • e.message:例外のメッセージを返す
      • e.backtrace:コールスタックを配列で返す
    • 捕捉する例外の指定
      • rescue LoadError => e ...
  • 例外まとめ
    • raiseで発生
    • rescueで捕捉(catch的な)
    • else節では例外が発生しなかった場合だけ行う処理を記述できる
    • ensure節では例外の有無に関わらず行う処理を記述できる(finally的な)
大域脱出
  • catch/throw
catch :triple_loop do
  loop do
    loop do
      loop do
        puts 'hoge'
        throw :triple_loop
      end
    end
  end
end
メソッドの定義と呼び出し
  • 記述方法
    • 1) 括弧を付ける:set_current(number)
    • 2) 付けない:set_current number
    • 基準として、戻り値を得るための式には括弧をつけ、手続きを実行するための文では括弧を省略するというものがある
    • 引数無しのメソッド呼び出しは、基本的に括弧を省略
member = find_member_by_name(name)

set_current number

member = find_member_first
  • 省略可能な仮引数
    • 仮引数には、デフォルト値として任意の式を与えることが可能
    • その場合、省略可能になる
def mail(name, message = 'Hi')
  "#{message}, #{name}"
end

test 'Ruby'            # => "Hi, Ruby"
test 'Ruby', 'Hello' # => "Hello, Ruby"
    • 仮引数の中でいくつでも省略可能な仮引数を記述できるが、途中にあった場合に、それだけ省略して呼び出すことはできない
  • 可変長引数
    • 仮引数の先頭に"*"を付けることで、任意の数の引数を配列として受け取ることが可能
    • 可変長引数は1つのメソッドに1つのみ
  • ブロックを渡す
    • yieldを呼び出すと、受け取ったブロックを実行
def block_test
  puts '1'
  yield
  puts '3'
end

block_test do
  puts '2'
end # 1, 2, 3と順に表示
  • メソッドに別名を付ける
    • alias:alias greet puts でputsをgreetという名前で呼び出せる
基本的な組み込み関数
  • Kernelモジュールに定義されているいくつかの組み込み関数について説明
    • 入出力やファイル読み込み、外部コマンドの実行などの機能を提供
  • 文字列の入出力
    • puts:任意の数の引数を受け取り、末尾に改行がなければ、改行を付けて順に標準出力に出力
    • print:引数に受け取ったオブジェクトを順番に標準出力に出力
    • sprintf:文字列を特定のフォーマットにした結果を文字列で返す(C言語と同じ)
    • warn:与えられた引数を$stderr(デフォは標準エラー出力)に出力
    • gets:定数ARGFから一行読み込んで返す。スクリプトの引数に指定が無い場合、ARGFには標準入力が使用される
  • 外部コマンドの実行
    • ``(バッククォートで囲む):`head ~~~`のように書ける
    • system:引数のコマンドを実行し、標準もしくは標準エラー出力に出力。返り値はtrue/false。system('uname')のように書ける
    • exec:systemと同様。ただし、実行中のRubyプロセスは外部コマンドのプロセスに変わり、外部コマンドの実行が終わるとそのままプロセスが終了する
    • spawn:外部コマンドの終了を待たず、プロセスのPIDを返して続くプログラムを実行
  • 外部ファイルの読み込み
    • require:引数にファイル名を受け取り、ライブラリを読み込む。ファイルはRubyスクリプトか拡張ライブラリ(.so/dll/bundle)のみ。
    • require_relative:実行中ファイルからみた相対パスでrequireを行う
    • load:拡張子の自動的な補完を行わない。requireと異なり同じパスのファイルを何度でも読み込む。
  • 割り込みハンドラの定義
    • trap

[Hadoop] 環境構築

内容:3章 Hadoopの導入

前提知識
  • MapReduceのバージョン
    • 1.0系:JobTrackerとTaskTrackerからなるジョブ実行フレームワークを採用。MRv1と呼ばれる
    • 2.0系:MRv1と異なる新しいジョブ実行フレームワークYARNを採用。
    • 書籍ではMRv1を採用(MRv2が安定していない、主要な周辺プログラムが対応していない)
  • Hadoopの動作モード
    • ローカルモード:1台のサーバ上でHDFSは使用せずにMapReduceの動作環境を構築
    • 疑似分散モード:1台のサーバ上でHDFSを使用した〃
    • 完全分散モード:複数代のサーバで〃
実際の構築

作業時間

  • Ruby:3ポモドーロ
  • Hadoop&CodeIQ:1ポモドーロ