ホーム ブログ ページ 53

memcachedを使ってみる

0

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

どうもメガネです。

今日は、memcachedをrailsで使用したいと思います。memcachedとは
http://gihyo.jp/dev/feature/01/memcached/0001

今回はcache_fuというpluginsを使用します。

1.memcachedのインストール&起動
# yum install memcached
# /etc/init.d/memcached start

2.memcache-clientのインストール
# gem install memcache-client

3.cache_fuのプラグインの設置
cache_fuのダウンロード後、解凍してvendor/plugins以下に設置
http://github.com/defunkt/cache_fu

4.config/memcached.ymlを作成
内容は以下の通り(適当に変えてください。)

defaults:
  ttl: 1800
  readonly: false
  urlencode: false
  c_threshold: 10000
  compression: true
  debug: false
  namespace: sns-decop
  session_servers: false
  memory: 64
  benchmarking: true
  raise_errors: false
  fast_hash: false
  fastest_hash: false

development:
  sessions: true
  fragments: false
  servers: localhost:11211

以上で準備完了。

今回は、Userモデルがあることを仮定して、ユーザ一覧をmemcacheに格納したいと思います。

Userモデルの修正
class User < ActiveRecord::Base
  #10分データ保持する
  acts_as_cached :ttl => 10.minutes

  def self.find_all
    # get_cache(“find_all”)にデータがなければ、findしてget_cacheに追加する
    users = self.get_cache(“find_all”) do
      users = User.find :all
    end
  end
end

class UsersController < ApplicationController

  def index
    @users = User.find_all
  end

end

上のような感じでデータが取得できます。
便利なのでぜひ使用してみてください。

Ruby on Rails SOAP

0

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

ども、rick No.18です。
今回はSOAPについて書きます。

SOAPとは、データのやり取りをするためのもので、XMLに基づいています。

環境

ruby1.8.6
rails1.2.6

データの送受信

require “soap/wsdlDriver”
driver = “SOAP::WSDLDriverFactory.new(URL).create_rpc_driver”
# URLはWSDLファイル格納場所
# WSDLファイルによってフォーマットを決定する。(xml)
request = {“time” => “20100602100000”}
送信するデータはハッシュに入れて送信
@resopnse = driver.method(request)
これで送信ができる。
返信データは@responseに格納されている。(主に@response.body)
driver.methodのmethodはWSDLに記述されているメソッドだが、driver.singleton_methodsなどで、どのメソッドが使用可能か閲覧できる。

受信データ

自分が受信者となる場合、railsのSOAPを使用すると
SOAP::Mapping::Object:0x155556e53f10 {url}method名1=SOAP::Mapping::Object:0x155556e53217 {url}method名1-1=内容]
上記のような形式でデータが受信されます。
データの取り出し方は、
@res = @response[method名1]
=< SOAP::Mapping::Object:0x155556e53217 {url}method名1-1=内容
@res.method名1-1
=> 内容
このように取り出す事が可能です。 @resは複数になる場合、さらに配列となって格納されています。
また@responseで使用できるメソッド名もsingleton_methodsで確認可能です。

ActsAsReadonlyableで負荷分散 - DBの問い合わせ処理(SELECT文)のみをslave用のDBに振り分ける方法の紹介

0

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

こんにちは。KBMJの本多です。

今回はActsAsReadonlyableを用いて、DBへのアクセスの負荷分散を行う方法を紹介します。実際にWEBサービスを運用する場合、WEBサーバー及びDBサーバーが複数台稼働している事があると思います。

今回のケースは以下のサーバー構成という前提で話を進めさせていただきます。

・WEBサーバー(Ruby on Rails)x2台
・DBサーバー(MySQL)x2台

DBサーバーはMySQLの一方向レプリケーションを採用しているため、Master(以下DB1)とSlave(以下DB2)という構成です。
基本的にRailsは1つのDBに対してのみアクセスを行うため、処理の流れは以下のようになります。

WEBx2 <= (SQL) => DB1 <= (レプリケーション) => DB2

この構成で、とある「処理の重いデータ抽出処理」を行う機能を追加した際に、
WEBサーバーやDB1に負荷がかかったため、「この重い処理に関してのみ、DB2へSQLを投げる事は出来ないか?」
と言う要望を受けて、今回のプラグインを使用しました。

1、ActsAsReadonlyableのインストール
railsのrootディレクトリで以下を実行します
ruby script/plugin install svn://rubyforge.org/var/svn/acts-as-with-ro/trunk/vendor/plugins/acts_as_readonlyable

2、ActsAsReadonlyableで接続するDBの設定
config/database.ymlにて以下のようにDB2の情報を追加
production:
  database: rails_project_production
  host:(DB1のIPアドレス)
  (略)
  slave:
    database: rails_project_production
    host: :(DB2のIPアドレス)
    (略)

3、slave接続用のModel作成
今回は限定的な処理のみslaveに接続させるため、専用のmodelを作成する事にしました。
元となるmodelが
item.rb(テーブル名、items)
となっている物に対して、以下のslave用modelを作成しました。

slave_item.rb
class SlaveItem < ActiveRecord::Base
  set_table_name “items”
  acts_as_readonlyable [“slave”]
end

4、重い処理のSQLを3で作成したmodelを使って実行
Item.find_by_sql(重い処理)  ↓
SlaveItem.find_by_sql(重い処理)

以上で修正作業は完了です。
これにより、重いSQLに関してのみDB2へ問い合わせが行われ、
DB1の負荷を軽減する事ができるようになります。

また、誤ってSlaveItem経由でアップデート処理等をかけてしまった場合は
DB1へアクセスされるため、もしもの時の予防にもなります。

もちろん、重いSQLの改善も非常に大事ですが、ある程度限界が見えている場合は、
今回のような視点を変えた対処法を取ってみるのはどうでしょうか?

GOOD RAILS!!

RVMでRailsのバージョンを管理する

0

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

こんにちは、sasimiです。

今回は、RubyのバージョンもRailsのバージョンも管理するのに便利なRVMを楽しみたいと思います。

Rails3とRails2.3.8をインストールし、管理するにはどうすればいいのでしょうか。

そこで、RVMです。

ハチネンさんのエントリー RVMで複数のRubyを管理 を読んで、Rails3をインストールしてみました。

環境はCentOS5.4です。

今回、以下のことをやっています。

■ RVMのインストール

■ Rubyのインストール

■ gemsetの作成

■ Rails3、Rails2のインストール

 RVMのインストール

[tomonori@localhost]~% cd
# RVMのダウンロード
# gitをインストールしている方
[tomonori@localhost]~% wget -O rvm-install \
[tomonori@localhost]~% http://rvm.beginrescueend.com/releases/rvm-install-head
# gitをインストールしていない方
[tomonori@localhost]~% wget -O rvm-install \
[tomonori@localhost]~% http://rvm.beginrescueend.com/releases/rvm-install-latest

# ダウンロードしたファイルの実行
[tomonori@localhost]~% sh rvm-install

#rvm
[tomonori@localhost]~% source "$HOME/.rvm/scripts/rvm"

rvmのパスが通ったことを確認します

[tomonori@localhost]~% rvm notes

Notes for Linux ( CentOS release 5.5 (Final) )

    *  curl is required.

    *  patch is required (for ree, some ruby head's).

    *  If you wish to install rbx and/or any MRI head (eg. 1.9.2-head) then you must install and use rvm 1.8.7 first.

    *  For MRI/ree (if you wish to use it) you will need:
       $ yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel
       $ yum install -y iconv-devel # NOTE: For centos 5.4 final iconv-devel might not be available :(
    *  For JRuby (if you wish to use it) you will need:
       $ yum install -y java

RVMのインストールはここまで。

今回、CentOS5.4にインストールしました。

ここで表示されている通り、readlineとzlibをインストールしました。

RVMがログインする度に起動するように.zshrc(bashの方は.bashrc)に追加します。

# .zshrcにrvmを読み込むように追加
[tomonori@localhost]~% echo 'if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then "' >> ~/.zshrc
[tomonori@localhost]~% echo '  source "$HOME/.rvm/scripts/rvm" ; ' >> ~/.zshrc
[tomonori@localhost]~% echo 'fi'  >> ~/.zshrc

ここまでの詳細は

http://rvm.beginrescueend.com/rvm/install/

を参照してください。

 Rubyのインストール

さて、rubyをインストールします。

% rvm install 1.8.7 -C "--enable-shared, --with-readline-dir=/usr/local"
% rvm install 1.9.2 -C "--enable-shared, --with-readline-dir=/usr/local"

[tomonori@localhost ~]% ruby -v      
ruby 1.9.2dev (2010-05-31 revision 28117) [x86_64-linux]

RVMによって複数のRubyを管理するのはハチネンさんのエントリー RVMで複数のRubyを管理 を読んでください。

 gemsetの作成

ここからはgemsetを利用して、Railsのバージョンを切り替えたいと思います。

現在のgemsetのリストを確認します

[tomonori@localhost]~% rvm gemset list

info: gemsets : for ruby-1.9.2-preview3 (found in /home/tomonori/.rvm/gems/)
global

新しくgemsetを作成します。ここではrails3という名前のgemsetを作成します。

[tomonori@localhost]~% rvm gemset create rails3

info: Gemset 'rails3' created.

同様に、rails2という名前のgemsetを作成します。

[tomonori@localhost]~% rvm gemset create rails2

info: Gemset 'rails2' created.

 Rails3、Rails2のインストール

では、rails3というgemsetを使って、gemのインストールをします。

このgemsetにRails3をインストールします。

[tomonori@localhost]~% rvm gemset use rails3
info: Now using gemset 'rails3'

[tomonori@localhost ~]% gem install tzinfo builder memcache-client rack \
[tomonori@localhost ~]% rack-test rack-mount erubis mail text-format thor \
[tomonori@localhost ~]% bundler i18n
[tomonori@localhost]~% gem install rails --pre 

同様に、gemset rails2にRailsの最新版である2.3.8をインストールします。

[tomonori@localhost]~% rvm gemset use rails2

info: Now using gemset 'rails2'

[tomonori@localhost]~% gem install rails

では、確認します。

ruby-1.9.2-preview3とgemset rails3の組み合わせで正しくインストールされているかを確認します。

おなじみのgem listで見てみると、

[tomonori@localhost]~% rvm use ruby-1.9.2-preview3@rails3

info: Using ruby 1.9.2 preview3 with gemset rails3
[tomonori@localhost]~% gem list

*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.0.beta4)
actionpack (3.0.0.beta4)
activemodel (3.0.0.beta4)
activerecord (3.0.0.beta4)
activeresource (3.0.0.beta4)
activesupport (3.0.0.beta4, 2.3.8)
arel (0.4.0)
builder (2.1.2)
bundler (0.9.26)
erubis (2.6.5)
i18n (0.4.1)
mail (2.2.4)
memcache-client (1.8.3)
mime-types (1.16)
polyglot (0.3.1)
rack (1.2.0, 1.1.0)
rack-mount (0.6.4)
rack-test (0.5.4)
rails (3.0.0.beta4)
railties (3.0.0.beta4)
rake (0.8.7)
rdoc (2.5.8)
text-format (1.0.0)
text-hyphen (1.0.0)
thor (0.13.6)
treetop (1.4.8)
tzinfo (0.3.22)

正しくインストールされているようです。

同様に、gemset rails2ではどうでしょうか?

[tomonori@localhost]~% rvm use ruby-1.9.2-preview3@rails2

info: Using ruby 1.9.2 preview3 with gemset rails2
[tomonori@localhost]~% gem list

*** LOCAL GEMS ***

actionmailer (2.3.8)
actionpack (2.3.8)
activerecord (2.3.8)
activeresource (2.3.8)
activesupport (2.3.8)
rack (1.1.0)
rails (2.3.8)
rake (0.8.7)
rdoc (2.5.8)

インストールされていることが確認できましたね。

しかも、gemsetを切り替えることで、Railsのバージョンの管理ができました。いや、まあ、gemを管理してるだけやん、っていわないで。。。

最後に

[tomonori@localhost]~% rvm use ruby-1.9.2-preview3@rails3 --default

これで、次回からログイン時にもこのruby-1.9.2-preview3とgemset rails3のときのものが使われますよ。

gemsetの名前はなんでもいいので、プロジェクト毎に工夫することができます。

どうです?積極的にRVMを利用したいと思いませんか?

忘れないうちにsolarisコンテナ&zfsのコマンド

0

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

忘れないうちにと言うことで前に少し勉強した

solarisコンテナ(zone)&zfsのコマンドを記載します。

コンテナの作成などについては書いておりませんが

構成など確認をする場合必須と思われものを記載しておきます。

 solarisコンテナ(zone)

zoneの管理コマンドを以下を基本としています

コマンド詳細
zonecfgzoneの構成を作成、変更する
zoneadmzoneの管理コマンド
zlogingobal-zoneから各zoneへログイン

既存コンテナ一覧を表示

  • v ゾーン名,ID名などコンテナの詳細を表示
#zoneadm list -vc

グローバルゾーンからログインする(rootで行う)

#zlogin <ゾーン名>

ゾーンの起動

# zoneadm -z <ゾーン名> boot

ゾーンの停止(global zoneからrootで実行)

# zlogin <ゾーン名> shutdown -i0 -g0 

ソーンの停止(強制)

# zoneadm -z <ゾーン名> halt

 ZFS

スナップショットの作成する

(snapshotはマウントポイント/バックアップ名)

#zfs snapshot testpool/home/test1@today

一覧を確認

#zfs list

ロールバック

#zfs rollback -r testpool/home/test1@today

忘れないうちにsolarisコンテナ&zfsのコマンド

0

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

忘れないうちにと言うことで前に少し勉強した

solarisコンテナ(zone)&zfsのコマンドを記載します。

コンテナの作成などについては書いておりませんが

構成など確認をする場合必須と思われものを記載しておきます。

 solarisコンテナ(zone)

zoneの管理コマンドを以下を基本としています

コマンド詳細
zonecfgzoneの構成を作成、変更する
zoneadmzoneの管理コマンド
zlogingobal-zoneから各zoneへログイン

既存コンテナ一覧を表示

  • v ゾーン名,ID名などコンテナの詳細を表示
#zoneadm list -vc

グローバルゾーンからログインする(rootで行う)

#zlogin <ゾーン名>

ゾーンの起動

# zoneadm -z <ゾーン名> boot

ゾーンの停止(global zoneからrootで実行)

# zlogin <ゾーン名> shutdown -i0 -g0 

ソーンの停止(強制)

# zoneadm -z <ゾーン名> halt

 ZFS

スナップショットの作成する

(snapshotはマウントポイント/バックアップ名)

#zfs snapshot testpool/home/test1@today

一覧を確認

#zfs list

ロールバック

#zfs rollback -r testpool/home/test1@today

データベースを一発でリセットする方法

0

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

開発途中にデータベースを空の状態にしたい時のコマンドをご紹介します。最近Rails2系を触れて知ったのですが、Rails1系だとデータベースをリセットする際に

rake db:drop
rake db:create
rake db:migrate

とやっていたのですが、

rake db:migrate:reset

とやると上の3つのコマンドと同じ事をやってくれるので楽です。
ちなみにrakeタスク一覧はrake -Tで見れます。

せっかくなんでいくつかrakeコマンドを紹介します。

rake db:create RAILS_ENV=production
ymlに定義してあるデータベースを作る(上記の場合production)

rake db:create:all
ymlに定義してあるデータベースを全部作る

rake db:drop RAILS_ENV=production
ymlに定義してあるデータベースを消す(上記の場合production)

rake db:drop:all

ymlに定義してあるデータベースを全部消す

rake db:version
現在のマイグレーションのバージョン表示

rake db:charset
データベースの文字コードを教えてくれる

また、DoRuby!でrakeの記事があったので紹介しておきます。

Ruby on Railsでrakeコマンドを使って様々なタスクを実行しよう

皆さんも活用してみて下さい。

VirtualBoxにCentOS入れようとしたら「ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。」というエラーがでた

0

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


VirtualBoxにCentOS5.3設定をしようとしたところ、OSインストールの最後のところで以下のエラーが出ました。エラー内容ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。ファイルが不明であるか、パッケージまたはメディアが破損している可能性があります。インストールソースを検証してください。

ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。

インストールCDを変更してみてもやっぱり同じエラーがでます。
あと少しなのに残念です。

ググってみてもよく分からなかったのですが、よくよく見てみたところ、
VirtualBox内でCentOS5.4を起動中でした。

CentOS5.4を終了させて、再インストールを試します。。

インストールできています

先程まで出ていたエラーが出なくなり、先に進めるようになりました。

VirtualBoxにCentOS入れようとしたら「ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。」というエラーがでた

0

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


VirtualBoxにCentOS5.3設定をしようとしたところ、OSインストールの最後のところで以下のエラーが出ました。エラー内容ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。ファイルが不明であるか、パッケージまたはメディアが破損している可能性があります。インストールソースを検証してください。

ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。

インストールCDを変更してみてもやっぱり同じエラーがでます。
あと少しなのに残念です。

ググってみてもよく分からなかったのですが、よくよく見てみたところ、
VirtualBox内でCentOS5.4を起動中でした。

CentOS5.4を終了させて、再インストールを試します。。

インストールできています

先程まで出ていたエラーが出なくなり、先に進めるようになりました。

【Ruby】半角/全角バリデータ~解説編【Rails】

0

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

前回投稿した半角/全角バリデータの正規表現の中身を解説します。前回は、rubyで使える半角/全角バリデータを紹介しました。
あのソースは突貫工事的に書いたものなので、実は自分でも仕組みを理解しないままでした。
ですが、「それじゃあいかん!」ってことで、1つずつ調べてみました。

以下、ソース再掲↓

KCODE = 'u'

  def self.hankaku?(str)
    return nil if str.nil?
    # 半角のみOKなので、全角が混ざっているとfalseが返る
    unless str.to_s =~ /^[ -~。-゚]*$/
      return false
    end
  return true
  end

  def self.zenkaku?(str)
    return nil if str.nil?
    # 全角のみOKなので、半角が混ざっているとfalseが返る
    unless str.to_s =~/^[^ -~。-゚]*$/
      return false
    end
    return true
  end

ポイントは

    # 半角のみOKなので、全角が混ざっているとfalseが返る
    unless str.to_s =~ /^[ -~。-゚]*$/
    # 全角のみOKなので、半角が混ざっているとfalseが返る
    unless str.to_s =~/^[^ -~。-゚]*$/

この2か所です。
正規表現を使っているだけですが、この正規表現がややこしい。
半角文字用の正規表現を1つずつ分解すると・・・

  unless str.to_s =~ /先頭文字[ -~。-゚]0個以上の連続 終端文字/

となります。
つまり、[ -~。-゚]という文字の繰り返しってことです。
・・・で、これ[ -~。-゚]をさらに分解すると

  " "から~まで & 。から゚まで

ようは、半角のスペースからチルダまで+句点から半濁点までってことです。
[0-9A-Z]と同じ感じで書いてあると思えば、そう難しくはないかと。
文字コードの並び順の関係で、この書き方でカタカナなどを含むすべての半角文字を指定することが可能です。
全角文字は、これを否定してやればOK。

これで、何をどういう感じで指定しているかがわかりました!
スッキリ☆

ruby on railsでPDFファイルを出力する。 prawnto Plugin編

0

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

こんにちは、KBMJの中平@railsエンジニアです。

今回は、ruby on railsでPDFファイル出力ができる  prawnto というプラグインついて書きます。

rubyおよびrailsでPDFファイルを出力するプラグインは色々ありますが、

今回は、railsのプラグインとして使用できること、日本語を使用できること、コントローラー・ビューに記述するだけで簡単にPDF出力ができるプラグインということで、 prawntoというpluginを紹介しようと思います。

(ほかのライブラリだと、サーバーにライブラリを入れておかないといけないものや、一旦PDFファイルを事前にファイル出力しておかなければならないものが多く面倒な気がしました)

環境

OS : Windows Vista
Ruby : 1.8.7
ruby on rails : 2.3 (prawntoは公式ページでは2.1or2.2と書かれていましたが、2.3でも動きました)

prawntoのインストール

ruby script/plugin install git://github.com/thorny-sun/prawnto.git

prawnのインストール

prawnto はprawnというPDF出力ライブラリを利用しているため必要
gem installprawn

日本語用フォントのダウンロード

ダウンロードして解凍後、ttfファイルをアクセス可能な場所に置く
http://ossipedia.ipa.go.jp/ipafont/

私はpublicの直下に置きましたが、libでもvender配下でもいいと思います。

コントローラーのメソッドに以下のコードを記述

def show       
    prawnto :prawn => {
              :page_layout => :portrait, # 縦 :landscape,# 横
              :page_size => ‘A4’,

              :left_margin => 36,
              :right_margin => 36,
              :top_margin => 36,
              :bottom_margin => 36

    }
@pigs = “#{RAILS_ROOT}/public/images/aaa.jpg” #画像ファイル

end

ビューファイルに以下のコードを記述

ファイル名は show. pdf.prawnという風につけます。

pdf.font “#{RAILS_ROOT}/public/ipag.ttf”
pdf.text “日本語のテストです。”
pdf.text “サイズ36”, :size => 36
pdf.font “Times-Roman”
pdf.text “abcdefghijklmnopqrstuvwxyz”

pdf.text “http://doruby.kbmj.com”

pdf.bounding_box([400,313], :width=>50, :height=>50) do
  pdf.line_width = 2
  pdf.stroke_rectangle [0,50], 50, 50
  pdf.stroke_line 0,0,50,50
  pdf.stroke_line 0,50,50,0
  pdf.font ‘Helvetica-Bold’, :size => 12
  pdf.text “\nSTAMP\nHERE”, :align=>:center
end

pdf.image @pigs, :at => [50,450], :fit => [200,200]

実際にruby on railsでPDF出力する


コントローラー名/show/hoge.pdf


というようにアクション名の後ろに拡張子をPDFにしたファイル名をつけてブラウザでアクセスするとデータがPDF形式で出力されます。

この、prawntoではオプションが用意されており、色々な形のPDFファイルを出力することが可能です。

簡単に例をあげます

 :prawn PDFの表示形式などの設定{}に複数設定可能

 >> 上の例だと:page_layout => :portrait, # 縦 pagee_size => ‘A4’,

      とあるのはA4縦で出力 あとは余白などの設定しています。

:inline=>false : falseにすることでPDFをダウンロードさせる。デフォルトはtrueになっており、ブラウザでPDFが表示されます。

また公式ページにデモが用意されておりPDFのサンプルを見ることができますので、是非参考にしてください。

http://cracklabs.com/prawnto/demosこのprawntoというプラグインを利用すると比較的簡単にPDFを出力できると思います。

日本語や画像も使え、罫線も引けるようですので、ある程度のことはできそうな感じです。

ruby on rails でPDF出力することがあればprawntoを利用してみてはいかがでしょうか?prawnto 公式ページ

http://cracklabs.com/prawnto

acts_as_rateableを使ってみた

0

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

こんにちわ

abennuです

今回はRailsでレーティング機能を実現できるプラグイン acts_as_rateableを使ってみたのでインストール~使用方法なんかを書きたいと思います

インストール

インストールは

script/plugin install svn://rubyforge.org/var/svn/rateableplugin/trunk

これでOKです。次にmigrationファイルを作ります。

script/generate migration add_ratings

これでできたmigrationファイルに以下のように記述します。

create_table :ratings do |t|
  t.column :rating, :integer   
  t.column :rateable_id :integer, :null => false
  t.column :rateable_type, :string, :null => false
end

def self.down
  drop_table :ratings
end 

こんな感じであとはレーティング機能を使用したいモデル(ここではUserモデル)に

class User < ActiveRecord::Base
  acts_as_rateable
end

こんな感じにacts_as_rateableを追加すれば準備完了です。

実際に使うときはこんな感じに使います。

ユーザの新規作成時にレートをつける

User.new(:name => "hoge", :rating => 1).save

既存のユーザにレートをつける

User.find_by_name("hoge").rate(2)

ユーザのレートを取得する

User.find_by_name("hoge").rating

という感じに簡単にレーティング機能が実現できます。

以上です。

CakePHPでRailsのように環境設定に応じて必要なパラメータを変更する方法

0

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

TrinityTです!!

最近CakePHPの仕事をしています。

Railsライクな構成のため比較的容易に開発を進められたのですが、残念なことに「環境名に応じて設定値を切り替える」方法がありませんでした。

今回はこれを解決する方法について説明します。

 前提

Railsでの環境設定方法

・「ルートディレクトリ/config/environment.rb」に全環境共通の設定を記述

・「ルートディレクトリ/config/environments/環境名.rb」に各環境ごとの設定を記述

CakePHPでの環境設定方法

・「ルートディレクトリ/config/bootstrap.php」に環境設定を記述

→環境ごとの設定という概念が無い!デプロイのたびに逐次変更する必要があるので非常に面倒。

目標

ローカル開発環境(develpment)、テストサーバ環境(integration)、本番サーバ環境(production)でシームレスに環境設定を切り替えられるようにする!

 説明

方針

・環境名はApacheに独自定義。

・「ルートディレクトリ/config/bootstrap.php」に全環境共通の設定を記述

・「ルートディレクトリ/config/bootstraps/環境名.php」に各環境ごとの設定を記述

 手順

1. Apacheに独自環境名設定

Railsでは起動時に環境変数を指定しますが、CakePHPではこの概念が無いためApacheの設定ファイル(httpd.conf等)にSetEnvで独自パラメータを設定します。

ここでは「CAKE_ENV_MODE」という変数を定義することにしました。

ローカル開発環境(development)

※後述する振り分けでは「本番orテストサーバorそれ以外」という条件にするため、設定しなくても問題無いです。

  DocumentRoot /var/www/html
...  
  SetEnv CAKE_ENV_MODE "development" 
...
テストサーバ(integration)
  DocumentRoot /var/www/html
...  
  SetEnv CAKE_ENV_MODE "integration" 
...
本番サーバ(production)
  DocumentRoot /var/www/html
...  
  SetEnv CAKE_ENV_MODE "production" 
...

2. 各環境ごとの設定ファイルを作成

「ルートディレクトリ/config/bootstraps/環境名.php」のファイルを作成します。

この例では「LOG_PATH」の設定を行っています。

ローカル開発環境(config/bootstraps/development.php)
<?php
Configure::write("LOG_PATH", "/var/log/development/cake.log");
?>
テストサーバ(config/bootstraps/integration.php)
<?php
Configure::write("LOG_PATH", "/var/log/integration/cake.log");
?>
本番サーバ(config/bootstraps/production.php)
<?php
Configure::write("LOG_PATH", "/var/log/production/cake.log");
?>

3. 設定ファイル読み込み

作成した各環境毎の設定ファイルを読み込む処理をconfig/bootstrap.phpに設定します。

...
// Apacheで設定した環境名を読み込む
$env = empty($_SERVER['CAKE_ENV_MODE']) ? '' : $_SERVER['CAKE_ENV_MODE'];

// 環境名に応じて設定ファイルを読み込む
switch ($env) {
 case 'production':
   require_once('bootstraps' . DS . 'production.php');
   break;
 case 'integration':
   require_once('bootstraps' . DS . 'integration.php');
   break;
 default:
   require_once('bootstraps' . DS . 'development.php');
}

これにより各環境で「LOG_PATH」変数を意識せずに設定が切り替えることができるようになりました。

 おわりに

いかがだったでしょうか?

PHPの場合「レンタルサーバで運用しているのでApacheの設定はいじれない!」などの制約が考えられるため、

他の方法を行う必要があるかもしれません。

参考になれば幸いです。

S2Chronosでバッチ処理

0

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

こんにちは。wryyyです。

本日は、S2ChronosというSeasar2(Javaのフレームワーク)のプロジェクトをご紹介いたします。

ではまずS2Chronosとは何か!概要をご紹介いたします。

【概要】

S2Chronosは、Seasar2に対応したJavaオブジェクトスケジューリングフレームワーク。

日時に関連するビジネスロジックを、S2上でタスククラスとして登録し、スケジューリングすることが可能になる。

つまり、S2Chronosを使うことによって、アプリ上でバッチを動かすことができ、

バッチファイルを別途用意して、cronに登録して。。。という作業が必要なくなるのです!!

それでは、実際にS2Chronosの設定を行い、動作するようにしてみましょう。

1. Jarのダウンロード、ビルドパスに追加

http://s2chronos.sandbox.seasar.org/ja/download.html

上記、URLより

・s2chronos-core-1.0.0.jar

・s2chronos-extension-1.0.0.jar

をダウンロードし、プロジェクトのビルドパスに追加。

2. S2Chronos用ファイルの作成と設定変更

・chronosCustomizer.diconファイルを src/main/resources に作成します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
        "http://www.seasar.org/dtd/components24.dtd">
<components>
        <component name="schedulerConfiguration" class="org.seasar.chronos.core.SchedulerConfiguration">
                <property name="daemon">true</property>   
                // スケジューラをデーモンスレッドで起動します.
                <property name="autoFinish">false</property> 
                // <- 実行するタスクがない場合自動的にスケジューラを終了させるかどうかのフラグ。
                         trueの場合自動的に終了します.
                <property name="autoFinishTimeLimit">5000L</property>
                // <- 実行するタスクがなくなってからどれぐらいでスケジューラを終了させるかの時間(msec).
                <property name="taskScanIntervalTime">2000L</property>
               // <- タスクを監視する時間間隔(msec).
                <property name="threadPoolType">@org.seasar.chronos.core.ThreadPoolType@CACHED</property> 
               // スケジューラのスレッドプールタイプを指定します.
        </component>
</components> 

・creator.diconに下記を追加します。

<component class="”org.seasar.chronos.core.creator.TaskCreator”/">
<component class="”org.seasar.chronos.core.creator.TriggerCreator”/">

・customizer.diconに下記を追加します。

<component name="taskSupportAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer">
                <initmethod name="addInterceptorName">
                        <arg>"aop.traceInterceptor"</arg>
                </initmethod>
                <property name="pointcut">"do.*, initialize, destroy"</property>
        </component>
        <component name="taskCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
        <initmethod name="addCustomizer">
                        <arg>taskSupportAspectCustomizer</arg>
        </initmethod>
        </component>
        <component name="triggerSupportAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer">
                <initmethod name="addInterceptorName">
                        <arg>"aop.traceInterceptor"</arg>
                </initmethod>
                <property name="pointcut">".*"</property>
        </component>
        <component name="triggerCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
                <initmethod name="addCustomizer">
                        <arg>triggerSupportAspectCustomizer</arg>
                </initmethod>
        </component>

・src/main/webapp/WEB-INF/ にあるweb.xmlに下記を追加します。

<servlet>
        <servlet-name>chronosServlet</servlet-name>
        <servlet-class>org.seasar.chronos.extension.servlet.S2ChronosServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
</servlet>

3. パッケージの作成

プロジェクトの src/main/java にタスクパッケージを作成

例:hoge.task(.taskで終わるような名前にする。)

4. タスククラスの作成

上記のタスクパッケージにタスククラスを作成する。(HogeTask.java等、Taskで終わるような名前にする。)

packager hoge.task;

import org.seasar.chronos.core.annotation.task.Task;
import org.seasar.chronos.core.annotation.trigger.NonDelayTrigger;

@Task
@CronTrigger(expression = "0 44 17 * * ?")
public class HogeTask {

    // タスク処理
    public void doExecute() {
        System.out.println(“test”);
    }
}

・@Task:タスクスケジューラとして、登録する。

・@CronTrigger(expression = “0 44 17 * * ?”):17時44分00秒にdoExecute()メソッドを実行する。

5. 起動、動作確認

上記プロジェクトをtomcatコンテキストに定義して、tomcat起動

CronTriggerアノテーションで指定した時間に、コンソール上に「test」の文字が出るか確認。

※補足

s2chronosをHOTdeployで実行すると、毎秒クラスの再ロードが行われ、ログが大変なことになる。

本番反映時には、COOLdeployにする。

COOLdeployにするためには、chronosCustomizer.diconを以下のように修正する。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <component name="schedulerConfiguration" class="org.seasar.chronos.core.SchedulerConfiguration">
        <property name="hotdeployDisable">true</property> ←ここを追加
        <property name="daemon">true</property>
        <property name="autoFinish">true</property>
        <property name="autoFinishTimeLimit">5000L</property>
        <property name="taskScanIntervalTime">2000L</property>
        <property name="threadPoolType">@org.seasar.chronos.core.ThreadPoolType@CACHED</property>
    </component>
</components> 

(googleで調べるドキュメントとかには<property name=”hotdeployDisabled”>とかになっているので注意!!)

以上、簡単ですがS2Chronosの説明となります。

他にも動的にスケジュールの時間を決められたりするので、また何か発見しだい投稿したいと思います。

つかおう SKK

0

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

たのしいインプットメソッド、SKK をくわずぎらいのひとにもおすすめしたいです。

google 日本語入力や baidu type などあたらしい日本語入力システムが少し話題になったりして、色々試してみたかたもいるかと思いますが、そのついでに SKK も試してみてはいかがでしょうか。是非、試してみましょう。

 SKK とは何ですか?

あえて語るまでもなく、インプットメソッド(以下 IM)の一種です。詳しいことは、Wikipedia (SKK – Wikipedia)などの解説に譲ります。

おおざっぱな特徴と比較

  • SKK:
    • ユーザに依頼された部分を漢字変換する。漢字変換する部分はユーザが指定する
  • MS-IME やことえりなどの IM:
    • ユーザの入力文字列を文章の構成要素にわける。必要なら漢字の変換を行なう。ただし、IM の仕事が複雑で、ユーザの意図する単語の区切りにならない場合がある

さらにおおざっぱな特徴と比較

文章を構成要素に区切る作業を、

  • 常に自分でやるか(SKK)
  • 誤変換があったとき直すか(その他 IM)

という、ユーザの負担のタイミングと頻度が違います。

小刻みに変換の合図を送ってリズム良く入力していくか、変換を丸投げしてときどき誤変換に対応していくか、くらいの違いなので最終的にどちらを選ぶかは好みの問題ですが、SKK は慣れればテンポ良く入力していけるはずなので、比較的ストレスなく日々を過ごせるのではないかと思います。

 てっとりばやく体験してみる

こういうものは実際手をうごかしてみるのが良いと先人も言っているので、手をうごかしてみます。

Emacs で SKK のチュートリアルが用意されているので、これで試してみるのがオススメです。

準備

Debian や Ubuntu では SKK 導入のためのパッケージが用意されているのでそれを利用します(一番楽な方法)。その他の環境では「Emacs ddskk」とったキーワードで検索してみてください。

sudo aptitude install apel ddskk skkdic

それぞれ、以下のものをインストールしています。

  • apel: Emacs で使われるライブラリ
  • ddskk: Emacs で使われる SKK ライブラリ
  • skkdic: SKK で利用される辞書ライブラリ

aptitude でインストールした Emacs 等であれば、ライブラリパス等の設定の必要もなく、起動して即利用できます。

試す

emacs を起動します。そしてチュートリアルを開始します。チュートリアルは M-x skk-tutorial で開始します。

あとは言われるままにチュートリアルを進めるだけです。

 導入する

SKK は Emacs だけで利用できる IM ではありません。skkime(Windows)、aquaSKK(OSX)、uim-skk(Linux など)といった様々な OS の IM で利用できます。Vim でも skk.vim というプラグインが利用できます(skk.vim : Japanese SKK。また、Vim での SKK については eskk.vim というプラグインの開発もはじまっています)。それぞれの利用したい場所での SKK を探して日常的に利用してみましょう!

 付録:よくある問題など

  • 小指が疲弊します
    • 慣れると意外と気にならないです。別解として、sticky-shift という、小指にやさしい仕組みが世の中にはあります。sticky shift で検索してみてください。
  • Terminal.app で “▽” がきれいに表示されない
    • iTerm を使う、次のバージョンに期待するなどの対策があります。
  • 他の入力方式で入力できなくなる
    • 他の入力方式で入力するケースことがあまりなくなるはずなので、おそらく問題ないです。

みなさんが SKK を利用してたのしい生活を送られることを願ってやみません。

Pythonで画像のコピー

0

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

はい。ぼくです。

さて、iPhoneのネタたくさんあるのですが。。今日はおやすみ。

たまたま、今日iPhoneアプリの開発検証で画像が数百枚も必要になったので、1枚のサンプル画像をコピーしまくろうということで、Pythonで数行のスクリプトで処理したのでそちらを記事に。

 Pythonの画像処理ライブラリのPIL(Python Imaging Library)で処理しました。
こちらが、自分のPCに入っていなかったため下記にてインストール( Mac限定ですみません。)

$ sudo port install py26-pil

インストールできちゃえば、後はコードちょりちょり書くだけ

# vim:fileencoding=utf-8 :

from PIL import Image
from PIL import ImageFont, ImageDraw

# 元となる画像名
original_image_name = “original.png”
# コピー後の画像名フォーマット
copied_image_name = “copied_%03d.png”

# 画像の読み込み
im = Image.open(original_image_name)

# 500 枚作成
for i in range(500):
    # コピー
    copy_im = im.copy()
    draw = ImageDraw.Draw(copy_im)
    # 画像の左上あたりに画像の番号を記載
    draw.text((10, 100), “No. %03d” % i)
    copy_im.save(copied_image_name % i, quality=100)

できあがりの画像はこちら。(copied_001.png)

無駄コードもありそうですが、ものの数分で500枚の画像が作成できた。さて、検証しなきゃ。。。

Railsでrepcachedを使ってみる

0

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

Railsでセッションの保存先として、memcacheを使用する場合があります。 しかし、memcachedが落ちてしまった場合、サイトにログインできないトラブルが起きてしまうなどの懸念があります。 そこでepcachedを使用してみたいと思います。

 Repcachedとは?

  • memcachedにレプリケーション機能を追加
  • 非同期のレプリケーション
  • マルチマスタのレプリケーションをサポート(バージョン2.0より)

詳細、repcachedのインストール手順は公式サイトを参照してください。

http://lab.klab.org/wiki/Repcached

 Railsで使えるようにする

Railsのアプリケーションでrepcachedを使用するためには、memcachedクライアントのインストールとアプリケーション側の設定が必要です。

memcachedクライアントの導入

repachedの大本はmemcachedなのでmemcachedクライアントがそのまま使えます。

gem install memcached-client
gem install system-timer

railsでの設定

ここではセッションの保存先として使用する場合と、

フラグメントキャッシュで使用する場合を例示したいと思います。

※この例では、192.168.1.10と192.168.1.11でrepcachedが立ち上がっており、

この2台でレプリケーションしているとします。(ポートはいずれも11211番を使用)

セッションの保存の場合
ActionController::Base.session = {
  :memcache_server => ['192.168.1.10:11211', '192.168.1.11:11211'],
  :expire_after => 86400,
  :namespace => "app-session-#{ENV['RAILS_ENV']}"
}

ActionController::Base.session_store = :mem_cache_store

フラグメントキャッシュの保存の場合

ActionController::Base.cache_store = [
  :mem_cache_store,
  ['192.168.1.10:11211','192.168.1.11:11211'],
  {
    :namespace => "app-flagment-#{ENV['RAILS_ENV']}"
  }
]

※フラグメントキャッシュの保存にrepcachce(memcache)を使用する場合は、

expire_fragmentの引数に正規表現を取ることができなくなってしまいます。

セッションの場合も、フラグメントキャッシュの設定の場合も、基本的には通常のmemcachedとほぼ同じです。

ポイントはmemcacheのサーバの指定に、レプリケーションしているmemcachedを双方指定することです。

これによって、セッションやフラグメントキャッシュは一旦指定したmemcachedのいずれかに配置されますが、

レプリケーションによって最終的には双方のmemcachedに配置されます。

仮に片方のrepcachedが落ちた場合でも、レプリケーションされているためほとんどのセッションやキャッシュは

失われずにすみます。(※非同期のレプリケーションのため、生成されたばかりにセッションやキャッシュは失われる可能性があります)

落ちた場合も、repcahcedの再起動時にレプリケーション先を指定することによって、

内容の同期が行われ、再びレプリケーションを行うことができます。

DBに格納された絵文字を特定する

0

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

サイト上で絵文字が文字化けしてしまい、DBでSELECTしても意味不明なマークが表示されているだけ・・・。
そんな時のための絵文字特定方法をご紹介します。※かなり力技ですが・・・
今回特定する画像はDocomoの「冷や汗」絵文字。
DBはPostgreSQL、文字コードはUTF-8で作成しています。
まずpsqlで該当のレコードををみてみましょう。

hoge=# select body from entries where id=1;
body
——
 (1 row)

うーんこれではわかりませんね・・・。
そこで、一度該当のレコードがあるテーブルをpg_dumpで出力してみます。

$ pg_dump hoge -t entries > entries.sql
このファイルをlessで出力します。

$ less entries.sql
<U+E722>

これは何か意味のありそうなコードです。(Unicode)
次に以下のサイトで先程の文字列を検索します。

絵文字変換表

上記サイトでUnicodeの欄に該当する絵文字がみつかりました。

googleウェブサイトオプティマイザーを使ってみよう

0

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

2009年に公開されてから、画期的なツールと言われながらも、いまだ普及しているとは言えないGoogleの「ウェブサイトオプティマイザー」。
今回は、そのツールの解説をします。
はじめまして。アクセス解析チームのアソウです。
以後よろしくお願いいたします。

近年webサイト最適化の手段として、アクセス解析は欠かせないものとなってきました。
Google Analyticsの台頭でツール導入の敷居は非常に低くなり、いまや個人から大企業まで、多くのwebサイトが、数値を確認しています。

しかし、アクセス解析はあくまでもサイトの現状の確認を行なうものです。
その解析結果をもとに、サイトの改善施策を行なわなければ、本当の意味での効果は表れません。

今回はリニューアルほど大掛かりではないけれど、サイト改善の具体的な方法を解説したいと思います。皆様のお役にたてば幸いです。

■ウェブサイトオプティマイザーを使ってみよう

http://www.google.com/websiteoptimizer/さて、今日は「ウェブサイトオプティマイザー」について解説します。

この「ウェブサイト オプティマイザー」、googleが無料提供している、いわゆるA/Bテストをするためのサービスです。
一個のコンテンツに対し複数のデザイン案を用意しておき、どの案がより効果的かをテストすることができます。

■「A/Bテスト」と「多変量テスト」

テスト方法はふたつ用意されています。
複数のHTMLを用意し、ランダムに表示させる「A/Bテスト」と、一個のHTMLを部分的に変化させる「多変量テスト」です。

今回はより簡単に導入できる「A/Bテスト」の使い方を説明したいと思います。

■1.テストするページを用意する

まず下準備としてテストするページのオリジナルHTMLとテスト用の別バージョンHTMLファイルをそれぞれ用意します。
「A/Bテスト」では、まったく新しくHTMLを用意する必要があるので、テストパターン分のファイルを作成し、webサーバ上にアップしておきましょう。

■2.URLの登録

テストページの準備が整ったら、各ページのURLを登録します。

1.テスト名は任意に分かりやすい名前を入力します。

2.テストするオリジナルページのURLを入力します。

次にオリジナルと比較テストするためのパターンページのURLを入力します。
パターンページは任意に増やすことが可能なため、3パターン4パターンといった複数パターンでのテストも可能です。

3.最後に、コンバージョン用のURLを入力します。
通常コンバージョンページは上記オリジナルページ、テストページから遷移するゴールページのURLとします。

これらURLが実際にインターネット上に公開されているかは、URLを入力すると自動的にチェックしてくれます。問題がないようであれば「続行」をクリックして、進みます。

■3.JavaScript埋め込み

ここからは、実際にHTMLを編集してサーバ上にアップロードする作業です。

今回は自分でトラッキングコードを埋め込んでいきます。

オリジナルページのHTMLファイルには直後に「制御スクリプト」と、直前にそれぞれ「トラッキングスクリプト」を埋め込みます。

パターンページ、コンバージョンページにも、直前にそれぞれのスクリプトを埋め込みます。
パターンを増やせば増やすほど、埋め込むトラッキングスクリプトも増えます。

すべてのスクリプトをファイルに埋め込み、webサーバーにファイルをアップロードした後、検証してエラーがなければ準備は完了です。

■4.テスト開始

確認画面で、オリジナル、パターン1、コンバージョンページの一覧が表示されるので、プレビューなどでパターン表示などに間違いないことを確認したら、「テストを開始」。
これで準備はすべて完了です。

あとは数時間後にレポートが上がってくるのを待つだけです。

■5.レポートを見る

レポートでは「予測コンバージョン率」やオリジナルの掲載成果を上回る可能性など、各指標が見られます。
また、CSV形式などのダウンロードも可能となっています。

■最後に

このウェブサイトオプティマイザーを使いこなし、テストから効果的なレイアウトや文言を導き出して、一気にコンバージョンアップ。なんてことも夢ではないかもしれません。

webサイトに変更を加えるということは、作業工数がかかり、しかも逆効果になる可能性もあるなど、何かとリスクが付きまといます。
オプティマイザーは、そのリスク回避を“テスト”というカタチで可視化し、より有効な施策を見つけ出す手助けとなります。

「リニューアルしたいけど、やっぱり不安…」そんな方にオススメのツールです。

■AppiritsのGoogle アナリティクスセミナー

AppiritsのGoogle アナリティクスセミナーは、初期設定から機能解説、仕組の理解までさまざまな内容を用意しています。
ご興味のある方は是非弊社セミナーにご参加ください。

Google アナリティクス セミナー インターフェイス編
Google アナリティクスのレポート画面が把握できていない方向けの講座。
レポート画面の解説や既存機能の活用法、マルチチャネルなどの新レポートのインターフェイスを解説します。

Google アナリティクス セミナー 分析手法編
インターフェイスは把握しているが、数値の意味や考え方がよく分からないという方向けの講座です。 アクセス解析を用いた課題抽出やサイト改善の考え方を解説します。

Google アナリティクス セミナー 徹底設定編
現状のGoogle アナリティクスで取得可能な数値に物足りない方向けの講座。
外部サイトへの誘導やソーシャルボタン連携、eコマース機能などのカスタマイズ方法をレクチャーします。

KBMJ、ECサイト構築パッケージ「エレコマ」に 多店舗対応機能を付け加えた「エレコマ 2.0」を発表

0

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


宣伝です!!

ECサイト構築パッケージ「エレコマ」に 多店舗対応機能を付け加えた「エレコマ 2.0」を発表しました。

 ◆概要

エレコマロゴECサイトを構築する際に必要となるのがECパッケージです。しかし、世の中にはECパッケージは多く存在していて、何を選べば良いかが分かりません。昨年の2009年12月に公開した「エレコマ」は、日本初Ruby on Railsを利用したECサイト構築パッケージで、MITライセンスにて提供しているのでパッケージ費用が不要です。公開して5カ月が経ち、1000件近いダウンロードがありますが、今回ECモールサイトやブランドを複数お持ちの方でも利用できるよう多店舗対応機能を含んだ「エレコマ2.0」を2010年 5月10日に発表いたしました。

従来、複数ブランドをお持ち方がECサイトを構築する場合、ブランド毎のECサイトを複数立ち上げるか、多大なコストを支払ってカスタマイズするかの2パターンでした。「エレコマ2.0」は、ECサイトの中に複数の店舗を登録できるよう多店舗対応機能を含んでいます。

また、細かなバージョンアップ情報は、「エレコマ」紹介サイト(http://ec.kbmj.com/)にも掲載されますし、技術者ブログ「DoRuby」(http://doruby.kbmj.com)でも掲載させて頂いております。Twitterのハッシュタグ(#elecoma)でも情報公開中です。

※Twitterは、Twitter, Inc.の登録商標です

◆追加されたまたは変更された機能

ユーザ側

・ 商品情報に店舗名を付加

・ 店舗ごとの商品一覧表示

・ 請求の分離及び画面遷移の変更

・ 店舗ごとの情報ページの追加

管理側画面(マスターショップ)

・ 販売元編集の画面を追加

・ 管理ユーザに販売元を紐づけ

管理側画面(販売元)

・ 商品管理

・ 受注集計

・ 顧客情報

・ 受注管理

・ 在庫管理

・ 返品処理

・ 基本情報(販売元編集、メンバー管理、発送設定)のみ閲覧、変更可能。

管理側制御

・ 基本的に管理しているショップの情報以外編集不可

・ カテゴリはマスターショップで管理する

◆ECサイト構築には

ECサイトを構築する際には、まず開発ベンダーの選定が重要です。エレコマは、Ruby on Railsが利用できる開発ベンダーであれば、カスタマイズは可能です。KBMJもその開発ベンダーの中の一つでECサイトの構築やSNSパッケージ(コミュニティーサイト構築パッケージ)を合わせたソーシャルコマースの構築まで承ります。

◆多店舗対応機能とは

ECサイトの中に複数の店舗を登録でき、管理画面から各店舗が受注、商品、顧客などの情報を管理する機能です。

◆関連URL

MITライセンスのECパッケージ『エレコマ』 http://ec.kbmj.com

SEO外部対策への見直しが始まった今こそ、『SEO内部対策サービス』http://seo.kbmj.com/

構築前後のサイトの評価、課題点の洗い出しに『アクセス解析コンサルティングサービス』 http://ga.kbmj.com/

販売戦略に合わせた検索結果の最適化が行える『Advantage Search』  http://search.kbmj.com/

◆本件に関するお問合せ

株式会社ケイビーエムジェイ ITコンサルティング部

青木・鈴木

〒150-0021 東京都渋谷区恵比寿西2-20-3 代官山CAビル1F

TEL:03-6696-1207 FAX:03-6696-1245 Email:info@kbmj.com

rails の action_cache (アクションキャッシュ)を使う、その二。

0

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

M.T. です。だいぶ開いてしまいましたが、
rails の action_cache について、続きを書きます。
前回のエントリはこちら

action_cache の仕組み

前回のエントリでは rails 組み込みのキャッシュ機能についてざっと書きました。
今回は、その中から action_cache に的を絞って書いてみます。

実際に、コードを例にして見てみましょう。

# コードはこんな感じ
SampleController < ApplicationController
  caches_action :index

  def index
    @sample = Sample.find(:all)
  end
end

サンプルモデルから全件を取得して表示するだけのコントローラです。
action_cache の宣言は、cache_action :メソッド名で、指定されたメソッドが対象となります。
引数にメソッド名を指定しない場合、クラス内の全 public メソッドが対象となります。

おさらいすると、action_cache は around_filter として実装されているため、
上記のコードは、以下のような挙動になります。

キャッシュがなかった場合

  1. キャッシュの存在チェック
  2. index アクションを実行
  3. キャッシュの生成

キャッシュがあった場合

  1. キャッシュの存在チェック
  2. キャッシュを表示

注目したいのは、キャッシュがあった場合の処理です。
action_cache では、キャッシュがあった場合、キャッシュを生成するためのafter フィルタを実行しません。
もっと言うと、action_cache の before フィルタより順番が後になっている、
そのとき設定されているすべてのフィルタの実行を行いません。

以下のようなコードがあるとします。

# コードはこんな感じ
# jpmobile はインストール済みで使えるようになっていると仮定
SampleController < ApplicationController
  caches_action :index
  before_filter :mobile_required

  def index
    @sample = Sample.find(:all)
  end

  private
  def mobile_required
    unless request.mobile?
      raise "pc access"
    end
  end
end

携帯からのアクセスでなかった場合、例外が発生するコード…のように見えますが、 実際には以下のような挙動になります。

キャッシュがなかった場合、携帯からアクセス

  1. キャッシュの存在チェック
  2. index アクションを実行
  3. キャッシュの生成

キャッシュがあった場合、PCからアクセス

  1. キャッシュの存在チェック
  2. キャッシュを表示

上記のように、先に携帯でキャッシュができていた場合、action_cache の before より 後に設定されている before_filter で呼ばれる mobile_required メソッドは実行されません。

before_filter :mobile_required
caches_action :index

上記のように、順番が逆になっていれば、先に mobile_required メソッドが実行され、
キャッシュがあろうとなかろうと、PC ではアクセスができなくなります。

jpmobile を利用して携帯に対応している場合かつ action_cache を使う場合、
jpmobile も around_filter で様々な処理を行っているため、このあたりの順番が
重要になってきます。

実際に組み合わせて使う方法は、また次回ということで…
だらだらと長いエントリーですが、よかったらお付き合いくださいー。

最近人気な記事