一応できたっぽいけどソースぐちゃぐちゃ。リファクタリング必須。