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 を返します。
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 - ランダムに要素を返す
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