そんな今日この頃でして、、、

コード書いたり映画みたり。努力は苦手だから「楽しいこと」を探していきたい。

#グラドル自画撮り部 の画像TLを延々眺められるサービス をちょっとだけアップデートした

地鶏専科#グラドル自画撮り部

f:id:blue1st:20140223000538p:plain

我ながら結構よく出来た気がする。

以下前回(ひたすらグラドルの自画撮りを眺めるサービスを作ってみた - そんな今日この頃でして、、、)より変更点。

TwitterAPIのレスポンスからRT・リプライを取り除く

「とりあえずTLを取得してみよう」位の意気込みで作ったので、レスポンスの中身について理解が怪しかったので、ちゃんとSearchAPIの仕様読んで作ってみた。

GET search/tweets | Twitter Developers


サービスの性質上、本人が投稿した以外のツイートと重複して表示されるのはうざったい。

今回TL取得に使用しているNet::Twitter::Lite::WithAPIv1_1では、読んだ記事によってはexclude項でRTやリプライを除外する指定が出来るようなことを書いてるものもあるけど、API仕様やらCPANやら実際の挙動やら見るかぎり働かなそう・・・?

Net::Twitter::Lite::WithAPIv1_1 - search.cpan.org

というわけで取得したTLより

  • retweeted項がnullでないもの
  • in_reply_to_status_id項がnullでないもの

は排除する形で対応した。

  my $data = $handle->search($search_param);
  my @tweets;
  foreach my $tweet ( @{$data->{statuses}} ){
    foreach my $media ( @{$tweet->{entities}->{media}}){
      next unless $media->{type} eq 'photo';
      next if defined $tweet->{in_reply_to_status_id};
      next if $tweet->{retweeted};
      push @tweets, {...

AmazonAPIで関連商品があれば表示するようにした

小銭欲しいでゲス

グラドルさんの商売の促進のために、AmazonAPIをアカウント名で検索結果を上部に表示するようにした。

最初はLWPで取得してパースして…とやろうとしたけれど、大変そうだったのでNet::Amazonモジュールを使用。

Net::Amazon - search.cpan.org

自力でやろうとすると面倒なURIエンコードとかそのあたりを気にしないで済むので楽。

後述するけど、$cacheオブジェクトを引数で渡すと勝手に一次キャッシュ化してくれる構造は凄く良いなと思った。

Redisを一次キャッシュとして用いてAPI参照回数を削減する

「HerokuでRedisをつかってみたい」というのも実はテーマだったので使ってみた。

Redis To Goアドオンの追加

ディレクトリ内でアドオン追加コマンド実行

$ heroku addons:add redistogo

すると何かHerokuのURLにアクセスして入力しろと怒られる。

どうやら無料プランの使用でもクレカの登録が必要らしい。

登録が済んだ後、同コマンドで追加完了。

$ heroku config

で接続情報が確認できる。

REDISTOGO_URL: redis://[user]:[password]@[host]:[port]/

ローカルと本番環境で接続先を変えるようにしてRedisを使用すればOK。

今回はRedisDBモジュールを使用。

一次キャッシュとして使う用のオブジェクト作成

AmazonAPIの項で述べたように、Net::Amazonでは検索コマンドの引数で$cache->set($key, $value);/$cache->get($key);ができるオブジェクトを渡せば勝手に一次キャッシュ化してくれる。

便利なのだが、RedisではMemcachedみたいにデフォルトの揮発時間を設定しておくことができないので、そのまま使うと無駄に永続化されてしまう。

そんなわけでRedisDBを継承したパッケージを作り、setメソッドをオーバーライドして揮発時間を設定できるようにした。

package Rcache;
use base qw/RedisDB/;

sub set {
  my ($self, $key, $value, $expire) = @_;
  $expire = 60 * 60 unless $expire;
  $self->SUPER::set($key, $value);
  $self->expire($key, $expire);
}

Net::Amazonにはこのオブジェクトを渡すことでデフォルトの揮発時間60分が適用される。

また、TwitterAPIについてはtweetJSON化したものを渡すことで、キャッシュ化した。


冷静に考えたら、この使い方なら普通にmemcachedアドオンにしとけば良かった気はするが、まあ実験なので。

Redisのランキングにより「おすすめ」を表示する

せっかくRedis使うのにMemcachedの代替みたいなことだけというのも勿体無いので、各アカウントのページに飛んだ数をzsetで記録して、上位を「おすすめ」として表示するようにしてみた。

まとめ

HerokuでDB使おうとすると開発で使ってるSQLiteが使えなかったりスキーマ管理が面倒だったりして尻込みしていたのだけれど、RedisToGoはアドオン追加と接続情報の切り替えさえできればスルッと使えるので楽で良かった!

今だに課題なこと

たまに重複したツイートを取得してしまう

無限ローディングでは、テンプレート側に渡したツイートリストの最後のID - 1を次回のTL検索のパラメータとして渡しているはずだが、たまに重複したツイートが表示されてしまう。

バグなのかAPIの何かしらの仕様なのか・・・?

HerokuではじめるRailsプログラミング入門

HerokuではじめるRailsプログラミング入門



そういえばWeb的な話といえば

モバイルアプリ・Web開発にオススメの Chrome 拡張機能 10選 - Pairy Tech Blog

↑JSONViewとか結構助かる。


http://www.cresc.co.jp/tech/java/Google_Dart/DartLanguageGuide.pdf

↑AltJSってどうにもやる気が起きないのだけど、単純に別言語として興味がわいた。 これだけのボリュームが無料で読めるのは凄い。 とりあえずiPadに入れておきたい。


上坂すみれ 3rdシングル「パララックス・ビュー」MV 特設ホームページ

↑のページの実装は「すごい……」の一言。