Memcached-introduction

【Memcached導入に関するメモ】2012/07/11(水)~


■memcached導入

memcached導入方法
1
$ sudo aptitude install memcached

memcachedインストール時にlibevent-1.4-2(非同期イベント通知ライブラリ)もインストールされる模様

memcached起動方法
1
$ memcached -u memcached -d
memcachedの主なオプション

・-m <キャッシュメモリ容量> デフォルトは64(単位はMB)

・-l <待ち受けネットワークインタフェース> デフォルトはINDRR_ANY

・-p ポート番号、規定値は11211

・-u <デーモン実行ユーザ> rootでデーモンを起動する際にデーモン実行ユーザを指定する

例) キャッシュ = 1GB、接続許可ホスト = ローカルホスト

1
$ memcached -u memcached -d -m 1024 -l 127.0.0.1

memcachedデーモンの起動を確認 $ ps aux | grep “memcached”

1
2
nobody 14955  0.0  0.3  62700  1224 ?     Sl 10:28 0:00 /usr/bin/memcached -m 64 -p 11211 -u nobody -l 127.0.0.1
1000   15156  0.0  0.2   7112   836 pts/0 D+ 10:50 0:00 grep memcached
memcached動作確認

まずtelnetにてmemcachedへ接続

1
$ telnet localhost 11211

memcachedへ接続後、statsコマンド他で動作確認を行う 動作確認後、quitコマンドで接続を切断する

その他:memcachedのバージョンとヘルプを表示

1
$ memcached -h
値の格納と取得

setコマンドとgetコマンドにて値の格納と取得を行う まずsetコマンドは以下のフォーマットで指定する

<コマンド> <キー> <圧縮フラグ(1 or 0)> <有効期間(単位:秒)> <サイズ(単位:Bytes)>

例) 「foo」というキーに「123」という3バイトのデータを非圧縮(0)/無期限(0)で格納する。またそれを取り出す。

1
2
3
4
5
6
7
8
9
10
11
12
set foo 0 0 3
123

=> STORED

get foo

=> VALUE foo 0 3
=> 123
=> END

quit
その他の操作

stats items :キャシュされているレコード情報を取得
stats cachedump :キャッシュ内容ダンプ

例)

1
2
3
4
5
6
7
8
9
10
11
12
$ telnet localhost 11211
stats items
STAT items:1:number 6
STAT items:1:age 20505
STAT items:1:evicted 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0

 stats cachedump 1 100
ITEM foo [9 b; 1264464651 s]
ITEM bar [9 b; 1264464649 s]
memcached終了方法
1
$ sudo killall memcached

■dalli(memcachedクライアント)導入

dalli導入方法

Gemfileに「gem ‘dalli’」と一行追加し、bundle installを行う

■キャッシュストアに設定する方法

例としてproduction環境で使用する場合は、config/environments/production.rb に次の行を追加する

1
config.cache_store = :dalli_store

■セッションストアに設定する方法

config/initializers/session_store.rb に以下の行を追加

例)以下はセッション情報を二週間保持する例
注)Rails3のデフォルト設定では、ブラウザからのアクセスが切断された時点でセッションも破棄される

1
2
3
require 'action_dispatch/middleware/session/dalli_store'
Railsアプリ名::Application.config.session_store :dalli_store
Railsアプリ名::Application.config.session_options = {:cookie_only => false, :expire_after => 2.weeks}

■Railsコンソール上でのキャッシュ内容確認

キャッシュ設定内容確認

例)

1
2
> Rails.cache
 => #<ActiveSupport::Cache::DalliStore:0x00000001e4cf68 @options={:compress=>nil}, @raise_errors=false, @data=#<Dalli::Client:0x00000001e4ce28 @servers=["localhost:11211"], @options={:compress=>nil}, @ring=nil>>
Railsコンソール上でのsession_optionsの確認

例)

1
2
> Railsアプリ名::Application.config.session_options
 => { :cookie_only=>false , :memcache_server => [ 'localhost:11211']}
値の格納と取得

例)

1
2
3
4
5
6
> Rails.cache.write("test", {:message => 'Hello', :time => Time.now})
 => true
> Rails.cache.read("test")
 => {:message=>"Hello", :time=>2010-09-15 13:26:09 +0900}
> Rails.cache.clear
 => [true]

以上


参考サイト:
memcached導入手順
memcachedコマンド一覧
memcachedでキー一覧を取得したい時に
memcachedでパフォーマンス向上
Rails3からmemcachedを利用する
memcachedプロトコルCAS操作について
HerokuでMemcacheを使うには

Ruby on Rails 3.1 でセッションを memcached に保存する
Rails 3.2 で Dalli を Session Store として利用する際の session_options の罠
Rails3.x系でログイン状態を保持する方法
rails 3でmemcachedを利用する
Rails3系でセッション有効期限の設定
railsのクッキーとセッションについてまとめ

その他:
各種サーバ構成の速度ベンチマーク

Maintenance Postgresql

postgresqlのメンテナンス用クエリ

データベースサイズチェック方法

select pg_size_pretty(pg_database_size(‘database_name’));

テーブルサイズチェック方法

select pg_size_pretty(pg_relation_size(‘table_name’));

About-heroku

Heroku 利用手順 (2012/04/20~)

https://addons.heroku.com/
http://mealslog.heroku.com/

・heroku上でアプリを新規作成する rails3以降のアプリは cedar stack 上で稼働させること

1
$ heroku create mealslog --stack cedar

初回はherokuのIDとパスワードを要求される

1
2
3
4
5
6
7
8
9
10
Enter your Heroku credentials.
Email: yuufjt@da2.so-net.ne.jp
Password (typing will be hidden):
Could not find an existing public key.
Would you like to generate one? [Yn] Y
Generating new SSH public key.
Uploading SSH public key /home/philippos/.ssh/id_rsa.pub
Creating mealslog... done, stack is bamboo-mri-1.9.2
http://mealslog.heroku.com/ | git@heroku.com:mealslog.git
Git remote heroku added

・ローカルリポジトリをherokuへプッシュ

1
$ git push heroku master

・heroku上でマイグレーション

1
$ heroku run rake db:migrate

・動作確認

1
$ heroku open

・アプリ情報参照

1
$ heroku info
1
2
3
4
5
6
7
8
Addons:        Shared Database 5MB
Domain Name:   mealslog.herokuapp.com
Git URL:       git@heroku.com:mealslog.git
Owner:         yuufjt@da2.so-net.ne.jp
Repo Size:     11M
Slug Size:     26M
Stack:         cedar
Web URL:       http://mealslog.herokuapp.com/

・heroku上でshellを起動する

1
$ heroku run bash

・heroku上でcronタスクを実行する

1
$ heroku run rake cron

・heroku にrails dbconsole したのと同じ状態で接続

1
2
3
4
5
$ heroku update

$ heroku plugins:install git://github.com/ddollar/heroku-sql-console.git

$ heroku sql --app APPLICATION_NAME

・タイムゾーン設定

1
$ heroku config:add TZ=Asia/Tokyo

○Heroku上のDBのバックアップを取る

まずは準備 Heroku上のDBのバックアップを取るには、tapsとsqlite3が必要

1
2
3
4
5
6
7
$ gem install taps

$ sudo aptitude install sqlite3

$ sudo aptitude install libsqlite3-dev

$ gem install sqlite3

準備ここまで Heroku上のDBをローカルDBへコピーする 規定値でdevelopment環境へコピーする

1
$ heroku db:pull

参考サイト:
http://d.hatena.ne.jp/xyk/20101102

About-cancan

認証用GEM cancan 導入手順 (2012/04/20~)

1. Gemfileに以下を追加しbundle installする

1
gem 'cancan'

2. Abilityクラスの生成を行う

1
$ rails g cancan:ability

3. User(ここでは管理者)モデルへroleカラムを追加する

1
$ rails g migration AddRoleToUser role:string

4. app/models/users.rbにroleの記述を追加

例)

1
2
3
4
(省略)
attr_accessible :role
ROLES = %w[admin member]
(省略)

5. app/models/ability.rbの関数initializeを編集(ここで権限内容を制御する)

例)

1
2
3
4
5
6
7
8
9
10
(省略)
def initialize(user)
  user ||= User.new # guest user (not logged in)
  if user.role == "admin"
    can :manage, :all
  else
    can :read, :all
  end
end
(省略)

6. 管理者権限スコープ(role)の編集(管理者追加/編集時)

画面にセレクタコントロールを追加する

app/views/devise/registrations/new.html.rbと
app/views/devise/registrations/edit.html.rbに以下を追加

1
2
3
4
(省略)
<%= f.label :role %>
<%= f.collection_select :role, User::ROLES, :to_s, :humanize%>
(省略)

7. app/views/hoges/index.html.erbを編集(ここではadminだけにEditを表示させる)

‘Admin’でのユーザ登録者のみが「Edit」できるようにする
その他のユーザは「Edit」できない

1
2
3
<% if can? :manage, hoge %>
<%= link_to 'Edit', edit_hoge_path(hoge) %>
<% end %>

8. 管理者権限による制限を付与するコントローラに以下のフィルタを追加する

1
2
3
4
5
class TaskController < ApplicationController
  (略)
  load_and_authorize_resource
  (略)
end

参考サイト:
http://d.hatena.ne.jp/dimros/20110326/1301145073 http://blog.livedoor.jp/nizoraul/archives/3711303.html http://yorunocafe.blogspot.jp/2011/08/rails-cancan.html

About-device

認証用GEM devise 導入手順 (2012/04/20~)

Gemfileに以下を追加しbundle installする

1
gem 'devise'

プロジェクトにdeviseをインストールする

1
2
3
4
5
$ rails g devise:install            # Deviseをアプリに組み込み
$ rails g controller welcome index  # トップページを作成
$ rails g devise:views              # Viewを生成
$ rails g devise user               # Userモデルを生成
$ rake db:migrate                   # マイグレーションを実行

1. メールの設定

config/environments/development.rb

例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Hoge::Application.configure do
  (省略)
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address:              "smtp.gmail.com",
    port:                 587,
    domain:               "domain.of.sender.net"$
    authentication:       "plain",
    user_name:            "XXXXX@gmail.com",
    password:             "XXXXXXXX",
    enable_starttls_auto: true
  }
end

2. ルーティングの設定

config/routes.rbが以下のように設定されているか確認すること
deviseは認証後、rootページへ自動的にリダイレクトする

例)

1
2
3
4
5
6
7
8
9
10
Todo::Application.routes.draw do
  (省略)
  devise_for :users    # ユーザ登録/認証
  get "welcome/index"  # トップページ

  # You can have the root of your site routed with "root"
  # just remember to delete public/index.html.
  root :to => "welcome#index"  # root設定
  (省略)
end

3. Viewの修正

app/views/layouts/application.html.erb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<body>
  <!-- ここから2行追加 -->
  <p class="notice"><%= notice %></p>
  <p class="alert"><%= alert %></p>
  <%= yield %>
</body>
app/views/welcome/index.html.erb

<h1>Hogeへようこそ</h1>
<% if current_user %>
  <span><%= link_to 'ログアウト', destroy_user_session_path, :method=>'delete' %></span>
<% else %>
  <span><%= link_to 'ログイン', new_user_session_path %></span>
  <span><%= link_to 'ユーザー登録', new_user_registration_path %></span>
  <span><%= link_to 'パスワード再発行', new_user_password_path %></span>
<% end %>

4. Controllerの修正

※ 認証機能をコントローラに追加する場合は、以下のようにフィルタを設ける
認証済みではない場合はログイン画面へリダイレクトされるようになる

1
2
3
4
5
class HogeController < ApplicationController
  before_filter :authenticate_user!
  ...

end

※その他:
ユーザ登録(sign up)を禁止するには、モデルUserのregistableをコメントアウトする

1
2
3
4
5
6
class User < ActiveRecord::Base
  (略)
  devise :database_authenticatable, #:registerable,
      :recoverable, :rememberable, :trackable, :validatable
  (略)
end

参考:
* Autheticatable : パスワードを暗号化したりログイン時にユーザーを認証したりする
* Confirmable : アカウントをログインするかどうか確認したり、確認方法をメールで送ったりする
* Recoverable : ユーザーのパスワードを初期化したり、初期化方法をメールで送ったりする
* Remenberable : 保存したクッキーを使ってユーザー認証する際のトークンを生成したり削除したりする
* Validatable : メールでvalidationの必要なこと全てやパスワードを生成し、また任意でvalidation方法を変更することができる

またroot的管理者が別の管理者を追加する場合は、user_controller を作成し、個別に new, create, show などを記述する

※日本語化について→今後記述予定(2012/07/20)

参考サイト:
http://kitbc.s41.xrea.com/main/?use_devise
http://myruby.seesaa.net/article/221534274.html
http://t-taira.hatenablog.com/entry/20110101/1293843821
http://d.hatena.ne.jp/dimros/20110326/1301145073
http://d.hatena.ne.jp/babie/20100729/1280381392
http://d.hatena.ne.jp/hrendoh/20110906/1315282969
http://d.hatena.ne.jp/akihito_s/20110708
http://d.hatena.ne.jp/watanabe162/20110729/1311928889
http://d.hatena.ne.jp/watanabe162/20110731/1312112812
http://d.hatena.ne.jp/watanabe162/20110731/1312119021
http://eitoball.blogspot.jp/2009/11/devise-rails.html
http://blog.livedoor.jp/nizoraul/archives/3597234.html

About-rails3-act-as-paranoid

データ論理削除用GEM rails3_act_as_paranoid 導入手順

Gemfileに以下を追加しbundle installする

1
gem 'rails3_acts_as_paranoid'

論理削除対象モデルにカラム deleted_at:timestamp を予め設けておく

1
$ rails g migration AddDaletedAtToUser deleted_at:timestamp

論理削除対象モデルにacts_as_paranoidを定義

1
2
3
4
5
class User < ActiveRecord::Base
  acts_as_paranoid

  ……
end

※子モデルも同時に論理削除対象とする場合、以下のようにすること

1
2
$ rails g migration AddDeletedAtToUser deleted_at:timestamp
$ rails g migration AddDeletedAtToTask deleted_at:timestamp
1
2
3
4
class User < ActiveRecord::Base
  acts_as_paranoid
  has_many :task, :dependent => :destroy
end
1
2
3
4
class Task < ActiveRecord::Base
  acts_as_paranoid
  belongs_to :user
end

その他

・論理削除されたレコードを取得する

User.only_deleted

・通常レコードと論理削除されたレコードをまとめて取得する

User.with_deleted

・論理削除からの復帰

User.only_deleted.find(2).recover

まとめて復帰するなら

User.only_deleted.each &:recover

なお、親子関係にあるモデル間において親モデルが論理削除から復帰すると、自動的に小モデルも論理削除から復帰する

参考サイト:
http://d.hatena.ne.jp/choripon/20101229/1293634455
http://doruby.kbmj.com/rick_blog/20090416/Ruby_On_Rails__acts_as_paranoid

About-twitter-bootstrap

フロントエンドツール twitter bootstrap

Gemfileに以下を追加しbundle installする

1
gem "twitter-bootstrap-rails"

railsプロジェクトにbootstrapをインストールする

1
$ rails g bootstrap:install

次にレイアウトファイルを作成する 固定(Fixed)レイアウトまたは可変(Fluid)レイアウトが選択可能

例)

1
$ rails g bootstrap:layout application fluid

※このときapplication.html.erbが残っていた場合は削除すること

1
$ rm app/views/layouts/application.html.erb

※メモ bootstrapとwill_paginateを併用すると、ページネイトのレイアウトが崩れる が、viewページにおいて以下のようにクラスを明示的に指定することでそれを回避可能である

例)

1
= will_paginate @users, :class => 'pagi'

ページネイションがKaminariの場合、以下のコードを git clone してアプリのビューに配置する

https://github.com/gabetax/twitter-bootstrap-kaminari-views

参考サイト:
http://bootswatch.com/
http://kachibito.net/web-service/stylebootstrap.html
http://blog.asial.co.jp/887
http://mrk1869.sakura.ne.jp/?p=468
http://kachibito.net/web-service/stylebootstrap.html
http://d.hatena.ne.jp/replication/20120226/1330224012
http://d.hatena.ne.jp/end0tknr/20111016/1318732238
http://d.hatena.ne.jp/akynd_knight/20120714/1342227600
http://ppworks.hatenablog.jp/entry/2012/02/19/033644
http://coliss.com/articles/freebies/resources-that-complement-twitter-bootstrap-by-webresourcesdepot.html

Rails3-introduction

【Rails3開発スタートアップ】


Ryby1.9 においてコード中で日本語を扱う場合は、ファイルの先頭に以下のマジックコードを付加すること

1
# encoding: utf-8

$HOME以下にrailsアプリを作成(DB指定を忘れないこと)

1
$ rails new demo -d mysql

コントローラ生成

1
$ rails g controller <コントローラ名> <アクション名>

rails環境下でのスクリプト実行(コマンドラインからモデルを使用した処理を実行可能)

1
$ rails runner <スクリプト名>

モデル生成

1
$ rails g model <モデル名> <カラム名:型> <オプション>

scaffold作成例

1
2
3
4
$ rake db:create
$ rails g scaffold user name:string age:integer
$ rake db:migrate
$ rails server

モデルへカラム追加

1
$ rails g migration AddColnameToTablename colname:string

DB操作

DB削除、DB作成、テーブル作成、初期値挿入

1
2
3
4
$ rake db:drop
$ rake db:create
$ rake db:migrate
$ rake db:seed
ヒント

・レコードの内容を操作する必要があるとき、マイグレーションの内部でレコードの操作を行うことが有用な場合がある  その場合、マイグレーションをロールバックしてもデータに誤謬が生じないようロールバックさせるようにすること


Gemfile

必須コンポネント

他にもあるが、別稿に譲る

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gem 'pg'                        # postgresql用アダプタ
gem 'therubyracer'              # JavaScript
gem 'will_paginate', '~> 3.0'   # will_paginate(バージョンに注意)
gem 'bcrypt-ruby'               # ハッシュ生成用
gem 'rspec-rails'               # rspec
gem "thin"                      # 開発用WebServer

# for pry
source 'http://rubygems.org'
group :development do
  gem 'pry-rails'
  # gem 'pry-coolline', :git => 'git://github.com/pry/pry-coolline.git'
  gem 'pry-nav'
  gem 'pry-exception_explorer'
  gem 'hirb-unicode'
end

.pryrc

プロジェクトディレクトリ直下に設置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# https://github.com/pry/pry/wiki/FAQ#wiki-hirb$
require 'hirb'$
$
Hirb.enable$
$
old_print = Pry.config.print$
Pry.config.print = proc do |output, value|$
  Hirb::View.view_or_page_output(value) || old_print.call(output, value)$
end$
$
Pry.commands.alias_command 'c', 'continue'$
Pry.commands.alias_command 's', 'step'$
Pry.commands.alias_command 'n', 'next'$
Pry.commands.alias_command 'f', 'finish'$

参考:
https://github.com/nixme/pry-debugger


rspec導入/テスト雛形作成

・railsへのrspecのインストールと雛形を作成。

1
$ rails generate rspec:install

・既に作成済みのコントローラのテストの雛形を作成(アクションは複数追加可)

1
$ rails generate rspec:controller <コントローラ名> <アクション名> <アクション名> ......

gitリポジトリ作成

以下はプロジェクトディレクトリに移動して行うこと。

・レポジトリ初期化

1
$ git init

・ファイルを全て追加

1
$ git add .

・変更ファイルを確認

1
$ git status

・コミット

1
$ git commit -m 'first commit'

・履歴を確認

1
$ git log

rakeファイル

rakeタスクでActiveRecordを使うには、「task :taskname => :environment」が必要

rakeファイル中で以下のように記述する

1
2
3
4
5
namespace :hoge do
  task :setup => :environment do
    p User.count
  end
end

その他

状態表示
1
$ rake stats

ルート表示

1
$ rake routes

コントローラで絞り込む場合

1
$ rake routes CONTROLLER=<コントローラ名>

例)

1
$ rake routes CONTROLLER=users

session情報をDBで管理する方法

まずRDBに対してマイグレーションを行う

1
2
$ rake db:sessions:create
$ rake db:migrate

次に config/initializers/session_store.rb 3行目をコメントに変更する

1
#<プロジェクト名>::Application.config.session_store :cookie_store, :key => '_market_session' 

さらに8行目のコメントを外す

1
<プロジェクト名>::Application.config.session_store :active_record_store

また以下を行うことでRDB上のセッション情報を全削除できる

1
$ rake db:sessions:clear

Rakeタスクでプリコンパイル済みのアセットを作成する

1
$ rake assets:precompile RAILS_ENV=production