gem化リリースできるレベルまで持ってけてないので、いったん必要部分だけ移植した形で