Coral Reefs

- ケアンズの海が好き -

お手軽簡単!30分でできるTwitterアプリ

f:id:coralreefs:20130511203029j:plain


こんにちは、@coralreefs1です。

今回はTwitterAPIを使って何か作りたい!という方にさっくりとベースの部分を作成する方法をご紹介します。


環境


Twitterにアプリを登録


まずは https://dev.twitter.com/ にて自分のTwitterアカウントを使ってサインイン! ログイン後、右上のアイコンの My applications をクリックします。


f:id:coralreefs:20130511144115p:plain


画面右側の Create a new application をクリック。


f:id:coralreefs:20130511144407p:plain


すると、アプリの詳細を入力する画面が出てきます。


f:id:coralreefs:20130511144751p:plain


Name はアプリ名、Descriptionは紹介文、Websiteは http://192.168.0.1:8080 として、Callback URL はとりあえず適当なURLでOkです。


登録後、以下の画面に表示される、Consumer key と Consumer secret の値を後ほど使います。この2つの値は外部の人に漏れてしまわないよう注意です!


f:id:coralreefs:20130511150403p:plain


TwitterにOAuth認証ログイン


下準備は整ったので、ユーザーがTwitterにログインできるようにしましょう。 まずはプロジェクトの作成。


 $ rails new TwitterTest


Gemfile には twitter と omniauth-twitter を追加します。


source 'https://rubygems.org'
ruby '2.0.0'

gem 'rails', '4.0.0.beta1'
gem 'sqlite3'

gem 'twitter'
gem 'omniauth-twitter'

group :assets do
  gem 'sass-rails',   '~> 4.0.0.beta1'
  gem 'coffee-rails', '~> 4.0.0.beta1'

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.0.1'


bundle を実行して。


$ bundle


Twitter にアプリを登録した際に表示された Consumer key と Consumer secret を、 以下の2つのファイルに設定します。


  • config/initializers/omniauth.rb
  • config/initializers/twitter.rb


# config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, "Consumer key", "Consumer secret"
end


# config/initializers/twitter.rb

Twitter.configure do |config|
  config.consumer_key = "Consumer key"
  config.consumer_secret = "Consumer secret"
end


Controller の作成。


$ rails g controller tweets


中身はとりあえずindexのみ追加しときます。

class TweetsController < ApplicationController                                             
  def index
  end
end


config/routes.rb にルーティングを追加。


TwitterTest::Application.routes.draw do
  root to: 'tweets#index'
  resources :tweets
end


トップページの app/views/tweets/index.html.erb を追加します。 中身はとっても簡単。


<h1>こんにちはこんにちは!</h1>
<a href="/auth/twitter">Twitter にサインインする</a>
<a href="/signout">サインアウト</a>


以上でTwitterにログインできるようになりました!


ログイン後のコールバック対応


ユーザーがTwitterにログインすると、/auth/twitter/callback のURLがコールバックされるので、こちらを作りましょう。


$ rails g controller sessions


SessionsController の create では、DBのUserテーブル(後ほど作成します)をチェックし、ユーザーが登録されていない場合、新規登録します。


class SessionsController < ApplicationController
  def create
    auth = request.env['omniauth.auth']

    user = User.find_by_provider_and_uid(auth['provider'], auth['uid'])
    user ||= User.create_with_omniauth(auth)

    session[:user_id] = user.id
    redirect_to root_url, notice: 'login'
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url, notice: 'logout'
  end
end


コールバックのルーティングを設定します。


TwitterTest::Application.routes.draw do
  root to: 'tweets#index'
  resources :tweets

  get "/auth/:provider/callback" => "sessions#create"
  get "/signout" => "sessions#destroy"
end


Userモデルを作成します。


$ rails g model user provider:string uid:string name:string screen_name:string token:string secret:string


DBをマイグレート。


$ rake db:migrate


app/models/user.rb ではTwitterのユーザー情報を保存します。 そして、client メソッドで、ユーザーのツイートやフォロワー等の情報にアクセスするための、クライアントを取得します。


class User < ActiveRecord::Base
  def self.create_with_omniauth auth
    create! do |user|
      user.provider    = auth["provider"]
      user.uid            = auth["uid"]
      user.name        = auth["info"]["name"]
      user.screen_name = auth["info"]["nickname"]
      user.token        = auth['credentials']['token']
      user.secret        = auth['credentials']['secret']
    end
  end

  def client
    Twitter::Client.new(oauth_token: token, oauth_token_secret: secret)
  end
end


最後にApplicationController にカレントユーザーを設定するメソッドを追加。


class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  before_filter :set_current_user

  private

  def set_current_user
    @current_user ||= User.find session[:user_id] if session[:user_id] 
  end
end


以上でコールバックの処理が完成です!


ツイートしたり一覧を表示したり


準備ばっちしOKです! あとはTwitterのリストを取得するもよし、ツイートするもよしです。


# ツイートする
@current_user.client.update 'test tweet'

# フォロワーを取得する
@current_user.client.followers

# タイムラインを取得する
@current_user.client.user_timeline


例外処理やテストなどは端折っちゃってますが、以上でTwitterにアクセスできるようになりました!

TwitterAPIはアクセス回数の制限があるので、テストでばしばしAPI叩いてると、すぐリミットに達しちゃうので注意です。

Ruby認定試験Goldに合格する3つのポイント!

f:id:coralreefs:20130509143118j:plain

 

はじめまして、@coralreefs1です。

 

みなさんRubyは好きですか?

 

まだRuby書いたことない方、一度書いてみてください。楽しいですよ!

 

そんなRubyの理解を深める意味もあって認定試験(Gold)を取りましたが、これからRubyを使う方はこれで勉強してから実務に入ると、APIを調べる回数も減りますし、スムーズに開発を進められると思うのでオススメです。

 

とはいえ受験料が高いので、試験で抑えときたいポイントをご紹介!

 

出題範囲の問題配分はどんな感じ?

 

僕が受けた時はだいたい以下のような感じでした。

 

実行環境

  • コマンドラインオプション
  • 組み込み変数/定数

 

  ここからは2、3問かな。試験直前に一覧を見直しておくと吉です。

 文法

  • 変数と定数
  • 演算子
  • ブロック
  • 例外処理
  • 大域脱出

 

  15問くらい。変数と定数はクラス、サブクラス、インスタンス、特異クラス、モジュールを複雑に絡めて出題されるので、クラスオブジェクトのインスタンス変数と、インスタンスオブジェクトのインスタンス変数の違いなど、確認しときましょう。

ブロックは変数の束縛とブロック内でreturnやbreakされた時の動作を抑えときましょう。

例外クラスの階層は覚えとかないとです。NoMethodErrorはNameErrorのサブクラスなので、以下のコードはNoMethodErrorを表示します。

begin
  "John".cooking
rescue NameError => e
  puts e.class  # NoMethodError を表示
end  

 

オブジェクト指向 

  • メソッドの詳細
  • メソッドの可視性
  • クラスの詳細
  • クラスの継承
  • モジュールの詳細

 

  試験の肝の部分です。25問くらい。他の試験項目と絡めて出題されるので、試験の半分以上に関係してると思います。super と super() は動作が異なります。initialize を定義しない場合は親クラスの initialize が自動で呼ばれます。注意しとくことはたくさんありますが、メソッドと定数の探索経路、スコープに関しては確実に抑えときましょう。

 

組み込みライブラリ

  • よく使用されるクラス(Object、Kernel、Module等)
  • よく使用されるモジュール(Enumerable、Comparable等)
  • 数値
  • 正規表現

 

 10問くらい。よく使われるクラスとモジュールはリファレンスに一度目を通しておきましょう。正規表現は基本的な使い方以外にも、 *? や +? などの最短マッチも出題されます。

 

標準添付ライブラリ

  • よく使用されるライブラリ(socket、rdoc等)

 

 3問くらい。全滅は痛いので、rdoc、yaml、stringio、date など、リファレンスで一通り目を通しときましょう。

 

あら?問題数の合計が50問以上ある?

ざっくり勘定ですごめんなさい。

 

抑えておきたい参考書

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

 

誤字がとっても多いですが、この本の模擬試験からも出題されたりするのでオススメ。

 

メタプログラミングRuby

メタプログラミングRuby

 

メタプログラミングとありますが、試験範囲のオブジェクト指向に該当する内容が多く、特にRubyをこれから書こうという人はこれでメソッド、定数の探索経路や特異クラス、スコープについて理解しておくといいです。

 

何はともあ irb

試験ではクラス、モジュール、インスタンスなどが複雑に組み合わされて出題されるので、単純に暗記して知識で解くよりも、自分でirb で似たような複雑な構成を書いて、細かく動作確認をしておくといいと思います。

 

 

おまけ

以下の2つのコード、include の位置を変えると表示される結果が異なります。

  • コード1
module M
  @@x = 100
end

class A
  @@x = 500
  include M
end

module M
  puts @@x  # 100 と表示される
end

class A
  puts @@x  # 500 と表示される
end
 
  • コード2

module M @@x = 100 end class A include M @@x = 500 end module M puts @@x # 500 と表示される end class A puts @@x # 500 と表示される end

 

ややこしいですね!