2008年 06月 03日

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 などなど