2013/06/19(水)目標管理Webサービス「Tustle!」の仕組み

2013/06/19 23:10
6月6日に[Tustle!](http://tustle.jp/)という目標管理Webシステムをリリースしました。このブログをご覧のみなさまにも使っていただけると嬉しいです。 このシステムは私とjoeくん([@joe_uragami](https://twitter.com/joe_uragami))で作ったのですが、その仕組みについて簡単にご説明したいと思います。またの名を「こんなところで苦労したリスト」です。 #### ■ 言語 最終的にはPython + Djangoに落ち着いていますが、実はこのシステム自体は紆余曲折がありまして、以下のような変遷を辿っています。
Java + Wicket
Wicketで始めるオブジェクト指向ウェブ開発を読んで惚れ込んだ私のわがままで環境が決定しました。しかし、当時は現在のように安価なVPSはなく、肝心な公開する方法が思い当たらなかったので、やむを得ず方針転換することになりました。
PHP + kohana
PHPであれば動かすサーバーには困らないだろうということで決定しました。kohanaを選んだのはやはり私のわがままです。しかし、Javaがメインである私もjoeくんも、フレームワーク云々よりもそもそもPHPに馴染めなかったこと、また、GAE/Jの存在を知ったことで、またもや方針転換することになりました。
Java + Slim3
joeくんと二人で「Slim3すげぇ」「これGAE以外でも動くといいのになぁ」と言いながら、かなり楽しみながら開発することができました。このときに、副産物としてテスト用ユーティリティを作っています。しかし、本業の参入プロジェクトが派手に炎上したため、残念ながら開発が遅々として進まず。その間にGAEの料金体系が変更され、これならVPSを借りたほうがいいんじゃないかということで、三度方針転換することになりました。
Python + Django
Java開発者の読むDjangoの設計思想が決め手になりました。また、これまでに何度もリスケしていて、いつになったら公開できるかわからない状況になってしまったので「もう機能は削ってでもリリース日は絶対に動かさない」と決めました。もっとも、システムテスト中に本業のほうがどうしようもないくらい燃え上がったこと、最後の最後でどうしても実装したい機能が追加されたこと(後述)もあり、4月1日リリースを5月→6月と延ばしたのですが、なんとか6月6日に公開することができました。
#### ■ ログイン認証 これは早い段階で「自分たちでアカウントを持ちたくない」ということを決めていました。個人情報を預かりたくないというのもありましたが、アカウント作成のメールを出す処理とか、パスワード忘れ対応とか、作りたいシステムの本質とは直接関係ない部分の作り込みが多数発生するのが嫌だったというのが大きいです。 GAE上で動かすときはGoogleアカウントを使おうと思っていたのですが、Djangoに方針転換してからは、自分たちが使っていること、Python用のTwitter APIライブラリであるTweepyが非常に使いやすいことから、Twitterアカウントを認証に使わせてもらうことにしました。ちなみに、Twitter API1.0から1.1の対応も、Tweepyのバージョンアップだけで済んでいます。素晴らしい。 また、Djangoは認証のバックエンドを簡単に差し替えられるので、Twitter認証バックエンドとして[Twingo](https://github.com/7pairs/Twingo)を作って公開しました(全文検索用の対応などもあったため、実際にTustle!で動いているのは公開しているソースに手を加えたバージョンです)。 #### ■ 全文検索 GAEのときはgomokuを使って分割した値をListのまま保存し、検索時には検索ワードをgomokuでバラしてからListの値をチェックしに行く、という方法を取っていました。 DjangoになってからはRDBを使用するので、Listのまま保存するということはできません。検索用キーワードを別テーブルにするというのも考えましたが、新規作成時のINSERTはともかく、変更時のUPDATE(実際にはDELETE/INSERTになりそうですけど)が面倒そうだし、パフォーマンス的にもどうなるか疑問です。もちろん、一番楽なのはLIKE検索なのですが、それもやはりパフォーマンスが微妙なことになります。 いろいろ調べてみたところ、textsearch_jaのことを知りました。うん、これならやりたいことができそうだ。 というわけで、現在のTustle!はPostgreSQL + MeCab + textsearch_jaで実現しています。[開発用マシンであるMacBook Airに環境構築する際は非常に苦労しました](http://short-circuit.jp/programming/20130106183427)が、環境が組み上がってからは満足の行く結果を出してくれています。 #### ■ 画像アップロード 実は土壇場で追加した機能です。 VPSの容量的な問題もありますので、画像の機能を実装するのは諦めていたのですが、ベータ版を見ていただいた先輩に「Flickrに上げればいいんじゃない?」と言われ、悩んだ末にリリースを少し遅らせて実装することにしました。先ほど書いた「機能は削ってでもリリース日は絶対に動かさない」の逆を行く行為でしたが、出来上がったものを見てみるとこの判断は正解だったと思います。さすがに仕事だったらこんな判断はできませんが……。 Flickrとの連携には[Python Flickr API kit](http://stuvel.eu/flickrapi)を使っています。最近あまり更新されていないので少し不安ではあったのですが、ひととおり確認してみたところ、問題なく動作するようなので使わせてもらいました。 問題はFlickrが米Yahoo!のアカウントを要求するため、新規にアカウントを作るハードルが高いことでしょうか。joeくんが詳細なマニュアルを作ってくれましたが、英語サイトということで抵抗が出てしまう人も多いと思います。でも、こればっかりは仕方がないですよねぇ……。 #### ■ デザイン ほぼ100%デザイン担当のjoeくんにお任せしていましたので、私はまったく苦労していませんw そのうちきっとjoeくんがデザイン面のお話をしてくれると無茶振りしつつ、今日のエントリの締めくくりとさせていただきたいと思います。