Vim 8.0 で追加された定数 v:t_TYPE

Vim 8.0 では新しく type() が返す値が v:t_xxx のような定数として追加されました。

v:t_bool     Value of Boolean type
v:t_channel  Value of Channel type
v:t_dict     Value of Dictionary type
v:t_float    Value of Float type
v:t_func     Value of Funcref type
v:t_job      Value of Job type
v:t_list     Value of List type
v:t_none     Value of None type
v:t_number   Value of Number typ
v:t_string   Value of String type

これにより

if type(value) == type("")
    return value . value
endif

if type(value) == v:t_string
    return value . value
endif

という風に書くことが出来ます。

#tap で任意の戻り値を返す

以前も書いたような気がしますが、#tap で任意の戻り値を返したい場合は break を使用します。

# #tap は通常自身を返す
p 10.tap { |myself|
    myself + 32
}
# => 10

# #tap で戻り値を返したい場合は break を使用する
p 10.tap { |myself|
    break myself + 32
}
# => 42

#tap は使い方を覚えておきたいですなあ。

パソコンを新しくした

久々に金が手に入ったのでメインで使用してるデスクトップパソコンを新しくしました。
もちろん自作です。
流石にこの時代に Core2Duo はつらかった。

[構成]

  • 【CPU】Core i7 6700K BOX
  • 【CPUクーラー】虎徹 SCKTT-1000
  • 【メモリ】CMK16GX4M2A2666C16 [DDR4 PC4-21300 8GB 2枚組]
  • マザーボード】Z170 Extreme4
  • 【ケース】Fulmo.Q ECA3360B-BT(U3) [Black] ドスパラWeb限定モデル
  • 【電源】SSR-650RMS [ブラック]

http://niku.webcrow.jp/?M85NC9cxKs4w0zHOCfPRMc5Ny9MBA6NKb3cd49SIMh09Qx0IBAMQQw8IyowA

三日三晩ぐらい悩んでこの構成になりました。
合計で80,000円弱ぐらいです。
どうせオーバークロックしないだろうし、Core i7 6700+H170-Pro の構成で安くしてもよかったのですが『どうせなら性能が良いほうが…』という感じでこうなった。
その結果 10,000円ぐらい高くなったけど仕方ないよね(白目。
あとはマザボの Z170A とどっちにするか悩んだり、電源ユニットはどれぐらいのワット数がいいか…などなど考え始めたら無限に時間が取られていきました。
まあ自作はパーツ構成考えるのも楽しいんですけどね。
ちなみにグラボとストレージは前のパソコンから流用です。
グラボもそのうち買うと思いますが、HDD の方がもう3年ぐらい経つのでそっちを先に新しくしたいところ。

[組み立て]

時間はかかりましたが、組み立て自体は特に問題なくできました。
また、今回購入した 6700K には CPU クーラーが付属してないので、初めて専用の CPUクーラーを購入しました。
こういう CPU クーラーをつけるのは初めてだったので結構戸惑いましたね…。
想像通りかなりごついので、その後の配線などに苦労しました。
特にマザーボードの 8ピンの電源の位置が電源ユニットから遠かったのでかなり無理やり配線することに…。
とりえあず、BIOS(と、いうかUEFI?) でマウスが動いて感動した。

[所感]

流石に化石みたいなパソコンからの移行なので起動速度などは比べ物にならないぐらい早くなりましたね…。
あと特にパーツを選ぶときに意識したわけではないのだけれど、起動音がめちゃ静かでびっくりした。
最初に電源をつけた時に起動してるのが気づかないぐらい静かです。
まだ、開発用途では使用してないのでどれぐらい快適になってるか楽しみです。
あとマザーボードから HDMI 出力ができるっぽいのですが、テレビに出力しようとしたら出来なかったのでなんとかしたいところ。
ちなみに移行する前に Ubuntu のアップグレードをしたら失敗して Ubuntu が死にました

Vim の funcref() した関数を削除した時の挙動

ふと、気になったので試してみました。

[funcref() した後に :delfunction する]

function! Test()
    return "test"
endfunction

let F = funcref("Test")

delfunction Test

echo F()
" E933: 関数は削除されました: Test
" E15: 無効な式です: F()

まあ、これは予想通りですね

[関数を上書きしてから削除する]

次は、削除する前に関数を上書きして試してみた。

function! Test()
    return "test"
endfunction

let F = funcref("Test")

function! Test()
    return "over test"
endfunction
delfunction Test

echo F()
" => test

この場合は、funcref() した関数は消されるに残ってるみたいです。

Ruby の Symbol#to_proc に引数を渡す拡張

[1,2,16].map(&:to_s(16)) みたいにかきたいよねー』というやつ。

class Symbol
    def call *args, &block
        proc { |myself|
            myself.send self, *args, &block
        }
    end
end

p [1, 2, 16].map(&:to_s.(16))
# => ["1", "2", "10"]

#call を定義してこういう風に書くことはできるけどもさて。

[おまけ]

iolite を使用するとこういう風に書くことは出来ます。

require "iolite"

include Iolite::Placeholders

p [1, 2, 16].map(&arg1.to_s(16))
# => ["1", "2", "10"]

[元ネタ]

このあたり

Ruby で alias_method の元の名前を取得する

RUbyalias_method した元の名前を取得したい場合 Method#original_name で取得することが出来ます。

class X
    def homu
        "homu"
    end

    alias_method :mami, :homu
    alias_method :mado, :mami
end

x = X.new
p x.method(:homu).original_name
# => :homu
p x.method(:mami).original_name
# => :homu
p x.method(:mado).original_name
# => :homu

[おまけ]

また、標準ライブラリも alias されているなら同様に取得することが出来ます。

p [].method(:to_s).original_name
# => :inspect

RSpec で指定した行のテストのみ実行する

rspec に渡すファイル名の末尾に ファイル名:行番号 と指定すればその行番号のテストのみが実行されます。

$ rspec path/to/hoge_spec.rb:42

これで42行目に関連してるテストが実行されます。