typo しにくい id を自動生成
hiveminder のタスク id とかってidの16進数の下位4ケタみたいな感じになっているのですが、あれが激しくうちにくくて、ついでに連番っぽいので間違えて違うタスクを done しちゃったりします。そゆことにならないような id を生成するのをつくってみました。
- 数字は遠いし typo しやすいので使わない
- qwert キーボードに限定しない
というかんじにしたいので、aiueo 以外の文字 + aiueo を連番で出すようにしてみました。こういう配列は日頃からうっているのでうちやすいはず!!
class TypableMap < Hash
Roma = "a i u e o k g s z t d n h b p m y r w j v l q".split(/ /).map {|k|
%w|a i u e o|.map {|v| "#{k}#{v}" }
}.flatten
def initialize(size=2)
@seq = Roma
@map = {}
@n = 0
@size = size
end
def generate(n)
ret = []
begin
n, r = n.divmod(@seq.size)
ret << @seq[r]
end while n > 0
ret.reverse.join
end
def push(obj)
id = generate(@n)
self[id] = obj
@n += 1
@n = @n % (@seq.size ** @size)
id
end
alias << push
def clear
@n = 0
super
end
private :[]=
undef update, merge, merge!, replace
end
map = TypableMap.new
id = map.push(:foo)
p id #=> "aa"
map << :bar
map << :baz
p map #=> {"aa"=>:foo, "ai"=>:bar, "au"=>:baz}かなり適当ですが結構うちやすいかなと思います。
でもって tig.rb に組み込んで自由に、確実に fav れるようにしてみました。( http://coderepos.org/share/changeset/13144 )
CTCP ACTION で fav ai などを送ると、目的のメッセージが fav できます。CTCP ACTION はクライアントによって送りかたが違いますが、irssi だと /me です。/me fav eita などなど