quattro_4 scribble

scribble 落書き (調べた事をただ落書きする)

RubyTapas #039 - #046

やる気が尽きるのも時間の問題かもしれないからできるときにやる
書籍とかも頭から読んで読まなくなる事多々あるので
今日は新しい方をやる

039 Gem Love Part 1

Rubygems plugin basic structure

require 'rubygems/command_manager'

Gem::CommandManager.instance.register_command :love

class

class Gem::Commands::LoveCommand < Gem::Command

methods

initialize, arguments, usage, description, execute

Include lib

$ RUBYLIB=./lib:$RUBYLIB gem help commands

innocuous 無害の、退屈な、無難な

http://eow.alc.co.jp/innocuous/utf-8/

040 Gradual Stiffening

ruby scriptでRFC822 formatをjsonに変換

ruby -n -a -rjson \

-n loop over lines of input data
-a automatically split line into fields -> array
-rjson require json

BEGIN executed once before loop END executed once last

気になったポイント

$/ , $; などを分かる言葉で表現する

require 'English'
$INPUT_RECORD_SEPARATOR = "\r\n"
$FIELD_SEPARATOR        = /:\s*/

json output

JSON.pretty_generate(headers)

使えそうな機会に遭遇したらまた思い出そう

stiffen 固くする、強化する、強める

http://eow.alc.co.jp/search?q=stiffen

041 String#scan

知ってた

blockと () のは知らなかった

EMAIL_PATTERN = /(\S+)@(\S+)/i

text.scan(EMAIL_PATTERN) do |name, host|

String#scan は自分がRubyを日常的にやっていられるようにしてくれた
思い入れのあるmethodでもある

独学でRuby触ってて、なぜかscanを多用してたことがあって
覚えてたおかげで採用の時に役立った

text.scan(/\w+/).each{|word| puts word if word =~ /^b/}

のような解答を出した気がする
(今はもっとコンパクトにできる)

泣ける

42 Streaming

★★

アクセスログなんかのCSVの簡単な集計で
メモリの消費を見ながらの書き方の説明

メモリの計測

def memstats
  size = `ps -o size= #{$$}`.strip.to_i
  "Size: #{size}"
end

CSV.read はすごいメモリ食う
CSV.foreach はOK CSV.open と 内部でEnumerator(each) 使うのもOK

$$ - Process.pid - カレントプロセスのプロセス ID を返します。

Process - Rubyリファレンスマニュアル

043 Exclusive Or

value=nil と value || yield という使い方

def replace_var(text, var_name, value=nil)
  text.gsub!(/\{#{var_name}\}/) { value || yield }
end

引数、ブロックのチェックで XOR ^
(どちらか一方のチェック、両方はだめ)

def replace_var(text, var_name, value=nil)
  unless block_given? ^ value
    raise ArgumentError, 

ためになる

本題と別で Array#sample - ランダムに要素を返す

sample (Array) - Rubyリファレンス

044 #one?

★★

知らなかった

any?, all? はよく使うが

1つだけ真だった場合にtrue

one? (Enumerable) - Rubyリファレンス

none? もある

これは使えそう

045 Hash Default Value

★★

countにはかなり使える

word_count = Hash.new(0)

[] をデフォルトにするのは問題
前に遭遇したことある

# BAD
h = Hash.new([])

# WORKAROUND
h = Hash.new { |h, k| h[k] = [] } # !> shadowing outer local variable - h

このmarkdownなんか [[ ]] の表示が良く分からない

046 Gem Love Part 2

gem pluginをrspec

class Rubygem を拡張したり

data_mapperとか理解にはまだ時間かかる

雰囲気だけつかんだ

面白そうな部分 sqlite:memory

before :all do
  DataMapper.setup(:default, 'sqlite::memory:')
  DataMapper.auto_migrate!
end