とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

RubyでTwitter Streaming APIを使ってみる2

前回の宣言通りTweetStreamを使って書きなおしてみた。
tweetstream/tweetstream · GitHub

コードを書く前にTweetStreamのGemをインストール

gem install tweetstream

そしてコード

ちなみに前回までは秘密鍵とかトークンとかを直書きだったけど、なんとなくYAMLを使った設定に変えてみた。


基本的には前回のEM-Twitterの時と同じようなコードになってはいるが、こちらは自分でJSONにParseしなくてもいいという一手間省けた感じ。


また、使いたいAPIのアドレスやフィルタリングする際も最初にオプションに指定するのではなく、メソッドやメソッドの引数として指定できるのが良い感じ。


てなわけで、特に理由がなければTweetStreamでいいかなと思います。

RubyでTwitter Streaming APIを使ってみる1

その昔TwitterAPIを使ってBOTを作ろうとしたことはあったが、Twitter4Rを利用するところまでやってBOTのコンセプトが決まらなかったのでやめた。


で、今回また何かしようと思って調べた所、最近のTwitterはStreaming APIを利用すればこちらからPullしなくてもTwitter側から自動的にPushされるらしい。


The Streaming APIs | Twitter Developers


そんなわけで今回はTwitterのStreaming APIを使ってみた。
とりあえず手始めに使ったのはEM-TwitterというGemライブラリ。
tweetstream/em-twitter · GitHub

Twitter Streaming APIからのイベント(Push)が来ると自動的に動作するClientを実装できるらしい。
そこのサンプルに載っていたコードを元に書いたのが下のソースコード



サンプルでは、Filterを用いてTwitterのTLから"yankees"という単語を拾ってきていたが、ここでは"Ruby"という単語を含むTweetがあった場合にそのテキストを出力している。
ちなみに1行目の文字コード指定をしていないとRuby1.9系ではデフォルト文字コードがUS-ASCIIのため日本語でフィルタリングができない(プログラムが動かない)ので日本語を扱う際には必要である。


Twitter Streaming APIの機能を全て使おうとした場合はOAuthが必要になるので、コンシュマーやトークンの設定を行う必要がある。
設定は以下のページからログインを行い右上のアイコンをクリックして"My Application"のページから新規アプリケーションを作成すると発行される。


Twitter Developers


また、Twitter側から自動的に送られてくるレスポンスはJSON形式のため、サンプルを少し拡張して、レスポンスをJSONのパーサーに通すことで、データアクセスの利便性を上げている。


これで無事にサンプルが動いたので、次はもう少し簡単に書けるらしいTweetStreamを試してみる予定。

2011年 DevQuizの一人ゲームを解いてみた

今更ながら諸事情で2011年のGoogle Developer Daysの参加の際に、審査に使われたDevQuizの一人ゲームをRubyでといてみた。

gets.to_i.times do
  gets
  queue = [gets.split.map{|s|s.to_i}]
  ans = 0 

  until queue.empty?
    tmp = []
    queue.each do |test|
      tmp << test.map{|i|i/2}
      array = test.clone.delete_if{|i|i%5==0}
      if(array.empty?)
        tmp = []
        break
      elsif(array != test)
        tmp << array
      end 
    end 
    queue = tmp 
    ans += 1
  end 
  p ans 
end

採点はすでに停止していたようなので、他の回答者のスクリプトの出力結果とdiffをとった所あっているようなので多分あってると思う(ぉ

RailsでActiveRecordの削除

MongoDBを使うのでActiveRecordを使う必要がないのだが、SQLite3のGemがないというエラーが出た。

gem install sqlite3

で動くのだけどこれだといらないはずのGemが含まれてしまう。


調べてみたらconfig/application.rbの設定を書き換えればいけるらしいのでやってみた。

vim config/application.rb 

config/application.rb

require File.expand_path('../boot', __FILE__)

#require 'rails/all'
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
(以下略)

これでActiveRecordを使う設定がなくなり、SQLite3のGemを入れなくてもMongoDB単体で動くようになった。

Rails3でMongoid使ってみた

最近MongoDBに興味があるのでRails3から触ってみることにした。


今回はObject-Document-Mapper(ODM)にMongoidを使ってみる。
前にMongoDBのODMにMongoMapperを使おうとしていたのだが、うまくインストールできなかったことがあった。
MongoDB触ってみる - 情報技術漫才誌


その時コメントでid:Kirikaさんから「Mongoidのほうがオヌヌメ」と言われて調べてみたら確かにMongoidが(検索数的に)よさげだったのでMongoidを使ってみることに。


前回のMongoMapper挑戦時にMongoDBがすでにインストール済みなので、インストールはこれだけ。

% gem install mongoid -r

Railsから使うのであればGemfileに書いておく。

% vim Gemfile
gem 'mongoid'を追加して保存
% bundle install

準備ができたらgenerateを使ってモデルを作成

% rails generate model model_name

Mongoid config not found. Create a config file at: config/mongoid.yml
to generate one run: rails generate mongoid:config


Mongoid preload_models is set to false. If you are using
inheritance in your application model please set this to true or
you will experience querying inconsistencies in dev mode. Note that
this will severely decrease performance in dev mode only.

      invoke  mongoid
      create    app/models/model_name.rb
      invoke    test_unit
      create      test/unit/model_name_test.rb
      create      test/fixtures/model_names.yml

作ったモデルの確認

%vim app/models/model_name.rb
class ModelName
  include Mongoid::Document
end

モデルにinclude Mongoid::Documentがされているのがわかる。


ちなみにモデルを削除する場合はdestroyを使ってモデルを削除

% rails destroy model model_name

Mongoid config not found. Create a config file at: config/mongoid.yml
to generate one run: rails generate mongoid:config


Mongoid preload_models is set to false. If you are using
inheritance in your application model please set this to true or
you will experience querying inconsistencies in dev mode. Note that
this will severely decrease performance in dev mode only.

      invoke  mongoid
      remove    app/models/model_name.rb
      invoke    test_unit
      remove      test/unit/model_name_test.rb
      remove      test/fixtures/model_names.yml


あとデフォルトでtimestampを使えるみたいなのでそっちも使ってみる。

% rails generate model model_name --timestamps=true

Mongoid config not found. Create a config file at: config/mongoid.yml
to generate one run: rails generate mongoid:config


Mongoid preload_models is set to false. If you are using
inheritance in your application model please set this to true or
you will experience querying inconsistencies in dev mode. Note that
this will severely decrease performance in dev mode only.

      invoke  mongoid
      create    app/models/model_name.rb
      invoke    test_unit
      create      test/unit/model_name_test.rb
      create      test/fixtures/model_names.yml

timestamp付きのモデルを確認。

%vim app/models/model_name.rb
class ModelName
  include Mongoid::Document
  include Mongoid::Timestamps
end

とりあえず今日はこれだけ。


ログを見てると"config/mongoid.ymlがないからrails generate mongoid:configしろ!"って書いてあるので後でしておく。


参考:Mongoid generate - 初学開発記録帖

Rails3でHaml使ってみた

rstat.usを触って初めてHamlを見たときに簡単に書けそうだなーと思って興味があった。
ちょっと最近Rails3の勉強もしているので、erbを使わずにHamlを使ってみようと思って勉強開始。


まず最初にどうやってRailsの中で使うのか分からないので(rstat.usはSinatra)調べると、日本Hamlの会があるらしいのでそこを参考に・・・

% haml --rails .
OptionParser::InvalidOption: invalid option: --rails
  Use --trace for backtrace.

ってRails3に対応してねえからGetting Startedの通りにできねえ!


次に調べて以下のサイトを参考にしてみた。
y_310's diary

% bundle install vendor/bundle
Fetching source index for http://rubygems.org/
(略)
% vim Gemfile
gem 'haml-rails'を追加して保存
% bundle install
(略)
Installing haml (3.1.2)
Using rdoc (3.9.1)
Using thor (0.14.6)
Using railties (3.0.9)
Installing haml-rails (0.3.4)
(略)

app/views/myapp/index.html.hamlHamlを記述

!!!
%html
  %head
    %title Hello, Haml!
  %body
    #header
      %h1 Hello, Haml!
    #content
      %p
        I use Haml
        %span.version= Haml::VERSION

サーバを起動

% rails server

これでlocalhost:3000/myapp/indexにアクセスすると無事にHTMLが表示されました。
Hamlすげーなー

リハビリ

Ruby会議に参加してやる気をもらったので最近リハビリがてらにProject Eulerを最初から挑戦し始めた。
今回はソースコードをgithubに載せていってる。


Mahito/project-euler · GitHub


英語が全く書けない困った社会人なのだが、なんちゃって英語でコメントも書いてみてる。
とりあえず1日1問を目標にして書いているが、最初はやっぱりプログラムを全然書かない生活になっていたので、頭にあることがコードにできなかった。
でも3日目ぐらいからようやく手と頭が一緒に動くようになってきた。


このまま頑張って続けていきたいと思う。