飲んだり寝たり

だいたいメモ

Re: 接客と委譲とオープンクラス

委譲とオープンクラスを接客で例示する, という話が【Ruby】接客と委譲(元は「接客と委譲とオープンクラス」だったかな)で書かれていてすごくいい例示だと思ったんだけど, なんかちょっと違うなーと思ったところがあったので書いてみる. 設定とかは本家を参照してほしい.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# チーフ
class Chief
  def initialize
    @info = { "トイレ" => "2F東3扉前", "喫煙所" => "1F西門外" }
  end

  def answer(target)
    puts "#{target}#{@info[target]}にございます。"
  end
end

# 日雇いバイト
class PartTimer
  def initialize(chief)
    @chief = chief
  end
end

# チーフのヤマダさん
yamada = Chief.new
# 日雇いバイトのタナカさん。担当チーフはヤマダさん
tanaka = PartTimer.new(yamada)

# お客さんにトイレの場所を質問されたヤマダさん
# 答えようとするのですが、教えられて(定義されて)ないのでパニックになります
tanaka.answer('トイレ')
# => NoMethodError: undefined method `answer' for #<PartTimer:0x007fa67d23ea58>

# ヤマダさん「タナカさん、分からなかったらお客さんにちょっと待っていただいて、私に聞いてください」
# タナカさんは、自分では解決出来ないときの対処法を教えられます
# 既存のクラスを拡張(オープンクラス)
class PartTimer
  def method_missing(name, *args)
    puts "少々お待ちください、ただいま分かる者に確認いたします…"
    @chief.__send__ name, *args
  end
end

# 今度は喫煙所の場所を聞かれたヤマダさん
# 自分では分からないのでチーフに確認し、その答えをお客さんに伝えます。
tanaka.answer('喫煙所')
# 少々お待ちください、ただいま分かる者に確認いたします…
# 喫煙所は1F西門外にございます。

# めでたしめでたし

ポイント

  • 一度定義したクラスに、オープンクラスによって新たなメソッドを定義している
  • method_missingの中でchiefに処理を委譲している

Railsでサブドメインを使ってルーティングを分ける

ざっとこんな感じ.

1
2
3
4
5
6
7
Rails.application.routes.draw do
  constraints subdomain: 'admin' do
    namespace :admin, path: '/' do
      root 'top#index'
    end
  end
end

admin.example.comでアクセスできて, コントローラはapp/controllers/admin/top_controller.rbになる.

開発時はadmin.lvh.me:3000にアクセスすればよい.

add_reference来てた

Rails4.0からadd_reference使えるようになってた.

1
$ rails g migration AddPiyoToHoges piyo:refernces

とかすると

1
2
3
4
5
class AddPiyoToHoges < ActiveRecord::Migration
  def change
    add_reference :hoges, :piyo, index: true
  end
end

なファイルが出来て

1
$ rails db:migrate

するとdb/schema.rb

1
2
3
4
5
create_table "hoges", force: true do |t|
  t.integer  "piyo_id"
end

add_index "hoges", ["piyo_id"], name: "index_hoges_on_piyo_id", using: :btree

みたいになる. 便利.

参考

add_reference - リファレンス - Railsドキュメント

sunspotでfacetの数に制限があった

facetはデフォルトだと100件までしか取れない.

1
facet(:hoge, limit: -1)

みたいにlimitに負の値を与えると制限無しになる.

Rubyのキーワード引数はハッシュで渡せる話

タイトルの通りなんだけどRailsでparamsを渡したらうまくいかなかったのでまとめてみた.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# キーワード引数取るメソッドを定義
[24] pry(main)> def f(a: 1, b: 2)
[24] pry(main)*   a + b
[24] pry(main)* end
=> nil

# キーがシンボルなハッシュはそのまま引数に渡せる
[26] pry(main)> h1 = {a: 10, b: 20}
=> {:a=>10, :b=>20}
[27] pry(main)> f(h1)
=> 30

# キーが文字列なハッシュやHashWithIndifferentAccessはだめ
[28] pry(main)> h2 = HashWithIndifferentAccess.new(h1)
=> {"a"=>10, "b"=>20}
[29] pry(main)> f(h2)
ArgumentError: wrong number of arguments (1 for 0)
from (pry):55:in `f`
[30] pry(main)> h3 = {"a" => 10, "b" => 20 }
=> {"a"=>10, "b"=>20}
[31] pry(main)> f(h3)
ArgumentError: wrong number of arguments (1 for 0)
from (pry):55:in `f`

# キーワード引数の一部のみのハッシュはあり
[32] pry(main)> h4 = {a: 30}
=> {:a=>30}
[33] pry(main)> f(h4)
=> 32

# 併用はダメ
[34] pry(main)> f(h4, b: 30)
ArgumentError: wrong number of arguments (1 for 0)
from (pry):55:in `f`

# おまけ
[37] pry(main)> def g(c, a: 1, b: 2)
[37] pry(main)*   a + b + c
[37] pry(main)* end
=> nil
[41] pry(main)> g(30, h1)
=> 60

BoxenやめてBrewfile+homebrew-caskにした

この前Boxen試してみたんだけど自分一人での構成管理には大袈裟過ぎるなと思って使うの止めてた. もっとライトに, マシン買い替えたときとかにセットアップ楽になる程度でも良かった.

Sublime Text 2で日本語の変換候補をTabで選択

Sublime Text 2で日本語入力をする際, Tabで変換候補を選べない問題を解決する.

Preferences > Key Bindings - Defaultを選択するとDefault (OSX).sublime-keymap(Macの場合)というファイルが開くので, 93~99行目辺りにある

1
2
3
4
5
6
7
{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
  "context":
  [
      { "key": "setting.tab_completion", "operator": "equal", "operand": true }
  ]
},

をコメントアウトして保存.