理系学生日記

おまえはいつまで学生気分なのか

Ruby 処女作書いた

Ruby のプログラムどうやったらええんやみたいな感じだった。yak shaving 状態!!!みたいなかんじだった。
Ruby 親しみを持ちたいと思ったけど、どうしたらええんか分からなかったので、とりあえず人のツイートゲットして sqlite に取り込むみたいなの作ってる。ActiveRecord とか見様見真似なので、もっと良いやり方あると思うけど、ActiveRecord に親しみを覚えるよりか、Ruby の文法とか標準モジュールとか覚えないといけないとおもう。
処女作の名前がストーカーなの、あんまし良くないとおもう。あんまし良くなくて、ストーキング対象を保持するテーブル WATCH_USERS っていう名前にしていて、本当はストーキング対象者みたいなテーブル名が良かったんだけど、なんかうまい英語が思いうかばなくてつらみがあった。

最終的なところでいうと、RSS を吐き出して LDR で監視したり、GrowthForecast と連携させてみなさんのツイート時間の傾向を分析したり、Sinatra あたりをつかって自分用 twilog みたいなの作って、ぼくがみなさんのツイートを愛でたりしたいです。

require 'pit'
require 'yaml'
require 'active_record'
require 'twitter'

module Stalker

    class Main

        attr_reader :conf

        private

        def configure( environment )
            @conf = ::YAML::load_file( './conf/settings.yml' )[environment]
            configure_twitter
        end

        def configure_twitter()
            conf = ::Pit.get("stokerss", :require => {
                    'consumer_key' => 'consumer key',
                    'consumer_secret' => 'consumer secret',
                    'oauth_token' => 'oauth_token',
                    'oauth_token_secret' => 'oauth token secret',
                })

            Twitter.configure do |config|
                config.consumer_key = conf['consumer_key']
                config.consumer_secret = conf['consumer_secret']
                config.oauth_token = conf['oauth_token']
                config.oauth_token_secret = conf['oauth_token_secret']
            end
        end

        def establish_connection( dbconf )
            ::ActiveRecord::Base.establish_connection( dbconf )
        end

        public

        def initialize ( opts = {} )
            environment = opts[:env] || 'development'
            configure(environment)
            establish_connection(@conf['db'])
        end

        def retrieve_tweets( opt = {} )
            Stalker::WatchUser::get_valid_user.each do |user|
                opt['since_id'] = Stalker::Tweet::max_id_for(user.screen_name)

                retrieve_tweets_for( user.screen_name, opt )
            end
        end

        def retrieve_tweets_for( screen_name, opt = {} )
            Stalker::Tweet.transaction {
                Twitter.user_timeline( screen_name, {
                        :since_id => opt['since_id'] || 1,
                        :count => opt['count'] || 10,
                }).each do |tweet|

                    Stalker::Tweet.new(
                        tweet_id: tweet.id,
                        tweet_text: tweet.text,
                        screen_name: tweet.user.screen_name,
                        tweet_created_at: tweet.created_at.to_s
                    ).save
                end
            }
        end
    end

    class WatchUser < ::ActiveRecord::Base
        def self.get_valid_user
            where(delete_flg: 0)
        end
    end

    class Tweet < ::ActiveRecord::Base
        def self.max_id_for(screen_name)
            where(screen_name: screen_name).maximum(:tweet_id)
        end
    end

end