u16suzuの blog

日々学んだことのメモブログです。

  def check_names names
    return unless Hash === names

    invalid_options =
      names.keys.map { |k| k.to_sym } - [:rdoc, :clobber_rdoc, :rerdoc]

    unless invalid_options.empty? then
      raise ArgumentError, "invalid options: #{invalid_options.join ', '}"
    end
  end

今日は、rdoc の task.rbを読んだ。これは、名前をチェックするメソッドで、 hashのキーが指定したものだけであることをチェックしている。

Classをインスタンス化する時にHashで渡した値でInitializeする

Classをインスタンス化する時にHashで渡した値でInitializeする

class Person
  attr_accessor :name, :age, :address

  def initialize( hash={})
    if block_given?
      yield( self )
    else
      hash.each do |k, v|
        public_send("#{k}=", v) if respond_to?("#{k}=")
      end
    end
  end

  def to_s
    instance_variables.map do |ivar|
      value = self.send( ivar.to_s.tr("@", ""))
      "#{ivar}: #{value}"
    end.join(", ")
  end
end

p1 = Person.new({name: "taro", age: 20, address: 'tokyo'})
puts p1

p2 = Person.new do |f|
  f.name = "jiro"
  f.age  = 30
  f.address = "tokyo"
end
puts p2


class Man < Person
  def initialize(hash={})
    super(hash)
  end
end

puts Man.new({name: "saburo", age: 25, address: "saitama"})

Hash.newにブロックを渡す

以下の記事を読んで初めて知ったのでメモ。

Ruby で メモ化カッコカリ( #rubytokai 発表メモ) - 名古屋で数学するプログラマ(仮) 

Hash.new にブロックを渡すことができる。

このブロックはすぐには実行されずに、h["key"] と言う形で参照されたキーがhash内に存在しない時に 呼ばれる。いわゆる遅延実行。

h = Hash.new do |hash, key|
  hash[key] = 9999 + 9999 # 思いつかないけど何か時間のかかる処理
end

h["a"]
p h["a"] # => 19998
p h["a"] # => 19998

これを利用してメモ化を実装できる。

atomのタブやfuzzy-finderなどのフォントサイズを一括で変更するbash script

仕事でノートPCをモニタにつないだり、ノートPC本体だけで使ったりすることがあり、

atomの編集部分以外のフォントサイズを手軽に一括で変更したくて書いた。

### change atom font size
atom_font() {
  cd ~/.atom/styles
  case "$1" in
    "pc" )
      ln -sfv font_pc.less font.less;;
    "monitor" )
      ln -sfv font_monitor.less font.less;;
    * )
      echo "please specify 'pc' or 'monitor'"
  esac
  pops
}

各環境ごとのフォントサイズをファイルに書いておく。

今回は .atom/stylesにファイルを作成した。

$ cat styles/font_pc.less
@font_size: 15px; // PC

$ cat styles/font_monitor.less
@font_size: 20px; // monitor

atomstyles.less 側では @import しておく。

@import "./styles/font.less";

// Font size
// 検索結果, 検索タブ, タブのタイトル
body, html, .panel-heading, .title, .file.entry, .directory.entry {
  font-size: @font_size;
}
.fuzzy-finder {
  font-size: @font_size;
}
.command-palette {
  font-size: @font_size;
}

pc モード

フォントサイズ15px

f:id:u16s:20161124014350p:plain

monitor モード

フォントサイズ20px

f:id:u16s:20161124014338p:plain