ホーム ブログ ページ 50

Ruby on RailsでfacebookのOAuth認証を実装する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

今回は、Ruby on RailsでfacebookのOAuth認証を実装する手順をご紹介したいと思います。

OAuth認証といえば何だか小難しい印象がありますが、RailsにおけるOAuth認証の実装は驚くほど簡単です。

今回は例として、facebookのOAuth認証を実装する手順を5つのステップに分けてご紹介します。

※以下の手順はfacebookアカウントを登録済みのものとします。

facebookの設定(facebookにアプリケーションを登録する)

STEP1:本人認証を行う

携帯電話のメールアドレス、または、クレジットカードにて本人認証を行います。

※以下、携帯電話のメールアドレスで認証を行う手順を記載します

(1) http://www.facebook.com/docs/guides/web#!/developers/createapp.php

(2) 「携帯認証」のリンクを押下(登録画面がポップアップで表示されます)

(3) 携帯電話のメールアドレスを入力する

(4) 携帯電話に届いた確認用コードを入力する

(5) 本人認証完了

※2011/03/02現在、完了メッセージと共に再び②の入力フォームが表示されますが、①のウィンドウに戻り、画面を更新すると次のステップへ進むことができます。

STEP2:アプリケーションを登録する

(1) アプリケーション名を入力し、利用規約に同意した上で「アプリケーションを作成」を押下します。

(2) 画像認証を行います。

(3) アプリケーションの情報を入力します。

(※WEB Site > Site URL に「http://localhost:3000/」を記載するだけでOKです)

(4) アプリケーション登録完了

※マイアプリ画面内に表示されている「アプリID」「アプリの秘訣(※facebook側の誤訳な気がしますが、以下これで通します)」がfacebookアプリケーション開発時に必要となります。

Railsアプリの作成

STEP3:必要なRails環境

<実行環境>

今回のサンプルは以下の環境で作成しました。必要なgemが入っていない場合はインストールしてください

ruby:1.8.7
rails:2.3.10(sudo gem install rails -v 2.3.10)
oauth:0.4.4(sudo gem install oauth -v 0.4.4)
facebook_oauth:0.2.2(sudo gem install facebook_oauth -v 0.2.2)

STEP4:Railsアプリの作成

(1) 新規Railsプロジェクトを作成します

rails facebook

(2) RAILS_ROOTに移動し、OAuth認証用のControllerを作成します

script/generate controller Users index callback

(3) 各ファイルを下記のとおりに編集します

app/controllers/users_controller.rb

class UsersController < ApplicationController

  CALLBACK_URL    = "http://localhost:3000/users/callback"
  CONSUMER_KEY    = "アプリID"
  CONSUMER_SECRET = "アプリの秘訣"

  def index
  end

  def oauth
    client = FacebookOAuth::Client.new(
      :application_id     => CONSUMER_KEY,
      :application_secret => CONSUMER_SECRET,
      :callback           => CALLBACK_URL
    )
    redirect_to client.authorize_url
  end

  def callback
    @client = FacebookOAuth::Client.new(
      :application_id     => CONSUMER_KEY,
      :application_secret => CONSUMER_SECRET,
      :callback           => CALLBACK_URL
    )
    @client.authorize(:code => params[:code])
  end
  
end

app/views/users/index.html.erb

<%= link_to 'OAuth認証', '/users/oauth' %>

app/views/users/callback.html.erb

<%= @client.me.info %>

STEP5:Railsアプリを動かす

(1) サーバーの起動

script/server

(2) ブラウザで「http://localhost:3000/users」にアクセス

(3) 「OAuth認証」リンクを押下

(4) 未認証の場合、facebookサイトにて認証画面が表示されるので、「許可」を押下します

(5) CALLBACK先(/users/callback)にリダイレクトされます

(6) 「/usrs/callback」ページにてユーザー情報が表示されれば認証成功です。

さいごに。

以上となりますが、いかがでしょうか。意外とハードルは高くないという印象を受けていただけたでしょうか。

ちなみに、TwitterのOAuth認証実装については当サイト内の記事『rubyでOAuthを使ってみる』が参考になります。

pg 0.9.0 の Windows版バイナリをMac OS XでCross compileする

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、たろちゃんです。先日同僚のWindows環境にpgが必要になったのですがWindows側でコンパイラがなかったのでMac OS Xで作成してみました。

今回はMacPortsの環境を使います。

まず、Windowsのソフトウェアをクロスコンパイルできるようにするためにmingw32の環境をMacPortsで取得します。

$ sudo port install i386-mingw32-gcc

次に必要なgemをインストールします。

$ sudo gem install rdoc
$ sudo gem install rake-compiler

次にクロスコンパイルされたrubyを構築します(調べた当時ではruby-1.8.6 p398がビルドされました)。

$ rake-compiler cross-ruby

次にpg-0.9.0のgemを取得して展開します。

$ gem fetch -v 0.9.0 pg
$ gem unpack pg-0.9.0.gem

最後にrake crossを使ってpgをビルドします。

$ cd pg-0.9.0
$ rake cross native gem POSTGRESQL_VERSION=8.4.6

あとはrake crossを実行したところのpkg以下にできる pg-0.9.0-x86-mingw32.gem をWindows環境で手動インストールします。

今回の注意点としては、クロスコンパイル環境として ruby 1.8.7 を利用したところクロスコンパイルができない状態があり、調べてみると細かいパッチレベルでできるできないがあったりするようです。現段階では1.8系でクロスコンパイルをするには1.8.6の方が安定しているのではないかという印象がありました。

【PHP】画像アップロードとリサイズの仕方(フォームの生成~リサイズ処理の方法)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

【PHP】画像アップロードとリサイズの仕方(フォームの生成~リサイズ処理の方法)

 フォーム生成からアップロードされた画像を保存する。

プロジェクト内で画像のアップロードからリサイズ処理を見ることがあったので、

勉強がてら処理内容を追ってみました。

  • 1.フォームの生成
  • 2.アップロードされたファイル情報取得
  • 3.画像の保存方法

1. フォームの生成

 <form action="アクション先" method="post" enctype="multipart/form-data">
   <input type="file" name="upload_file" />
   <input type="submit" value="アップロード" />
</form>

※ formタグのmethodをpostに、enctype=”multipart/form-data”を指定する必要があります。

2. アップロードされたファイル情報取得

アップロードされたファイルの情報は $_FILES に格納されます。

$_FILES は $_POST や $_GET と同様、PHPが自動的に値をセットしてくれる連想配列です。

また、アップロードしたファイルは一時的にサーバー側に保存され、PHPプログラムの実行が終了すると削除されるそうです。

$upload_file = $_FILES["upload_file"];
array(5) {
  ["name"]=>
  string(10) "Desert.jpg"
  ["type"]=>
  string(10) "image/jpeg"
  ["tmp_name"]=>
  string(14) "/tmp/phph8PFva"
  ["error"]=>
  int(0)
  ["size"]=>
  int(845941)
}
  • name →アップロードファイル名
  • type →MIMEタイプ
  • tmp_name →アップロードされたファイルが一時的に保存されたファイルパス
  • error →エラーコード(正常にアップロードされた場合、0になります)
  • size →アップロードされたファイルサイズ

となっています。

3. 画像の保存方法

アップロードされた画像は一時的に、tmp_name値で指定された箇所に保存されています。

move_uploaded_file()を用いて、別ディレクトリに移動させます。

move_uploaded_file( $upload_file["tmp_name"], ‘/img/upload/');

とここまでの手順で、アップロードされた画像を保存することが可能です。

4. 画像をリサイズするサンプルコード

下記の1.~6.までの手順をサンプルに落としてみました。

1.画像情報を取得する

2.画像をコピー

3.空画像を作成

4.コピー画像を指定サイズで作成

5.コピー画像を保存

6.画像データ破棄

$orig_file 元画像

$resize_weight リサイズ幅

$resize_height リサイズ高さ

function sample_resize($orig_file, $resize_weight, $resize_height)
{
	// GDライブラリがインストールされているか
	if (!extension_loaded('gd')) {
	    // エラー処理
	    return false;	
	}

	// 画像情報取得
	$result = getimagesize($orig_file);
	list($orig_width, $orig_height, $image_type) = $result;
	
	// 画像をコピー
	switch ($image_type) {
	    // 1 IMAGETYPE_GIF
	    // 2 IMAGETYPE_JPEG
	    // 3 IMAGETYPE_PNG
            case 1: $im = imagecreatefromgif($orig_file); break;
            case 2: $im = imagecreatefromjpeg($orig_file);  break;
            case 3: $im = imagecreatefrompng($orig_file); break;
            default: //エラー処理 
          return false;
        }	

	// コピー先となる空の画像作成
	$new_image = imagecreatetruecolor($resize_width, $resize_height);
        if (!$new_file) {
            // エラー処理 
	    // 不要な画像リソースを保持するメモリを解放する
            imagedestroy($im);
            return false;
        }

 	// GIF、PNGの場合、透過処理の対応を行う
	if [1]$image_type == 1) OR ($image_type==3 {
            imagealphablending($new_image, false);
            imagesavealpha($new_image, true);
            $transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127);
            imagefilledrectangle($new_image, 0, 0, $resize_width, $resize_height, $transparent);
        }

	// コピー画像を指定サイズで作成
 	if (!imagecopyresampled($new_image, $im, 0, 0, 0, 0, $resize_width, $resize_height, $orig_width, $orig_height)) {
            // エラー処理
	  // 不要な画像リソースを保持するメモリを解放する
            imagedestroy($im);
            imagedestroy($new_image);
            return false;
        }

        // コピー画像を保存
	// $new_image : 画像データ
	// $new_fname : 保存先と画像名
        // クオリティ

        switch ($image_type) {
	    // 1 IMAGETYPE_GIF
	    // 2 IMAGETYPE_JPEG
	    // 3 IMAGETYPE_PNG
            case 1: $result = imagegif($new_image, $new_fname, $quality); break;
            case 2: $result = imagejpeg($new_image, $new_fname, $quality); break;
            case 3: $result = imagepng($new_image, $new_fname, $quality); break;
            default: //エラー処理 
          return false;
        }

        if (!$result) {
            // エラー処理 
	    // 不要な画像リソースを保持するメモリを解放する
            imagedestroy($im);
            imagedestroy($new_image);
            return false;
        }

	// 不要になった画像データ削除
	imagedestroy($im);
        imagedestroy($new_image);

}

下記記事を書くにあたって参考にしたサイトになります、

透過処理についての解説

http://www.phppro.jp/qa/1269

References

References
1 $image_type == 1) OR ($image_type==3

checkinstallをつかってrpm化して楽になる

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

なにかをソースから自力でインストールするときに、パッケージ管理しておいたほうが

管理が楽ですので、checkinstallで楽にrpm化して楽しましょう

どういうことをするかというと、

makeまでしてinstallの代わりにcheckinstallしてrpm化して入れる感じです

まずはcheckinstallのインストール、依存してるソフトを入れます。

# yum install gettext rpm-build

次にcheckinstall本体を入れます。

# cd /usr/local/src
# wget http://asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-1.6.2.tar.gz
# tar zxf checkinstall-1.6.2.tar.gz
# cd checkinstall-1.6.2
# make
# make install

次にcheckinstall自体をrpm化します

# checkinstall 
# rpm -i /usr/src/redhat/RPMS/x86_64/checkinstall-1.6.2-1.x86_64.rpm
# rpm -qi checkinstall => OK^^v

インストールされてます。

これにて準備完了です。試しにRubyをインストールしてみます。

# cd /usr/local/src
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p302.tar.gz
# tar -xzf ruby-1.8.7-p302.tar.gz
# cd ruby-1.8.7-p302
# ./configure
# make
# checkinstall -R --fstrans=no  --provides="ruby"
# rpm -ivh /usr/src/redhat/RPMS/x86_64/ruby-1.8.7-p302-1.x86_64.rpm
# rpm -qi ruby => OK^^v

入りました。

ruby-opensslも同じステップでインストールしてみます。

# cd /usr/local/src/ruby-1.8.7-p302/ext/openssl
# ruby extconf.rb
# make
# checkinstall --exclude=/selinux -R
# rpm -ivh  /usr/src/redhat/RPMS/x86_64/openssl-20101102-1.x86_64.rpm
# rpm -qi openssl => OK^^v

入りました。

パッケージ管理されてるとホっとします

Solaris 10メモ

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

普段Mac OS XやLinuxを使っているとついついわすれてしまうSolarisのコマンド。自分たちでつけてたメモを書いてみる事にしました。

 パッケージの中身を知るには

# pkgchk -vn CSWvim
/opt/csw/bin/ex
/opt/csw/bin/rview
/opt/csw/bin/rvim
/opt/csw/bin/view
/opt/csw/bin/vim
/opt/csw/bin/vimdiff
/opt/csw/bin/vimtutor
/opt/csw/bin/xxd
/opt/csw/share/doc/vim
/opt/csw/share/doc/vim/license

 ファイルがどのパッケージか知るには

# pkgchk -lp /opt/csw/bin/glocate
Pathname: /opt/csw/bin/glocate
Type: regular file
Expected mode: 0755
Expected owner: root
Expected group: bin
Expected file size (bytes): 216836
Expected sum(1) of contents: 14151
Expected last modification: Jun 08 11:44:20 2009
Referenced by the following packages:
        CSWfindutils   
Current status: installed

 patchがどこまであたっているのか知りたい

# patchadd -p | grep パッチ番号

 sudoがないよ?

pfexecを使いましょう。

 共有ライブラリのパスを設定する

参考 http://solaris.roguelife.org/usr/ccs/bin/ld.xhtml

crleコマンドを使う。

# crle -c /var/ld/ld.config -l /lib:/usr/lib:/usr/local/lib:/opt/csw/lib

設定情報を確認するには

# crle

Configuration file [version 4]: /var/ld/ld.config  
  Default Library Path (ELF):   /usr/lib:/usr/local/lib:/opt/csw/lib:/opt/sfw/lib
  Trusted Directories (ELF):    /lib/secure:/usr/lib/secure  (system default)

Command line:
  crle -c /var/ld/ld.config -l /usr/lib:/usr/local/lib:/opt/csw/lib:/opt/sfw/lib

設定を更新(追記)するには

# crle -c /var/ld/ld.config -u -l /opt/sfw/lib
# crle

Configuration file [version 4]: /var/ld/ld.config  
  Default Library Path (ELF):   /usr/lib:/usr/local/lib:/opt/csw/lib
  Trusted Directories (ELF):    /lib/secure:/usr/lib/secure  (system default)

Command line:
  crle -c /var/ld/ld.config -l /usr/lib:/usr/local/lib:/opt/csw/lib:/opt/sfw/lib

:joinと:includeの区別について

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

:joinと:includeの区別について、いままであまり分からかなったので、実行してみて、メモします。


:joinと:includeの区別について、いままであまり分からかなったので、実行してみて、メモします。

(1):includeは最初に関連モデルを全て取得し、その後、キャッシュからロードされる

products,product_detailsテーブルがhas_oneの関係です。
現在、A,Bデータベースの上記2テーブルのデータを比較して、差分分をAからBへコピーする機能です。

set_db(a)
a_prodcut = Product.find(10)

set_db(b)
b_prodcut = Product.find(10)


※set_db(x)はDB指向を指定するメソッドの仮名です。

a_prodcut.product_detailのcommentカラムの内容を取得したい場合、
a_prodcut.product_detail.commentですと
「select * from product_details where product_id = 10」sqlが発行されています。
この場合、DBがbに指向されているので、取得したのはa_prodcutのproduct_detailではなく、
b_prodcutが紐付いているproduct_detailです。
joinでやって、同じく、sqlが発行されています。

includeでやってみます。
set_db(a)
a_prodcut = Product.find(:first,:conditions => [“products.id = 10”], :include => [:item_content])

set_db(b)
b_prodcut = Product.find(:first,:conditions => [“products.id = 10”], :include => [:item_content])


a_prodcut.product_detail.commentしたら正しい内容が取得できます。
:includeは、最初に関連モデルを全て取得しているため、a_prodcut.product_detailがキャッシュからロードされます。

(2):includeと:selectは併用できない
:includeは、最初に関連モデルを全て取得しているため、:selectの指定が無効となります。
:joinの場合、:selectが使えます。

追記:

巨大なテーブルの場合、:includeはすべてキャッシュにロードするので、パフォーマンスが落ちるかもしれないとの話もあったようです。
>:includeは、最初に関連モデルを全て取得しているため
結局、↑この特性を理解したうえで、状況に合わせて使えってことですね

2011-10月

久しぶりに追加します。:joinsは、関連モデルを検索条件に追加する場合に使うべし。includeを使うと、:includeは、最初に関連モデルを全て取得しているため、キャッシュからロードされるということで期待の結果がヒットできない可能性が十分あります。

json の憂鬱

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

現在ではxmlよりもyml よりも使われているであろう構造化文書の形式json。自分がド新人だったときに、「json? なんて不吉な名前の変数なんだ」と思ったのも遠い昔のことです。

json を始めとする構造化文書の便利さは、適切なライブラリを使えば 言語内の変数(hash, array 等)⇔一般的なテキスト、の変換が 容易に行えることにあります。

データを RDB に保存するとき、変数の構造が変化したとしても、 カラムを増やしたり join を行ったりせず、その項目での検索を ある程度あきらめるのであれば、容易かつ高速に、多様な形式の データを保存できます

class Samples < ActiveRecord::Migration
  def self.up
    create_table :samples do |t|
    t.string “name”
    t.text “description”
    t.text “parms_json” #ここに、詳しいデータを json 化して保存する
  end
  def self.down
    drop_table :samples
  end

で、ここの「params_json」の値ですが、上の値に関しては、 サーバサイド(Ruby on Rails)で生成した場合と クライアントサイド(Ajax)で生成した場合と、 同じ形式で保存されることが期待されるのですが、 こちら、ちょっと困った「クセ」がそれぞれありました。 そのクセの内容と、対策を共有します。

0) まずはスタート

下記のような変数を(ruby の記法)

hash = {
    :a => “b”, :c => [ [“あ”, “い”, “う”], [“え”, “お”, “か”] ]
}

を、

{ “a”:”b”, “c”:[ [“あ”,”い”,”う”], [“え”,”お”,”か”] ] }



という json にしたい。

1) Ruby on Rails の場合

何も考えずに hash.to_json した場合、

>> hash.to_json => “{\”a\”:\”b\”,\”c\”:[[\”\\u3042\”,\”\\u3044\”,\”\\u3046\”],[\”\\u3048\”,\”\\u304a\”,\”\\u304b\”]]}”

のように、 unicode_escape されて出力されます。 こちら、escape されて欲しくない場合、下記のような関数を作成し 出力を得ます。

    def json_unescape(str)
      str.gsub(/\\([\\\/]|u[0-9a-fA-F]{4})/) do
        ustr = $1
        if ustr.starts_with?(‘u’)
          [ustr[1..-1].to_i(16)].pack(“U”)
        elsif ustr == ‘\\’
          ‘\\\\’
        else
          ustr
        end
      end
    end

出力は

>> json_unescape(hash.to_json) => “{\”a\”:\”b\”,\”c\”:[[\”あ\”,\”い\”,\”う\”],[\”え\”,\”お\”,\”か\”]]}”

2) jquery-json の場合

jquery および jquery-json を読み込んだ環境下にて、

alert(jQuery.toJSON({a:”b”, c:[[“あ”, “い”, “う”], [“え”, “お”, “か”]]}));

を実行したら、

{“a”:”b”,”c”:”[[\”あ\”, \”い\”, \”う\”], [\”え\”, \”お\”, \”か\”]]”}

のように、配列が内部でエスケープされた状態で出力されます。 上記のエスケープを解除したい場合、下記のような処理になります。

function no_escape_to_json(obj) {
  return jQuery.toJSON(obj).replace(/\\\”/g, “\””).replace(/\”\[/g, “\[“).replace(/\]\”/g, “\]”);
}

1), 2) の処理とも、アドホックな対応のため、あまり推奨されないやり方になります。が、もしお困りの方がいればご参考いただきたいな、と。 また、もっと根本的なスマートなやり方がある場合、お教えいただけますと幸いです。

PHPのソースインストール

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

CentOSにPHP5.2系を入れる為に、utterramblingsリポジトリを使用してyumで楽にインストールしてましたが、ある時から不安定でインストール出来ないという状況が何度か続いた為、最近はソースインストールするようにしています。そのメモです。
私の要件はyumの場合と同じものを使えるようにする事。
ちなみに以前はこんな感じで色々入れてました。
# yum –enablerepo=utterramblings -y install php php-gd php-ldap php-mbstring php-pear php-mcrypt php-xml php-devel php-apc php-soap php-mysql
# pecl install fileinfo
※後は/etc/php.ini、/etc/php.d/apc.ini, fileinfo.iniの設定で完了。

●PHPのインストール

XAMPPに入っているPHP5.2系の最後が1.7.1のPHP5.2.9なので、個人的にはこのバージョンを使用しています。
# wget http://museum.php.net/php5/php-5.2.9.tar.gz
# tar zxvf php-5.2.9.tar.gz
# cd php-5.2.9
# ./configure –with-apxs2 –with-bz2 –enable-calendar –with-curl –enable-exif –enable-ftp –with-gd –with-gettext –with-gmp –with-ldap –enable-mbstring –with-mcrypt –with-mysql –with-mysqli –with-openssl –with-pdo-mysql –with-pspell –enable-shmop –enable-soap –enable-sockets –enable-sysvmsg –enable-wddx –enable-xml –with-xsl –with-zlib –with-config-file-path=/etc –with-config-file-scan-dir=/etc/php.d
後はひたすら、エラーメッセージを見て必要なものをインストール⇔configureを繰り返します。

configure: error: no acceptable cc found in $PATH
# yum -y install gcc
./configure: line 6699: apxs: command not found
# yum -y install httpd-devel
configure: error: xml2-config not found. Please check your libxml2 installation.
# yum -y install libxml2-devel
configure: error: Cannot find OpenSSL’s
# yum -y install openssl-devel
configure: error: Please reinstall the libcurl distribution –
easy.h should be in /include/curl/
# yum -y install curl-devel
configure: error: libpng.(a|so) not found.
# yum -y install gd-devel
configure: error: Unable to locate gmp.h
# yum -y install gmp-devel
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
# yum -y install libmcrypt-devel
Note that the MySQL client library is not bundled anymore!
# yum -y install mysql-devel
configure: error: Cannot find pspell
# yum -y install pspell-devel
configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution
# yum -y install libxslt-devel
Thank you for using PHP.これでconfigureが完了。

# make
# make install
# cp -a php.ini-recommended /etc/php.ini
# mkdir /etc/php.d

●apcのインストール

# pecl install apc
エラーメッセージを見て必要なものをインストール、もう一度実行。
Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF
environment variable is set correctly and then rerun this script.
ERROR: `phpize’ failed
# yum -y install autoconf
# pecl install apc

●PHPの設定変更

# vi /etc/httpd/conf.d/php.conf

LoadModule php5_module modules/libphp5.so

LoadModule php5_module modules/libphp5-zts.so

AddHandler php5-script .php
AddType text/html .php

DirectoryIndex index.php

php_value date.timezone Asia/Tokyo
SetEnv TZ Asia/Tokyo

デフォルトではモジュールのパスが違うので変更しておく。
# vi /etc/php.ini
extension_dir = “./”↓変更
extension_dir = “/usr/lib/php/modules”
# mkdir /usr/lib/php
# ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20060613 /usr/lib/php/modules
後はそれぞれのモジュールが読み込まれるように設定する。
# vi /etc/php.d/apc.ini
extension=apc.so
# vi fileinfo.ini
extension=fileinfo.so

●Apacheの再起動

# apachectl configtest
Syntax OK
# /etc/rc.d/init.d/httpd restart

cakephpで管理機能を実装する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

今回は、cakephpで開発すると意外と悩む、管理ユーザによる管理機能を実装する際の認証ロジックに関するソリューションを紹介します。

こんにちは。エンジニアのサンドリバー砂川です。

2010年も早いもので後3日。弊社も本日29日で、今年の最終営業日となります。

はじめに

はじめに、この記事は以下のような仕様のサイトを作ることを想定しています。サイトの一般会員(users)と、管理ユーザ(admin_users)の独立した二種類のアカウントを使用する一般的な認証機能を持つ(マイページ等)マスタデータ等を管理する管理画面を持ち、管理ユーザでログインしなければ閲覧出来ないものとする

一般的な認証機能 AuthComponent

cakephpには標準の認証機能として、AuthComponentというコンポーネントが存在します。

AuthComponentで普通の認証処理を実装するとこんな感じになります。
app/app_controller.php


class AppController extends Controller {
  var $components = array('Auth');
  var $uses = array('User');
  var $helpers = array('html', 'Form');

  function beforeFilter() {
    parent::beforeFilter();
    $this->layout = 'base';
    $this->setAuth();
  }

  function setAuth() {
    # 実際には、AuthComponentの初期値はusersテーブルを使用するので設定は不要。
    $this->Auth->userModel = 'User'; # 認証に使用するアカウントテーブルとしてusersテーブルを使用
    $this->Auth->fields['username'] = 'username'; # IDとしてusernameカラムを使用
    $this->Auth->loginRedirect = '/mypage'; # ログイン成功時にリダイレクトするurl
  }
}

app_controllerでAuthComponentを設定すると、全てのcontroller処理の前に認証チェックが行われ、beforeFilterに$this->Auth->allow(‘アクション名’);と設定しない限り、ログインしていない場合は/users/loginにリダイレクトされるようになります。

AuthComponentでは、デフォルトではusersテーブルをアカウントテーブルとして使用しますが、適宜指定することも可能です。今回の実装では、一般機能ではusers、管理機能ではadmin_usersを使用するように切り替えることで実装します

管理画面実装

さて、管理画面の実装ですが、cakephpには管理機能を実装する手段としてroutingプレフィックス機能が用意されています。簡単に説明すると通常、cakephpのroutingロジックは以下。


controller = books, action = admin_add
↓
/books/admin_add

しかし、routingプレフィックスにadminを指定すると一部urlが変化します。


controller = books, action = admin_add
↓
/books/admin/add

正直この機能は使い辛く、特に一般ユーザと管理ユーザで独立した認証処理を行いたい今回のケースでは使い物になりません。なのでcontrollerごと分離する方式で実装します。

まず、controllerの共通処理を記述するapp_controller.phpを継承、一般サイト領域の共通処理を記述するbase_controller.phpと、管理機能領域の共通処理を記述するadmin_controller.phpを作成します。
app/app_controller.php


class AppController extends Controller {
  var $components = array('Auth');
  var $uses = array('User');
  var $helpers = array('html', 'Form');

  # 全体共通処理のみ記述
  function beforeFilter() {
    parent::beforeFilter();
    $this->layout = 'base';
  }
}

app/controller/base_controller.php


class BaseController extends AppController {
  var $extra_components = array();
  var $extra_uses = array();
  var $extra_helpers = array();

  function __construct() {
    parent::__construct();
    $this->merge_extra();
  }

  function beforeFilter() {
    parent::beforeFilter();
    $this->layout = 'base';
    $this->setAdminAuth();
  }

  # 一般領域用にusersテーブルをアカウントテーブルとして使用するよう設定
  function setAuth() {
    $this->Auth->userModel = 'User';
    $this->Auth->fields['username'] = 'username';
    $this->Auth->loginRedirect = '/mypage';
  }

  function merge_extra() {
    $this->components = array_merge($this->components, $this->extra_components);
    $this->uses = array_merge($this->uses, $this->extra_uses);
    $this->helpers = array_merge($this->helpers, $this->extra_helpers);
  }
}

app/controller/admin_controller.php


class AdminController extends AppController {
  var $extra_components = array();
  var $extra_uses = array();
  var $extra_helpers = array();

  function __construct() {
    parent::__construct();
    $this->merge_extra();
  }

  function beforeFilter() {
    parent::beforeFilter();
    $this->layout = 'admin_base';
    $this->setAdminAuth();
  }

  # 管理画面領域用に、admin_usersをアカウントテーブルに使用するよう設定
  function setAdminAuth() {
    $this->Auth->userModel = 'AdminUser';
    $this->Auth->fields['username'] = 'mail_address';
    $this->Auth->loginRedirect = '/admin_top';
  }

  function merge_extra() {
    $this->components = array_merge($this->components, $this->extra_components);
    $this->uses = array_merge($this->uses, $this->extra_uses);
    $this->helpers = array_merge($this->helpers, $this->extra_helpers);
  }
}

一般ユーザが使用するcontrollerはbase_controllerを、管理ユーザが使用するcontrollerはadmin_controllerをそれぞれ継承して使用します。

また、一般機能領域の共通処理はbase_controller、管理機能領域の共通処理はadmin_controller、全てのcontrollerの共通処理はapp_controllerに、それぞれ記述することにします。
例:一般controller


App::import('Controller', 'Base');
class MypageController extends BaseController {
  var $Name = 'Mypage';
  var $extra_uses = array('Book');
  var $extra_components  = array('RequestHandler');
  var $extra_helpers = array('bk');

  function index() {
  }
}

例:管理controller


App::import('Controller', 'Admin');
class BookController extends AdminController {
  var $Name = 'Books';
  var $extra_uses = array('Book');
  var $extra_components  = array('RequestHandler');
  var $extra_helpers = array('bk');

  function index() {
  }
}

こうすることで一般機能領域では一般ユーザ、管理機能領域では管理ユーザでの認証を適用することができます。

注意点

この方式の注意点として、通常$usesや$componentsのような各controllerで追加している設定は、代わりに$extra_usesのように追加しなければならない点が挙げられます。これはcakephp内部実装上の理由で以下のような問題が発生するためです。


App
$uses = array('A);
↓
Appを継承したAppFoo
$uses = array('B');
↓
最終的な$uses
$uses = array('A', 'B'); # $usesや$componentsはマージされて適用される

App
$uses = array('A);
↓
Appを継承したBase
$uses = array('B');
↓
Baseを継承したBaseBar
$uses = array('C');
↓
最終的な$uses
$uses = array('B', 'C); # Appで指定したAがマージされない。

この問題に対しては、$extra_usesで指定した配列を一旦マージした後、$usesに設定することで対処しています。


App
$uses = array('A);
↓
Appを継承したBase
$uses = array('B');
↓
Baseを継承したBaseBar
$extra_uses = array('C');
↓
Baseの$usesとBaseBarの$extra_usesをマージ
$uses = array('B', 'C');
↓
最終的な$uses
$uses = array('A', 'B', 'C);

以上です。全ての問題点を綺麗に解決出来ているわけではありませんが、管理機能を実装する際に参考になる点もあるかと思います。

jQueryを使った外部のhtmlの読み込みTips

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

jQueryを使ってヘッダ、フッタなど共通部分のhtmlを本体のページに読み込むカンタンTipsです

共通で使いたいhtmlと、読み込む側のhtmlを用意する。

読み込みたい共通部分にはheadタグとかbodyタグとかは不要です。
ほんとに部分的に抜き出したhtmlだけを用意します。

例えばヘッダ、フッタを共通にする場合は3つのファイルができることになります。

index.html 本体
header.html ヘッダー
footer.html フッター

jQueryを使うので、htmlの文字コードはUTF-8にしておきます。

jQueryをダウンロードする

http://jquery.com/

特に理由がなければ「Production」を使用します。

htmlでjQueryを呼び出し、共通htmlを読み込む

まずjQueryを呼び出します。ふつーに。

<script type=”text/javascript” src=”./javascripts/jquery-1.4.3.min.js”></script>

 次に、共通htmlを組み込みたい部分にidをもった空divを挿入します。

<div id=”header”></div>

こんなカンジ。

headタグ内で、idと読み込むhtmlファイルとを紐づけます。

<script type=”text/javascript”>
  $(function(){
    $(“#header”).load(“./header.html”);
    $(“#footer”).load(“./footer.html”);
  })
</script>

これでOK。

完成したhtmlはこんなカンジ

<html>
<head>

<script type=”text/javascript” src=”./javascripts/jquery-1.4.3.min.js”></script>

 <script type=”text/javascript”>
  $(function(){
    $(“#header”).load(“./header.html”);
    $(“#footer”).load(“./footer.html”);
  })
</script>

</head>

<body>
<div id=”header”></div>
<div>


</div>

<div id=”footer”></div>
</body>

</html>

ちょっとした注意点

共通htmlを読み込んだとき、階層構造は当然読み込む側のhtmlに準じることになります。
imgタグやaタグでURLを相対パス指定にすると、
階層がズレた場合デッドリンクになってしまいます。
パスはすべて絶対パスで記述するか、
相対パスを使用するならデッドリンクにならないよう階層構造に注意が必要です。

Androidアプリをリリースしました。「Live Search Twitter」

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Android2.1 SDK から追加された機能LiveWallpaperを利用したアプリ

Live Search Twitter をリリースしました。

 Live Search Twitter

この度、Androidマーケットに無料アプリを投稿しました。

このアプリは携帯端末の壁紙にTwitterの発言を表示します。

Tweetの内容は事前に登録したハッシュタグをランダムで検索を行います。

設定画面で検索するハッシュタグを追加することができます。

ぜひ使ってみてください。

http://jp.androlib.com/android.application.com-kbmj-live-qEEmz.aspx

Railsプログラマが知っておくべき97のこと

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、SHIMADAです。

最近、オライリー社の新刊「プログラマが知るべき97のこと」がTwitterで話題に上っているようですね。

ここでは、Railsプログラマが知るべきことを挙げてみました。

残念ながら97も思いつかなかったので、25個です。看板に偽りありですね。ごめんなさい!

 コントローラ

  • 行数よりもインデントの深さに気をつける
  • if-then-elseをネストしたくなったらロジックが間違っている
  • アクションでないメソッドはprotected/privateにする
  • 行数を減らす目的でbeforeフィルタを書かない
  • グローバル変数、インスタンス変数にアクセスするポイントを集中させる
  • グローバル変数(paramsとか)に代入しない
  • ダイナミックファイダを使えないfindをみつけたらモデルのメソッド/named_scopeにする

 ビュー

  • eachとif以外のロジックを書かない
  • 複雑になるところはヘルパにまとめる
  • 分からないことはモデルに聞く
  • 分割するためだけにパーシャルしない
  • 代入とか副作用の起こることをしない
  • eachの中でSQLが走らないかチェックする

 モデル

  • DBのテーブルを持たないクラスはAR::Baseを継承しない(笑
  • テーブルを持たないクラスのうち、多態を使う一連のグループはサブディレクトリを作ってモジュールにまとめる
  • モジュールとディレクトリ名の命名規約はRailsに合わせる
  • モデルが大きくなってきたら機能群をモジュールに切り出してincludeする
  • 共有しないモジュールはクラス名::モジュール名にしてクラスと同じ名前のディレクトリに入れる
  • モジュール名は-ableを気取ってみる
  • モジュールに切り出すときはクラス内にモジュールを作ってテストが通るように
  • 定数はselectable_attrを使う
  • 理由を説明できないfind_by_sqlは使わない
  • conditionsをnamed_scopeにできないか検討する

 その他一般論

  • 引数に代入とかしない
  • あるメソッドの中で同じオブジェクトへのメソッド呼び出しが多い場合、メソッド自体を相手に移すことを検討する

 さいごに

いかがでしょうか。

皆さんもそれぞれ「自分はこうすべきだと思う」「これは知っておくべき」という経験則を持っているかと思います。

こういうものを集めて洗練していくと「ベストプラクティス」と呼ばれるものができあがります。

また、これらを体系的に

  • 名前
  • 背景となる状況
  • 課題点
  • 解決策

としてまとめていくと、パタンランゲージができあがります。

みんなで知恵を出しあって、いきいきとしたシステム開発を進めて行きましょう。

……おっと、さっそくCuriさんからビューについてひとことあるようです。

  • 「SEOやEFOのことは頭に入れておけ」

「エントリーフォーム最適化」なんて言葉があるんですね。勉強になりました!

MacにEclipseをインストールする。

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

以外と誰も書いていなかったので、MacにEclipseをインストールする手順を説明します。まずは環境から。

環境

OS : Mac OS X 10.6.5

Eclipseのダウンロード

ここからEclipseをダウンロードしてきます。
種類は使う言語などに合わせてお好みで選び、Mac OS X 32 Bit or Mac OS X 64 Bitのリンクを押下。適当にミラーページを選びダウンロードする。ちなみに、2010年12月現在のEclipse最新阪は、 Helios (3.6)です。

Eclipseのインストール

ダウンロードしてきたEclipseを解凍。解凍して出来たeclipseディレクトリをアプリケーション配下などお好みの場所へ。これでおしまい。

Eclipseの日本語化

解凍した[eclipseディレクトリ]内にある[Eclipse.app]を押下でEclipseが起動しますが、このままだと英語のままです。読めません。というわけで、日本語化します。
方法は色々ありますが今回は、Pleiades というプラグインを使います。
まずは、ここより Pleiades をダウンロード。 Eclipseはすでに、ダウンロードしてあるので、[Pleiades 本体ダウンロード]の項目より、「安定版 1.3.2」をダウンロード。
その後解凍し、できた[pleiadesディレクトリ]内の[plugins]および、[features]の中身を先ほどインストールした、[eclipseディレクトリ]内の、[plugins]、[features]ディレクトリにコピーしてあげます。

コピー後、[eclipseディレクトリ]内の[Eclipse.app]を右クリック、「パッケージの内容を表示」を押下。
Contents → MacOS 内にある、[eclipse.ini] をテキストエディタで開き、最後に下記1文を追加します。
-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
設定後、Eclipseを起動させるのですが、普通に起動しても、古いプラグイン情報が使われてしますため、clean 起動で起動します。

ターミナルを開き、下記コマンドを実行。/Applications/eclipse/eclipse -clean
これで、日本語化されたEclipseが使えます。

おまけ

いれるとちょっと便利なEclipseのプラグインを紹介します。
プロパティエディタ
htmlエディタ
基本的に[plugins]、[features]ディレクトリに内容をコピーすれば使用できます。

Slony-Iでのフェイルオーバー手順

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Slony-Iで同期をとっている環境での、マスタDBとスレーブDBのフェイルオーバー手順です。

フェイルオーバー前

 マスタDB:db1

 スレーブDB:db2

postgres@db1$ postgres stop
 →障害発生の想定
postgres@db1$ slon_kill
 →db1,db2それぞれでSlonyデーモンを起動している場合なので注意
postgres@db2$ slonik_failover 1 2 | slonik
 →これでdb2がマスタになり更新の操作が行えるようになる。
  フェイルオーバーはマスタが死んでても可能
 →アプリの参照DBを元スレーブのdb2に変更
postgres@db1,2$ vi /usr/local/etc/slon_tools.conf
 ----------
 $MASTERNODE = 2; <==1を2に変えておく
 ----------
postgres@db1$ postgres start
 →障害復旧の想定

db1 をdb2からスキーマダンプなどしてDB作成(createlang忘れずに)

postgres@db2$ slonik_drop_node 1 | slonik
postgres@db2$ slonik_store_node 1 | slonik
postgres@db2$ slonik_subscribe_set set1 1 | slonik
postgres@db1$ slon_start
 →同期開始。冗長性回復

EclipseでGitを使用してバージョン管理を行う

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

EclipseでGitを使用することができるEGitの導入について説明します。なお、EclipseはEclipse Helios (3.6)を使用しており言語ファイルにて日本語化をしています。

ヘルプ>新規ソフトウェアのインストール>Heliosリポジトリ > egit
上記でEclipse Gitというプラグインがみつかるはずです(現在ver0.9.1)

チェックボックスにチェックをいれたらインストールしてEclipseをリスタートします。

ウィンドウ>ビューの表示>その他 > Git > GitRepositories
を選択するとGItリポジトリのウィンドウが下方に表示されます。

中には何も表示されていませんが右クリックでリポジトリの設定を追加することができます。
ここでGitのリポジトリを指定してプロジェクトをインポートすれば完了です。

Egitでの作業はプロジェクトを右クリックしたときにでる「チーム」という項目から各種操作をすることができます。

SQL Mk-2(a5m2)を使用したExcel形式のDB定義書作成方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

SQL Mk-2(a5m2)を使用したExcel形式のDB定義書作成方法

 今回はフリーソフトSQL Mk-2を用いたDB定義書の作成方法を紹介します。

DB定義書を作成するツールはいろいろあるのですが、Excel形式となるとなかなか見つからない…

少しとっつきにくいツールですが、準備さえ終われば便利ですので、機会があれば是非活用ください。

1. SQL Mk-2のインストール

2. MySQL ODBCのインストール

3. DSNの作成

4. SQL Mk-2からデータベースへの接続

5. DB定義書作成

 [1]SQL Mk-2のインストール。

http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/

 [2]MySQL ODBCのインストール。

http://dev.mysql.com/downloads/connector/odbc/

 [3]MySQLサーバーへ接続するためのDSNの作成手順。

1. [スタート]メニューをクリックし、[コントロールパネル]をクリックする。

2. [コントロールパネル]が開いたら[管理ツール]をダブルクリックする。

3. [管理ツール]の中にある[データソース(ODBC)]をダブルクリックする。

4. [ODMCデータソースアドミニストレーター]の[システムDXN]を選択し、追加ボタンを押下します。

5. 先ほど、インストールしたMysql ODMC 5.1Driverが表示されているので、それを選択します。

以下の項目を入力して、Testボタンを押下します。

Data Source Name:データソース名

Server     :接続するサーバー名

User      :接続する際のMySQLユーザー名

Database    :接続するMySQLデータベース

接続に成功するとConnection successful!が表示され、設定完了となります。

 [4]SQL Mk-2からデータベースへの接続。

1. [データベースの追加と削除]をクリック

ODMCシステムデータソースを列挙するの項目にチェックをいれ、

上記で作成したODMCシステムデータソースを指定します。

2. データリンクプロパティで、プロバイダーのタブで。

Microsoft OLE DB Provider for ODBC Driversを選択します。

接続のタブで、データソース名を指定

サーバにログインする、ユーザ名、パスワードを入力します。

ようやくSQL Mk-2からデータベースに接続する準備ができました。

 [5]DB定義書の作成

SQL Mk-2の横に、データベース情報がツリー構造で表示されています。

データベース名にカーソルをあわせ、右クリックからテーブル定義書作成の項目を選択します。

後は、DB定義書にするテーブルを選択するだけで、下記のExcelファイルを出力します。

ActionScript3でprototypeを拡張したときにはまったこと

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

最近Flexの開発が本職になってきたので、ActionScriptを勉強しています。

今回は始めてprototypeを拡張した時に、はまったところを紹介します。

 setPropertyIsEnumerableについて

prototypeを拡張して関数を追加した時、単に追加しただけだとfor ~ in で要素を列挙する際に、追加した関数も列挙されています。これを防ぐにはsetPropertyIsEnumerableを呼んで、追加した関数を列挙しないようにしなくては行けません。

たとえば、以下のソースは実際のプロジェクトではまった部分ですが、

Array.prototype.find = function(property:String,value:Object):Object{
        return this.filter(function(element:*,index:int,arr:Array):Boolean{
                            return element[property] == value;
                           });
      };
Array.prototype.setPropertyIsEnumerable("find", false);

最後の行のsetPropertyIsEnumerableが重要です。これがないと配列をfor ~ inでまわしたときに”find”という身に覚えのない要素が追加されてしまいます。

 非Dynamicなオブジェクトでの拡張

上記ソースのようにDynamicなArrayを拡張した場合、arr.find(“age”,20)のようにObj.func()という形で拡張した関数を呼び出すことができます。しかし、以下の用にDynamicではないStringを拡張したときにstr.camelize()を呼ぼうとするとコンパイル時にエラーになってしまいました。

 String.prototype.camelize = function():String{
        var tmp:String = "";
        for each (var element:String in this.split('_')){
          tmp += element.charAt(0).toUpperCase() + element.substr(1);
        }
        return tmp;
      };

コンパイルエラーを防ぐには、かっこわるいですが、str[‘camelize’]()の様に呼び出せば良いようです。本当はStringをDynamicにしないといけないのかもしれませんが、低レベルのクラスをいじるのは気が引けるのでこの方法を使っています。

さて、以上2点、私のように見切り発車でコーディングをしてしまうとはまってしまうこともあると思い紹介してみました。なにかのご参考になればうれしいです。

Ruby on Rails Redmine Install

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

rick No20です。
今回はredmoneのinstallについて書きます。
remineとは?
タスク管理ツールです。
SubVersionとかも管理できるんですが、今回はredmineのinstallです。

環境

ruby 1.8.6
rails 1.2.5
sqlite 3.5.3
CentOS 5.2
redmine 0.6.4
download場所 /usr/local/src
ソース場所 /var/

Redmine Install

$wget http://rubyforge.org/frs/download.php/33789/redmine-0.6.4.tar.gz
// redmine 7.0以降はrails2系でないとダメらしいです。
$ tar xvf http://rubyforge.org/frs/download.php/33789/redmine-0.6.4.tar.gz
$ cp -a redmine-0.6.4 /var/

Redmine 設定

$ cd /var/redmine-0.6.4
$ cp config/database.yml.sample config/database.yml
$ vi config/database.yml
production:
adapter: sqlite3
dbfile: redmine.db
timeout: 5000

gem sqlite3-ruby install

$ gem intall sqlte3-ruby
$ rake db:migrate RAILS_ENV=production
$ rake redmine:load_default_data RAILS_ENV=production
Select language: bg, cs, de, en, es, fr, he, it, ja, ko, nl, pl, pt, pt-br, ro, ru, sr, sv, zh, zh-tw [en] ja ←jaを入力してenter

Rdmine 起動

monbrelを使用して起動します。
$ vi config/mongrel_cluster.yml
port: “3000”
environment: production
log_file: /var/redmine-0.6.4/log/mongrel.mongrel.log
public_file: /var/redmine-0.6.4/public
servers: 1
$ mongrel_rails cluster::startこれでlocalhost:3000でアクセス可能です。

RailsでOAuth Providerを作る

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

先日、お客様から「OAuthに対応できますか?」という質問を受けました。

正直「OAuthって何?」 という感じだったので、ちょっと調べてみました。

☆OAuthとは・・・

→認可情報の委譲のための仕様
 -予め信頼関係を構築したサービス間で
 -ユーザの同意のもとに
 -セキュアにユーザの権限を受け渡しする

とあります。

なんかOAuthには3つの要素が存在するようです。

  -OAuth Service Provider(ユーザの認可情報を第3者に渡す)
  -OAuth Consumer(ユーザの認可情報を受け取り、ユーザに代わっていろんな情報へのアクセス、追加・削除を行う)
  -User(ProviderがConsumerに認可情報を渡すことを許可したり、認可情報を無効化する)

mixiの「友人を探す」の「アドレス帳から探す」でOAuthを使っているそうなので、それに当てはめると・・・

 ↓

ユーザ(User)の許可のもと、mixi側(OAuth Consumer)にGoogle(OAuth Service Provider)のGmailのアドレス帳へのアクセス権限を与えて、mixi内にマイミクに追加するためのアドレス帳のインポートが出来る

 ・mixiにGmailのアカウントやパスワードを渡す必要がありません
・ユーザはGmail内において、mixiを認証済みのウェブサイトから外すことで、mixiへの認可情報の受け渡しを無効化出来ます

なんとなく安全なのかなぁ~程度。。。

☆OAuth Providerの実装

お客様の話を聞いていると、どうもサイト内の友達情報とかをConsumerとなるゲーム側に受け渡すためにOAuthを使い、サイト=Providerという形にしたいっぽかったので、そもそもRailsのアプリにOAuthのProviderを取りこめるのか調べてみると・・・

 Railsにruby-oauth gemと、OAuth Pluginというのがあって、それを使えば簡単にProvider側を実装できるらしいです。。。

◆ruby-oauth gemのインストール

gem install oauth

◆アプリにpluginをインストール(Railsアプリ配下で)

./script/plugin install git://github.com/pelle/oauth-plugin.git

◆Controller、Modelの作成

 ./script/generate oauth_provider

 これにより、以下のファイルが出来ます

 app/controllers/oauth_controller.rb
 app/models/oautht_token.rb
 app/models/access_token.rb
 app/models/request_token.rb
 app/models/client_application.rb
 app/models/oauth_nonce.rb

◆routesとassociationを設定

 map.oauth ‘/oauth’,:controller=>’oauth’,:action=>’index’
 map.authorize ‘/oauth/authorize’,:controller=>’oauth’,:action=>’authorize’
 map.request_token ‘/oauth/request_token’,:controller=>’oauth’,:action=>’request_token’
 map.access_token ‘/oauth/access_token’,:controller=>’oauth’,:action=>’access_token’
 map.test_request ‘/oauth/test_request’,:controller=>’oauth’,:action=>’test_request’

—-

 has_many :client_applications
 has_many :tokens, :class_name=>”OauthToken”,:order=>”authorized_at desc”,:include=>[:client_application]

—-

rake db:migrate

これにより、OAuth Service Providerの最低限の機能は揃うそうです。

また、下記のbefore_filterが使えるとのこと

・before_filter :login_or_oauth_required
・before_filter :oauth_required

でも、このプラグイン(Provider)を使うためには、よくよく調べてみるといろいろな条件があるようです。

・login_requiredを使っている

・rails2.0を使っている(←これが結構大きい・・・)

・OAuth Consumerの管理において、Consumerの削除・編集の機能実装が必要(え?結構重要じゃん)

既存のサイトに導入するのは結構難しそうですが、趣味とかで組んでみるのには面白そうですね☆

Passengerのステータス確認ツールの紹介(その1)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

 今回は、Passengerに標準でインストールされるステータス確認ツールの紹介をしたいと思います。

 Passengeerのステータス確認ツールは2種類あります。今回はその1つについて説明したいと思います。

passenger-status

 passengerのプロセスの情報が見れます。passenger-statusで実行できます。出力は以下のようになります。

----------- General information -----------
   max      = 6   count    = 5   active   = 0   inactive = 5    
----------- Domains -----------
   /var/rails/hoge:
     PID: 4599    Sessions: 0    Processed: 13      Uptime: 1m 35s
     PID: 4594    Sessions: 0    Processed: 7       Uptime: 1m 36s
     PID: 4592    Sessions: 0    Processed: 1       Uptime: 1m 36s
     PID: 4589    Sessions: 0    Processed: 9       Uptime: 1m 38s
    /var/rails/huga:
     PID: 18348   Sessions: 0    Processed: 24      Uptime: 2m 54s

General informationの項目の説明は以下になります。max

passengerが起動できるプロセスの最大値。ApacheだとPassengerMaxPoolSize、Nginxだとpassenger_max_pool_size の値になります.count

現在起動しているプロセスの数active

リクエストを処理中のプロセス数。この値はcount以下になりますinactive

アイドル状態(リクエストを処理していない)のプロセス数。count – activeの値と等しくなります

Domainsは、VirtualHostが複数あれば、VirtualHostごとでプロセス情報の一覧を表示します。

項目の説明は以下になります。Sessions

処理待ちのクライアント数
Processed

リクエストを処理した数Uptime

プロセスの生存期間

 なお。設定ファイルでPassengerTempDir(Apacheの場合のみ)を指定している場合は、実行時に

ERROR: Phusion Passenger doesn't seem to be running.

というエラーになってしまいます。その場合、

 $ export PASSENGER_TEMP_DIR(かPASSENGER_TMPDIR)=[PassengerTempDirの値]
 $ passenger-status

か、または

$ PASSENGER_TMPDIR(かPASSENGER_TMPDIR)=[PassengerTempDirの値] passenger-status

とすれば実行できます。

 passengerの動作が怪しい時に確認するのに使ってもらえればと思います。

 次回はもう1つのツールについて説明したいと思います。それでは。

SSLを更新したらエラーコード:sec_error_unknown_issuerが表示された(ベリサイン証明書にて)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

先月SSLの更新を行ったところ、FireFoxにてsec_error_unknown_issuerという

エラーがでました。

以下解決方法です。

どうやら、ベリサインにて2010年10月10日に仕様変更があり、それ以降に申請された

SSLの中間証明書は従来とは別のものになっていたことが原因のようです。

参考:中間CA証明書のインストールについて

新仕様の証明書か否かは以下の方法で確認しました。

※今回確認したのはセキュア・サーバーID用のものです。

1. SSL適用画面で「ページ情報」を表示させ、「証明書を表示」ボタンを押します。

  → 証明書ビューアが表示されます。

2. 証明書ビューアの「一般」タグの「発行者」>「一般名称(CN)」と確認します。

  証明書が新仕様、旧来仕様の場合それぞれ以下のように表示されます。

 新仕様: VeriSign Class 3 Secure Server CA - G3
 旧来仕様: VeriSign International Server CA - Class 3

新仕様の署名書の場合は以下から新しい中間証明書を取得し、対応します。

セキュア・サーバID用中間CA証明書

SSL更新の際は皆様ご注意ください。

最近人気な記事