Ubuntu でマウスのボタンを入れ替える

最近新しいマウスを購入したんですが、サイドに付いてるボタンの配置が以前つかっていたマウスと逆だったので設定を変更しました。

[xmodmap を使って入れ替える]

xmodmap を使うのがよさそうだったのでやってみました。
設定は ~/.xmodmap ファイルに記述し、今回は入れ替えるボタンが 89 だったので以下のように設定します。

# ~/.xmodmap
pointer = 1 2 3 4 5 7 6 9 8 10 11 12 13

このファイルを作成したあとに

$ xmodmap ~/.xmodmap

と、することで設定が反映されます。

Vim 8.0 で追加された関数 json_decode()/json_encode()

Vim 8.0 では JSON 形式のデータを扱う機能が追加されました。

[注意]

Vim のヘルプを日本語翻訳してるvimdoc-jaですが、まだ最新版の Vim のヘルプに追従しておらず jsondecode()jsonencode() と表記されていますが、正しくは json_decode()json_encode() になります。 他にも最新版のヘルプに追従されてない表記があるので、最新版の機能などを使う際は :help json_decode()@en のように英語版のヘルプを参照するとよいです。

[使い方]

json_encode({expr})Vim script の値を渡して JSON 形式の文字列に変換し、json_decode({string})JSON 形式の文字列を Vim script の値に変換します。

let s:data = {
\   "size" : 3,
\   "chars" : [
\       "homu",
\       "mami",
\       "mada"
\   ]
\}

let s:json = json_encode(s:data)

echo s:json
" => {"chars":["homu","mami","mada"],"size":3}

echo type(s:json) == v:t_string
" => 1

echo json_decode(s:json)
" => {'chars': ['homu', 'mami', 'mada'], 'size': 3}

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"]

[元ネタ]

このあたり