スポンサーサイト

  • 2015.09.25 Friday

一定期間更新がないため広告を表示しています

  • -
  • -
  • -
  • スポンサードリンク

Capitrano 、Github 、etc.. 最近、お世話になった(勉強になった)リンク集

  • 2012.09.28 Friday
  • 01:17
最近、Web開発ブームにまたなってきて。ようやく「継続的開発&リリース環境」構築の重要性を理解できてきたので。。というか、理解させられた。というか。ようやく、Capistrano とか、Github とか、うまく使って「安心して、公開中のサービスの中に、次の機能開発を行う」準備ができつつあります。参考になったリンクを列挙します。ありがとうございました。


▼ Capistrano 関連
・自分が実践したチュートリアル
http://takemikami.com/technote/archives/646

・一般的チュートリアル
http://d.hatena.ne.jp/dkfj/20120228/1330434467
http://kitbc.s41.xrea.com/main/?try_capistrano

・Githubとの連携
http://www.oiax.jp/rails3book/prepare_capistrano2.html
http://blog.new-bamboo.co.uk/2008/3/12/github-with-capistrano

・さくらサーバとの連携
http://d.hatena.ne.jp/ntaku/20111115/1321358900

・Passengerとの連携
http://www.aaginskiy.com/technology/2011/02/deploying-rails-3-apps-with-capistrano/

・tmp public に保存している、画像やpkgファイルの保存場所設定、およびシンボリックリンク設定
http://www.slideshare.net/T2J/capistrano-tips-tips

・Delayed_job の対応
http://blog.digital-squad.net/article/244451741.html
https://github.com/collectiveidea/delayed_job/wiki/Rails-3-and-Capistrano
 ・Delayed_job: http://blog.nzm-o.com/item/222


▼ Git のことはじめ
・一般的情報
http://d.hatena.ne.jp/ryousanngata/20120119/1326906033
http://soohei.net/vpsgit-1/

・ローカルレポジトリからのデプロイ
http://blog.yabasoft.biz/archives/3592


▼ そのほか
・Rails から、Gmail 経由でメールを送る
http://bookmeter.que.jp/hakkyo/?date=20110830

・SQLのコラム(未読)
http://d.hatena.ne.jp/koseki2/20100915/HellSQL

・TODO(RedmineとGithubとの連携:うまくいかない・・・)
https://github.com/koppen/redmine_github_hook



以上。


つぎはたぶん、テスト環境とか。。勉強するハメになるんだろうな。orz..

結局、Rails 3.2 で 大量のデータを検索する場合、Sunspot な Solr が一番 いい感じ。という面白くないオチ。

  • 2012.06.10 Sunday
  • 17:16
前回のエントリーで、Elasticsearch を、 tire で実装してみて。日本語の扱いがイケてない。という事実に直面し。。もちろん、Geekなあなたなら、なんとかしちゃうのかもしれませんが、エセ Geek な私は、そそくさと別の道を探ってみたわけです。

で、やっぱり落ち着いたのは Rails 3.2 + Sunspot + Solr 。Solr は、デフォルトの設定で普通に日本語扱えます。前回 Elasticsearch で出会ったように「中日」と検索して「中村」が引っかかることはありません。普通に、何不自由なく、MySQLで like 検索するように、日本語を扱えます。

Railsとの連携について。Sunspot の他にも選択肢があるみたいだけど。Google先生で質問しやすいのは、 Sunspot。とは言っても、英語でないと初心者向けの質問&回答は見つからないけど。。





以下、Rails 3.2 にて、インストールから実装(development 環境)まで参考にした情報。っていうか、Github 内の、オフィシャルドキュメント。 → Quickstart with Rails 3

1) Gemfile に、以下記載
gem 'sunspot_rails'
gem 'sunspot_solr' # development環境で使う、Solr のパッケージ。インストール推奨!
※ もし、Java が入ってない環境なら、先にインストールが必要だと思います。詳しくは、前回の Elasticsearch のエントリーを参照してください。

2) バンドルインストール
bundle install


3) デフォルトのコンフィグファイルを生成する
rails generate sunspot_rails:install


4)「1」にてインストールした Solr を起動する
bundle exec rake sunspot:solr:start # バックグラウンドでなくフォアグラウンドで起動するには「 sunspot:solr:run 」


5) model オブジェクトを、index に追加するための「searchable」ブロックを指定(以下、設定例)。
class Post < ActiveRecord::Base
 searchable do
  text :title, :body
  text :comments do
   comments.map { |comment| comment.body }
  end

  boolean :featured
  integer :blog_id
  integer :author_id
  integer :category_ids, :multiple => true
  double :average_rating
  time :published_at
  time :expired_at

  string :sort_title do
   title.downcase.gsub(/^(an?|the)/, '')
  end
 end
end

※「text」で指定したフィールドは、全文検索対象になります。controller ファイル内で「with」や「facet」で絞込み的にテキストを扱いたい場合は「string」で設定する必要があります。
※ Sunspot で扱えるクラスは、APIドキュメントのType項にて説明されています。ページ中央の「Defined Under Namespace」のところに書いてあります。

6) コントローラの指定(例)。
Post.search do
 fulltext 'best pizza'

 with :blog_id, 1
 with(:published_at).less_than Time.now
 order_by :published_at, :desc
 paginate :page => 2, :per_page => 15
 facet :category_ids, :author_id
end


7) 全文検索の、細かな設定(例)。
# 'pizza' を含む、すべての`text`フィールド (:title, :body, or :comments) のposts が対象
Post.search { fulltext 'pizza' }

# 'pizza' を含むpostsで、特に title 内で見つかったらスコアを上げる(優先させる)
Post.search do
 fulltext 'pizza' do
  boost_fields :title => 2.0
 end
end

# ':featured'(上記「5」のモデルファイル内の「searchable」で設定している boolean 値)が true の posts の場合、スコアを上げる(優先させる)
Post.search do
 fulltext 'pizza' do
  boost(2.0) { with(:featured, true) }
 end
end

# :title に'pizza' が含まれる posts だけを対象にする
Post.search do
 fulltext 'pizza' do
  fields(:title)
 end
end

# :title に pizza が含まれる posts をスコアを上げる(優先させる)。:body に含まれる場合は、スコアを上げない。
Post.search do
 fulltext 'pizza' do
  fields(:body, :title => 2.0)
 end
end



7-1) 全文検索での、フレーズ(Phrases)について。Solr は、近くに並んだ(close together な)単語を「フレーズ」として検索可能にする。Sunspotが使う、デフォルトのquery parser (dismax)では、フレーズ検索は、「" (ダブルクウォート)」で囲むことで有効となる。(→参考
# "great pizza" というフレーズを含んだ posts を検索する
Post.search do
 fulltext '"great pizza"'
end


7-2) 全文検索で、「 query_phrase_slop 」を使えば、フレーズ内の単語と単語の間に割り込める(入ってよい)単語を指定できる。
# フレーズ内の単語の間に、1単語のみ割り込み可能。つまり"great big pizza" も、検索対象となる。
Post.search do
 fulltext '"great pizza"' do
  query_phrase_slop 1
 end
end



7-3) 全文検索で、接近した単語のスコアを上げる。その単語は、必ずしもフレーズの中にある必要はないが、フレーズの中にあった方が、よりスコアは高くなる。
# 「great」と「pizza」を含んだドキュメントにマッチする。もし :title フィールド内のフレーズに、その単語が含まれれば、そのドキュメントのスコアは、より高くなる。
Post.search do
 fulltext 'great pizza' do
  phrase_fields :title => 2.0
 end
end

# 「great」と「pizza」を含んだドキュメントにマッチする。:title フィールドの中のフレーズ(あいだに1単語挟んでもOK)にその単語が含まれれば、そのドキュメントのスコアは、より高くなる。
Post.search do
 fulltext 'great pizza' do
  phrase_fields :title => 2.0
  phrase_slop 1
 end
end



8) スコープ (Scalar フィールド)について。全文検索の対象となる「text」以外(例:integer / boolean / time / etc...)の型は、検索クエリの範囲を指定したり、制限したりするのに使われる。ちなみに、全文検索よりも先に実行される。
# blog_id が 1 となる posts
Post.search do
 with(:blog_id, 1)
end

# 平均値が、3.0 〜 5.0 の posts
Post.search do
with(:average_rating, 3.0..5.0)
end

# category_id が、「1」「 3」「 5」のどれかにマッチする posts
Post.search do
with(:category_ids, [1, 3, 5])
end

# 1週間前にパブリッシュされた、posts
Post.search do
with(:published_at).greater_than(1.week.ago)
end


8-1) 「〜を含まない」というタイプのスコープ
# category_id が、 1 でも 3 でもないカテゴリー
Post.search do
 without(:category_ids, [1, 3])
end

# 「8)」のサンプルは、すべて「without」を使って「〜以外」とすることが可能。


8-2) 「Disjunctions」と「Conjunctions」(→参考
# 有効期限(expired)のない posts。もしく(OR)は、有効期限前の posts
Post.search do
 any_of do
  with(:expired_at).greater_than(Time.now)
  with(:expired_at, nil)
 end
end

# blog_id が「1 」で(AND)、author_idが「2」の posts
Post.search do
 all_of do
  with(:blog_id, 1)
  with(:author_id, 2)
 end
end


Disjunctions と conjunctions は、組み合わせも可能
Post.search do
 any_of do
  with(:blog_id, 1)
  all_of do
   with(:blog_id, 2)
   with(:category_ids, 3)
  end
 end
end


8-3) 全文検索の結果を含んだオブジェクトに対し、スコープによって範囲指定/制限をすることが可能
# blog_idが「1」で(AND)、 'pizza' を :title に含む posts
Post.search do
 with(:blog_id, 1)
 fulltext("pizza")
end



9) ページネーション( Pagination )について。Solr の検索結果は、すべてページ分割されている。検索結果の配列は、will_paginate や kaminari のようなページネーションライブラリと、シームレスに連動することができるメソッドを mixed in している。Sunspot はデフォルトで、Solr の検索結果の、最初の30件をリクエストする。
search = Post.search do
 fulltext "pizza"
end

# 全60件の検索結果があるとして。30件/1ページだとすると、全2ページとなる
results = search.results  # => Array with 30 Post elements

search.total  # => 60

results.total_pages  # => 2
results.first_page?  # => true
results.last_page?  # => false
results.previous_page  # => nil
results.next_page  # => 2
results.out_of_bounds?  # => false
results.offset  # => 0



次の結果のページを取得するため、検索(search)再度行い、paginate メソッドを使う。
search = Post.search do
 fulltext "pizza"
 paginate :page => 2
end

# 全60件あるとして。今回は 2ページ目が対象だ
results = search.results # => Array with 30 Post elements

search.total  # => 60

results.total_pages  # => 2
results.first_page?  # => false
results.last_page?  # => true
results.previous_page  # => 1
results.next_page  # => nil
results.out_of_bounds?  # => false
results.offset  # => 30


「 paginate: 」に「 :per_page 」オプションをつけると、結果ページ内の表示件数をカスタマイズできる
search = Post.search do
 fulltext "pizza"
 paginate :page => 1, :per_page => 50
end



10) ファセット(Faceting)とは、検索条件や絞り込み条件にマッチしたドキュメントの数を限定するための、Solr の機能だ。ドリルダウン型の検索インターフェイスを作る際などに使える。各 facet は、0 以上の row を返す。各 row は、検索結果 を絞り込む条件となる。
「 field facets 」の場合、各 row は、対象フィールド の特定の値 を 表す。「 query facets 」の場合、各 row は、不特定のスコープ を表す。実のところ、 facet とは、スコープの論理的グループにすぎない。

10-1) Field Facets
# 'pizza' にマッチした posts を、:author_id ごとにカウントして返す
search = Post.search do
 fulltext "pizza"
 facet :author_id
end

search.facet(:author_id).rows.each do |facet|
 puts "Author #{facet.value} has #{facet.count} pizza posts!"
end


10-2) Query Facets
# 平均値を、ファセットにより範囲指定した posts (のグループ)
Post.search do
 facet(:average_rating) do
  row(1.0..2.0) do
   with(:average_rating, 1.0..2.0)
  end
  row(2.0..3.0) do
   with(:average_rating, 2.0..3.0)
  end
  row(3.0..4.0) do
   with(:average_rating, 3.0..4.0)
  end
  row(4.0..5.0) do
   with(:average_rating, 4.0..5.0)
  end
 end
end

# 例)
# 平均値が、1.0 〜 2.0 のposts : 2件
# 平均値が、2.0 〜 3.0 のposts : 1件
search.facet(:average_rating).rows.each do |facet|
 puts "Number of posts with rating withing #{facet.value}: #{facet.count}"
end



11) 表示順( Ordering )について。標準では、Sunspot は "score" に基づいた表示順となる。ちなみに "score" とは、Solr 判断による、相対的な基準だ。ソートは「order_by」メソッドを使って実現する。
# 平均値(降順 - descending - )でソート
Post.search do
 fulltext("pizza")
 order_by(:average_rating, :desc)
end

# :score の相関によってソートする。相関が同点の場合、平均値(:average_rating)が高いものを上にする。
Post.search do
 fulltext("pizza")

 order_by(:score, :desc)
 order_by(:average_rating, :desc)
end

# Randomized ordering
Post.search do
 fulltext("pizza")
 order_by(:random)
end



12) Geospatial
TODO


13) 結果のハイライト( Highlighting )について。ドキュメント内の、検索クエリにマッチした部分を強調表示することができる。ハイライトしたいフィールドは「 :store 」する必要がある。
class Post < ActiveRecord::Base
 searchable do
  # ...
  text :body, :stored => true
 end
end


例えば、 :body フィールドにマッチした場合に、ハイライトするには。
search = Post.search do
 fulltext "pizza" do
  highlight :body
 end
end

# ハイライトのされ方は、こんな感じ;
# Post #1
# 私は、本当に *pizza* が大好きだ。
# *Pizza* は、私の好物だ
# Post #2
# ペペロニ *pizza* って、おいしいなあ。
search.hits.each do |hit|
 puts "Post ##{hit.primary_key}"

 hit.highlights(:body).each do |highlight|
  puts " " + highlight.format { |word| "*#{word}*" }
 end
end



14) Functions
TODO

15) More Like This
TODO


16) インデックスの、細かい点。
あとでやる。

16-1) スコアを上げるのは、インデックスの時に!( Index-Time Boosts )
どんなクエリの時にも、スコアを上げたいフィールドは、インデックスの時に :boost 設定をしよう
class Post < ActiveRecord::Base
 searchable do
  text :title, :boost => 5.0
  text :body
 end
end



17) Stored Fields について。 :stored したフィールドは;
・ Solr の内部でも 元のまま(tokenized されてない/ analyzed されてない)の値を保つ
・ 元となる Database(通常はSQL)を参照することなく、データを取得することができる。ハイライトするのにも使われる。
class Post < ActiveRecord::Base
 searchable do
  text :body, :stored => true
 end
end

# Database を参照することなく、:stored されたコンテンツを取得する
Post.search.hits.each do |hit|
 puts hit.stored(:body)
end



18) 「 #hits 」と「 #results 」
Sunspot はオブジェクトの型や Primary Key を Solr に保存する。検索結果を取得する際、Primary Key は、実際のオブジェクト(通常は、SQL の Database)をロードするために使われる。
#「 #results 」 を使って、オブジェクト・リレーショナル・マッパー(以下、ORM。 ORMの例としては、ActiveRecord + SQL のDatabase がある)から、該当レコードを取得する
Post.search.results.each do |result|
 puts result.body
end


元となるDatabase にクエリを投げずに、検索結果の情報にアクセスするには「 #hits 」を使う
# 「 #hits 」を使って、ORM からオブジェクトをロードすることなく、すべての情報を Solr から取得する
Post.search.hits.each do |hit|
 puts hit.stored(:body)
end


ORM からロードする「 #results 」と、ファセットやハイライトなど「 #hits 」の両方が必要な場合、「 each_with_result 」というコンビニメソッドが用意されている
Post.search.each_hit_with_result do |hit, result|
 # ...
end



19) 再インデックス( Reindexing Objects )について。Rails を使っていれば、 save のコールバックの一部として、オブジェクトは Solr に勝手に インデックスされる。ただし、「 searchable 」ブロック内のスキーマを変更した場合は、すべての オブジェクトの再インデックス( reindex )を行い、 Solr に変更を反映させる必要がある。
bundle exec rake sunspot:solr:reindex

# もしくは、特定のバッチサイズで、特定のモデルに対して再インデックスするなら
bundle exec rake sunspot:solr:reindex[500,Post]  # shell によっては、 [ with ¥[ and ] with ¥] をエスケープする必要がある



20) Use Without Rails
TODO


21) Solr のパラメータを、手動で設定するには、「 adjust_solr_params 」を使う
Post.search do
 adjust_solr_params do |params|
  params[:q] += " AND something_s:more"
 end
end



22) Session Proxies
TODO

23) Type Reference
TODO (→ 参照:APIドキュメントのType項


24) 開発について( Development )

24-1) 「 sunspot 」で、テストする。まず必要とされる gem をインストールする
cd /path/to/sunspot/sunspot
bundle install


Solr のインスタンスを、port 8983 で立ち上げる
bundle exec sunspot-solr start -p 8983
# フォアグラウンドでの実行は → `bundle exec sunspot-solr run -p 8983`


テストをはしらせる
bundle exec rake spec


必要があれば、Solr のインスタンスを止める
bundle exec sunspot-solr stop


24-2)「 sunspot_rails 」で、テストする。まず必要とされる gem をインストールする
cd /path/to/sunspot/sunspot
bundle install


Solr のインスタンスを、port 8983 で立ち上げる
bundle exec sunspot-solr start -p 8983
# フォアグラウンドでの実行は → `bundle exec sunspot-solr run -p 8983`


sunspot_rails のディレクトリに移動して
cd ../sunspot_rails


テストをはしらせる
rake spec # Rails の全バージョン
rake spec RAILS=3.1.1 # 特定バージョンの Rails だけ


必要があれば、Solr のインスタンスを止める
cd ../sunspot
bundle exec sunspot-solr stop




以上、Github 内の、オフィシャルドキュメント。 → Quickstart with Rails 3








ちなみに。ちょっと使ってて、便利だなあと思ったのは「 has_many :through 」とかのレベルまで Sunspot が理解してくれて、インデックスを作ってくれること。例えば、以下の様な感じ;
class Event < ActiveRecord::Base
 attr_accessible :xxxxxxx, :xxx, :xxxxx, :xxxxx, :xxxx, :xxxxxxx

 belongs_to :mother
 has_many :kids
 has_many :grandchildren, :through => :kids

 searchable do
  text :xxxx
  integer :xxxx
  string :xxxxxx

  string :xxxxxx, :multiple => true do  #子要素は、複数あるから、multiple
   kids.map(&:xxxxxx)
  end

  time :xxxxxxt, :trie => true, :multiple => true do
   grandchildren.map(&:xxxxxx)
  end
end

こんな感じで「has_many, :through」とかが設定されてれば、いきなり「grandchildren」とか出しても理解してくれるんです。






あと、こっちも参照。 →  Adding Sunspot search to Rails in 5 minutes or less

1) Gemfile 内に、以下記載
gem 'sunspot_rails', '~> 1.3.0'

2) バンドルインストール
$ bundle install

3) config/sunspot.yml を生成
$ rails g sunspot_rails:install

※ もし、Java が入ってない環境なら、先にインストールが必要だと思います。詳しくは、前回の Elasticsearch のエントリーを参照してください。

4) 現在の環境(おそらく development)で、solr を起動する
$ rake sunspot:solr:start

※ http://localhost:8982/solr/admin/ にて、Solr を操作することが可能。

5) model ファイルに、検索対象の記述を追加する(以下、例。)
class Post < ActiveRecord::Base
 searchable do
  text :title, :default_boost => 2
  text :body
 end
end


6) 検索用の index を作成する(※ ActiveRecord を使って保存されたデータについては、以後自動的に index に追加されるけど、初回なのでこれまでのデータを追加するために実行。)
$ rake sunspot:reindex


7) controller ファイルに、検索メソッドを追加する(以下、例。)
class PostsController < ApplicationController
 def search
  @search = Post.search(:include => [:comments]) do
   keywords(params[:q])
  end
 end
end


8) view ファイルに、検索部分を追加する(以下、Hamlでの例。)
.results
 - @search.each_hit_with_result do |hit, post|
  .result
   %h2= h post.title
   %h6== (#{h hit.score})
   %p= h truncate(post.body, :length => 100)
.pagination
 = will_paginate(@search.results)




以上、Adding Sunspot search to Rails in 5 minutes or less






あと。以下も参考になりました。

・『 Date range facets with Sunspot in Ruby on Rails 』
→ 日付を、ある範囲内で検索するような場合は、「 :trie => true 」を指定。「 time 」のみ対応( date では :trie を指定できない)。ちなみに、Database 上は、datetime を使ってると思いますが、その中に NULL( もしくは「0000-00-00 00:00:00」かも)があると「 $ rake sunspot:reindex 」した時に「 rake aborted! sunspot Error: Invalid Date String:'' 」みたいに出るから注意。日付の欄には、きちんと値を入れておく必要がある。みたい。
class Event
 searchable do
  time :start_time, :trie => true
 end
end

Event.search do
 facet :start_time do
  bod = Time.zone.now.beginning_of_day
  row :today do
   with :start_time, bod..(bod + 1)
  end
  row :tomorrow do
   with :start_time, (bod + 1)..(bod + 2)
  end
  # etc.
 end
end








あと。まだ詳しく診てないけど。 #hits を使った実例;
『Sunspot, Solr, Rails: Working with Results』






こちらも。実装のイメージを把握するのに、いい感じの実例;
『Full-text search in Rails with Sunspot』






こちらも、導入の参考にしました;
Railscast『 #278: Sunspotで全文検索 』






ちなみに Solr にはよさげな日本語の書籍があります。→『Apache Solr入門 ―オープンソース全文検索エンジン』。Rails関連の記述は古いですが、Solrについて理解を深めるには、良さ気な本だと思います。





・・・ぱーーーっと急いで書いたたので、誤字脱字。勘違いしてるぞ!などは、コメントくださいませ orz..
JUGEMテーマ:インターネット


Rails3.2 tire を使って、Elasticsearch を使うまでの道のり

  • 2012.05.28 Monday
  • 18:31
JUGEMテーマ:インターネット


ここのところ、すっかり検索エンジン放浪者になってしまいました。 今回Railsで作ったアプリで扱うDBが巨大なので、MySQLのqueryベースだと、もたもたして使えない。というのが出発点でした。

で、まず発見したのが「Think Sphinx」。なんか、センスがよくて、いいなーっと思って。実装までしてみたんですが。なんと、日本語苦手なんですね、この人。はじめは、ぜんぜん日本語扱えなくて。で「Sphinx Search in Japanese」を参考に設定したら、なんとか扱えるようにはなったのだけれど。検索精度が悪い。。コンフィグ設定でできる範囲でいじってみたのですが、やっぱりイケてない。 日本語扱えない以外は、かなり好きなタイプなんだけど。でも、だめみたい。 ちなみに、PDFのチュートリアル(有料)があるんだけど、それがすごく読みやすい。英語だけど。 日本語、もうちょっとちゃんと扱ってくれたらなあ・・・。

で、いろいろ検索してたら「Sunspot」と「Tire」が有力候補としてあがってきました。

The Ruby Toolboxでも、その3つが巨塔みたい。Solr系もいいんだけど、なんとなく古いイメージがあって。だからまあ、枯れてていいのかもしれないけど。新しもの好きなので、Elasticsearchをまず使ってみようと思ったわけです。



以下、Centos6(さくら VPS)へのインストール記録です;
(※Ruby 1.9.3 や、Rails 3.2 、MySQL など基本的な構成で、既存のアプリケーションがあるという前提での記述です。)



1)まず、Javaをインストールしてない場合は、Java Runtime の最新版をダウンロードしてインストールします。(サーバ内のターミナルからDLしようとすると、いわゆる規約に同意するためのJSでエラーになってしまい。うまくいきせんでした。なので、ローカルにDLしてから、サーバにSFTPしました。)
http://download.oracle.com/otn-pub/java/jdk/7u4-b20/jre-7u4-linux-x64.rpm

2)ダウンロードしたファイルを、適当なディレクトリにコピーして、インストールします。
$ sudo rpm -ivh jre-7u4-linux-x64.rpm


3)バージョンの確認をしてみます。
$ java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)




4)次に、elasticsearch をDLします。
$ curl -L -O -k ╲ https://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.19.4.zip


5)解凍します
$ unzip elasticsearch-0.19.4.zip


6)適当に、移動します
$ sudo mv elasticsearch-0.19.4 /usr/local/elasticsearch


7)実行してみます
$ /usr/local/elasticsearch/bin/elasticsearch -f


※終了するには「Control + C」で落とします。
※「./elasticsearch/bin/service/elasticsearch start | stop | restart」が可能な、Service wrapper もあり。詳しくは、下記「参考」参照
※参考)「Setting up elasticsearch」



8)rails_app/Gemfile に、下記追加
gem 'tire'
gem 'will_paginate', '~> 3.0' # 既に記載済みの場合はOK。これ入れないと「elasticsearch 」でインデックス作るときに「undefined method `paginate'」みたいなエラーがでる。後述参照


9)バンドルインストール
bundle install


10)rails_app/config/environment.rb に以下追加
require 'will_paginate'

※参考)https://github.com/radiant/radiant/issues/221

11)検索対象の model ファイルに、記述追加
class Article < ActiveRecord::Base
has_many: xxxxx

include Tire::Model::Search #これを追加
include Tire::Model::Callbacks #これを追加
end

※参考)https://github.com/karmi/tire/blob/master/README.markdownの中の「ActiveModel Integration」

12)検索対象の controller ファイルの index メソッドをこんな感じに;
def index
if params[:query].present?
@shows = Show.search(params[:query], load: true)
else
@shows = Show.all
end

 ・
 ・
 ・
end


13)検索対象の view ファイルを、こんな感じに(※models_pathは適切に差し替える);
<%= form_tag models_path, :method => :get do %>


<%= search_field_tag :query, params[:query] %>
<%= submit_tag "Search", name: nil %>


<% end %>



14)elasticsearch の index を更新する
rake environment tire:import CLASS='Model名' FORCE=true

※参考)rake -T でコマンド確認可能

15)検索ボックスが表示されているので、そこから検索可能(な、はず)


・・・でもなんか、2〜3文字で検索すると、その中の1文字だけが一致する結果もひろってきたりと、あんまり信頼性ない感じ。例えば「中日」で検索すると「中国」とか「中村」がかかってくる。「中 AND 日」で検索すると、なんとかうまくいくけど。それでいいんかい? やっぱ、Solr なのか?それとも、elasticsearch の設定でなんとかなるのか??


以上、参考URL;
Elasticsearch 公式サイト
tire on Github
RailsCasts #306 ElasticSearch Part 1(日本語)




Rails3.2 の migration で「id」を autoincrement でなくする設定メモ

  • 2012.05.17 Thursday
  • 14:23
JUGEMテーマ:インターネット


Railsで、外部のデータをインポートしてサービスを構築するような場合、デフォルトの migration で TABLE を作ると、自動的に autoincrement な、PRIMARY KEY の設定された、int(11) の「id」というフィールドが作られる。これは、一から作るサービスにおいては便利だけれど、どこかからデータをひっぱってくるようなサービスでは、不都合のある場合もある。

そんな時は、migration の時に、デフォルトで作られる「id」を無効にして、自分で「id」を設定すればいいみたい。

migration ファイルにて;
class CreateUsers < ActiveRecord::Migration
 def self.up
  create_table :users, :id=>false do |t|
   t.column :id, "int(11) PRIMARY KEY"
   t.timestamps
  end
 end

 def self.down
  drop_table :users
 end
end

引用(&一部修正)『Auto IncrementでないPrimary Key列を作りたい』
参考)『マイグレーション(migrate)で主キーのないテーブル、id以外の主キーを持つテーブルを作る』

「t.column」と一緒に、「t.timestamps」とか「t.string」が並ぶのはなんか気持ち悪いなあと思ったけど。でも、動くのでいいか。


Active Record 関連、勉強し直さないとなあ。。。


勉強すること)
RailsGuide『Active Record Associations(翻訳)』
『今さらRails3メモ - その5: Model Association -』

Rails の データ型と、MySQL のデータ型の対応

  • 2012.05.15 Tuesday
  • 18:53
JUGEMテーマ:コンピュータ


Railsのデータ型について、うろ覚えだったので、調べたメモです。

Rails シンボルMySQL 型
:binaryblob
:booleantinyint(1)
:datedate
:datetimedatetime
:decimaldecimal
:floatfloat
:integerint(11)
:stringvarchar(255)
:texttext
:timetime
:timestampdatetime



元ネタには、Ruby Class についてもまとまっててさらに便利です。
→ 『 MySQL and Ruby on Rails datatypes


はやく、Rails終わってiOSのコード書きたい・・・

Rails 2.3 環境で、search_do(hyperestraier)と will_paginate を使って、全文検索を実現しようとした件

  • 2010.01.07 Thursday
  • 20:34
 Rails 2.3 環境で、search_do(hyperestraier)と will_paginate を使って、全文検索を実現しようとして。検索フォームから検索させて、結果表示するとこまでは成功したんだけど。結果をさらに絞り込んで表示するとことかがうまくできない。でもとりあえず、できたとこまでメモ。


▼1)will_paginate をインストール

http://wiki.github.com/mislav/will_paginate/installation


1-1)config/environment.rb を編集;

--------

| Rails::Initializer.run do |config|

| # ↑と end の間に、下記config.gem 〜 'http://gemcutter.org' の行を追加

|   config.gem 'will_paginate', :version => '~> 2.3.11', :source => 

'http://gemcutter.org'

| end

--------


1-2)コマンド実行で、gemsをインストール

# rake gems:install



▼2)hyper estraier のインストールと、設定

http://hyperestraier.sourceforge.net/nguide-ja.html

http://www.kugimiyabyou.net/2009/08/01/hyper-estraier%E3%81%A8rails%E3%82%92%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6rails%E3%81%8B%E3%82%89%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2/



2-1)Fedoraなので、yumでインストール可能

# yum install hyperestraier


2-2)設定ファイルやインデックスなどを格納するディレクトリを作成(Railsアプリ直下に作成しました)

# estmaster init casket


2-3)ノードマスタの起動

# estmaster start casket


2-4)Web管理画面でユーザ作成など実行

http://localhost:1978/master_ui


※ default ID/PW = admin / admin


2-5)chkconfigに登録(サーバ起動時に同時に起動させる)

http://i-am.web777.net/2007/02/hyperestraier.html

http://makisuke.seesaa.net/article/6066867.html


/etc/ini.d/hyperestraier ファイルを作成

------------

| #!/bin/bash

| #

| # chkconfig: 35 98 02

| # description: HyperEstraier NodeMaster daemon

| # processname: estmaster

| # config: /var/hyperestraier/estmaster/_conf

|

| # Source function library.

| . /etc/rc.d/init.d/functions

|

| # Source networking configuration.

| . /etc/sysconfig/network

|

| RETVAL=0

| prog="estmaster"

|

| ESTUSER="estraier(実行するユーザ名)"

| ESTMASTER="/usr/bin/estmaster(/usr/local/bin/estmasterとかの可能性もあり)" 


| ESTCONF="(initで作成したディレクトリを指定)"

|

| if ! [ -x $ESTMASTER ]; then

|        echo $ESTMASTER is not executable.

|         exit 1

| fi

|

| start()

| {

|         if [ -e /var/lock/subsys/$prog ]; then

|                echo "now $prog running!"

|                 echo "if $prog is not running, remove 

¥"/var/lock/subsys/$prog¥""

|                 exit 1

|         fi

|

|         echo -n $"Starting $prog:"

|         sudo -u $ESTUSER $ESTMASTER start -bg $ESTCONF

|         RETVAL=$?

|        if [ $RETVAL -eq 0 ]; then

|                 daemon true

|                 touch /var/lock/subsys/$prog

|         else

|                 daemon false

|         fi

|         echo

| }

|

| stop()

| {

|         echo -n $"Stopping $prog: "

|         sudo -u $ESTUSER $ESTMASTER stop $ESTCONF

|         RETVAL=$?

|         if [ $RETVAL -eq 0 ]; then

|                 daemon true

|                 rm -f /var/lock/subsys/$prog

|         else

|                 daemon false

|         fi

|         echo

| }

|

| case "$1" in

|         start)

|                 start

|                 ;;

|         stop)

|                 stop

|                 ;;

|         restart)

|                 stop

|                 start

|                 ;;

|         *)

|                 echo $"Usage: $0 {start|stop|restart}"

|                 RETVAL=1

| esac

| exit $RETVAL

------------


とりあえず;

# service hyperestraier start




▼3)search_do のインストールと、設定

http://d.hatena.ne.jp/shunsuk/20090406/1239020647


3-1)gitでインストール(git:// だと通らない環境の場合、http:// に書き換えて実行)

# script/plugin install git://github.com/moro/search_do.git


3-2)config/database.ymlを編集

------------

| development:

|   adapter: mysql

|   encoding: utf8

|  database: test

|   pool: 5

|   username: test

|   password: test

| #以下を記載(node は、2-2で指定した名称)

|   estraier:

|     host: localhost

|     user: admin

|     password: admin

|     port: 1978

|     node: casket

------------


3-3)ソースのメンテ

http://d.hatena.ne.jp/shunsuk/20090324/1237893278


※vendor/plugins/search_do/lib/search_do/backends/hyper_estraier.rbを編集



▼4)model / controller / view の編集


4-1)modelの編集

http://github.com/grosser/search_do/blob/7c4d06da26c9ef3d45c21377dc864f9ca112d094/README.rdoc


------------

| class User < ActiveRecord::Base

|   acts_as_searchable(

|     #fields the will be found in fulltext search

|     :searchable_fields => [:name,:website,:city,:about],

|     #fields used for attribute search/ordering

|     :attributes => {:name=>nil,:city=>nil,:country=>nil,:age=>nil}

|   )

|   attr_accessor :html_snippet #add this to get html snippets on your 

results (see below)

| end

------------



4-2)script / consoleで確認

http://www.kugimiyabyou.net/2009/08/01/hyper-estraier%E3%81%A8rails%E3%82%92%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6rails%E3%81%8B%E3%82%89%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2/


# ./script/console

Loading development environment (Rails 2.3.3)

>> User.reindex!

=> [#, #, #]

>> User.fulltext_search("ぱん")

=> [#]

>>



4-3)controllerに、検索用アクションを追加

------------

| def fulltext_search

|   @users = User.paginate (params[:search],

|                           :order => params[:order],

|                           :page => params[:page],

|                           :per_page => 20,

|                           :total_users => 

User.count_fulltext(params[:search]),

|                           :finder => 'fulltext_search'

|                           )

|   respond_to do |format|

|     format.html # index.html.erb

|     format.xml  { render :xml => @user }

|   end

| end

------------



4-4)viewに、検索フォームを追加

------------

| <% form_tag({ :controller => "users", :action => "fulltext_search"}) 

do -%>

|   <%= text_field_tag('search', params[:search]) -%>

|   <%= submit_tag("検索") -%>

| <% end -%>

------------



5)今後の課題


・fulltext_searchで検索した結果に対し、さらに絞込み検索できるようにする

 (↑やってみたけど、よーわからんかった...)


・pagenate がうまく動作してないのをなおす


・検索インデックスの更新(User.reindex!)を、script/runner から定時実行する





【随時更新】RailsGuide 訳『Rails 国際化対応 - I18n API』

  • 2010.01.02 Saturday
  • 16:56
Rails 2.2 / 2.3 に搭載されている、Railsアプリを国際化対応させる機能 I18n API について、RailsGuideに分かりやすそうな説明があったので翻訳しています。必要があれば随時更新していこうと考えています。Railsやプログラムについて、シロウトなので、表現が間違っている箇所もあるかもしれません。お気づきの点があれば、ぜひコメントくださいませ。

ちなみに、当初は『翻訳プロジェクト:RailsGuide日本語翻訳』で作業していました。。。

------------

Rails の国際化 (I18n) API

Rubyのgem『I18n(iとn間の文字 _internationalization_ を省略した表記)』はRails 2.2よりRuby on Railsに付属され始めました。アプリケーションを英語だけでなく、他言語に翻訳することや、アプリケーションの多言語化をサポートする、カンタンで、拡張性のあるフレームワークです。

「国際化」プロセスとは、文字や(日付や通貨のフォーマットなどの)各国固有の事情をアプリケーションから取り除く(抽象化する)という意味で使われることが多い。

「ローカル化」プロセスは、翻訳し、各国固有の事情を反映することを意味する。

Railsアプリケーションを「国際化」するために、やらなければならないのは: 

* I18nを利用する 
* [ロケール]辞書の場所を指定する 
* [ロケール]のセットする/しない、切り替え方法を指定する

 アプリケーションを「ローカル化」するには、以下の3つが必要です: 

*Railsデフォルトの[ロケール]を置き換える、補完する -- 例)日付、時間のフォーマット。月の呼び方、Active Recordのmodel名。その他 
*アプリケーション中の文字列を、key化された辞書に抽出(抽象化)する。-- 例)flashメッセージ、view中の文章、その他。 
*できあがった辞書を、どこかに保存する このガイドでは、I18n APIの概要を説明し、Railsアプリケーションの国際化を、初心者でもわかるチュートリアルで説明していきます。 

------------ 
注意: Ruby I18n フレームワークは、Railsアプリケーションの国際化/ローカル化に必要なすべてを提供します。ただし、もっと機能を追加したいなら、プラグインや機能拡張を使うことができます。詳しい情報はRails "I18n Wiki":http://rails-i18n.org/wiki を参照してください。
 ------------ 


1)I18nは、どうRuby on Railsで機能するか 

国際化には、複雑な問題が付きまとう。言語はそれぞれ、様々な面で異なっている(例:複数形の扱いなど)ので、一度に全てを解決するツールは提供できない。

そこで、Rails I18n APIでは、以下にフォーカスする: 

*英語と、それに似た言語は、始めから使えるようしておく
*その他の言語は、カスタマイズを簡単にし、全てを拡張可能にすることで対応する

Railsフレームワーク中の、スタティックな文字列は全て国際化されていますが、それもI18nの機能を使っています -- 例)Active Recordのバリデーションメッセージ、時間や日付のフォーマットなど --。Railsアプリケーションのローカル化とは、デフォルト値に「乗っかる」ことを意味します。


1.1)ライブラリの全体構成

Ruby I18n gem は、2つの要素で構成されています:

*i18n公開API -- ライブラリの動作を定義する、public methodを含んだRuby module。
*これらのmethodを実行する、デフォルトのバックエンド(_Simple_backend と命名) 利用する時には、public methodしかアクセスできないけれど、I18nのバックエンドの能力・機能を知っておくと何かと便利です。

------------ 
注意: 標準のSimple backendを、より強力なもの(RDBMに訳語を保存できるもの、GetText辞書、もしくは類似したもの)に置き換えることは可能だし、望まれているかもしれません。後述する "別のバックエンドを使う":#using-different-backends を参照してください。
------------ 


1.2)I18n公開API 

I18n APIの、もっとも重要なmethodは次の通りです:  
------------
|  translate # 翻訳したい文章を指定
|  localize # 日時のオブジェクトをローカル化
------------
上記2つは、#t と #l のエイリアスです。以下のように使います: 
------------
|  I18n.t 'store.title'
|  I18n.l Time.now 
------------

 以下の属性にも、reader / writer が用意されています:
------------
|  load_path # 辞書ファイルの在り処を指示する
|  locale # 現在のロケールの取得、指定
|  default_locale # デフォルト地域の取得、設定
|  exception_handler # 別のexception_handlerを使う 
|  backend # 別のbackendを使う
------------

 それでは、次の章で、簡単なRailsアプリケーションの国際化をやってみましょう! 


2)Railsアプリケーション国際化の準備

I18nの起動/運用には、いくつかの簡単な手順が必要です


2.1)I18nモジュールの設定 

「設定より規約」哲学に従い、Railsの各種デフォルト設定はリーズナブルです。もし別の設定にしたければ、簡単な方法で上書きすればよいでしょう。 config/localesにある.rb.ymlのfilesを、Railsは自動的に翻訳のload pathに追加します。 

デフォルトの[ロケール] である en.yml には、シンプルな2つの翻訳設定が含まれています。
------------
|  en: 
|   hello: "Hello world"
------------

:en [ロケール]では、helloキー が、"Hello world"という文字列にマッピングされています。Rails内の文字列は、すべてこの方法で国際化されています。例えば、Active Recordのバリデーションメッセージ(activerecord/lib/active_record/locale/en.yml)を見てください。また、日付フォーマット(activesupport/lib/active_support/locale/en.yml)も見てください。YAMLやRubyの標準的なHashを使って、デフォルトのバックエンド(Simple backend)に訳語を保存できます。

I18nライブラリーのデフォルトロケールは、英語です。他の地域を設定しなければ、:en が翻訳に用いられます。 

------------
注意: i18nライブラリは(数々の議論を経て )、[ロケール]のキーについて、実用的なアプローチをとるようになりました。:en:pl のように、("言語")[ロケール]だけを含み、"言語"と"地域設定"、"方言"などを分けて扱う:en-US や :en-UK のようなアプローチをとっていません。国際化されたアプリケーションの多くは[ロケール]に、+:cz+ や +:th+ 、+:es+ (チェコ語、タイ語、スペイン語)のように、"言語"だけを使うでしょう。でも、言語圏の中にある地域差が重要な場合もあります。:en-US [ロケール]の通貨記号は $ だけれど、:en-UK では

RailsによるアジャイルWebアプリケーション開発 第3版

  • 2009.11.24 Tuesday
  • 01:20
Rails本の定番「RailsによるアジャイルWebアプリケーション開発」の、第3版が、2009年11月中に発売されるようです。
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?&ISBN=978-4-274-06785-3

原本(英語版)は2009年3月発売で、Rails 2.2を対象に書かれています;


安定・最新版(現在:Rails2.3)との差が小さい内に、読んでおかないとですね。。。

ちなみに、11/24現在、amazonには書籍情報はありませんでした。

Rails 2.2、2.3 の i18n(国際化機能)のガイドを訳しちゅう...

  • 2009.11.12 Thursday
  • 21:33
 ひさびさに、Railsを使おうとしてます。前は、1.2とか使ってました。 いまはもう、2.3とかなんすね。。。 機能もいろいろ変わってるなー。と悪戦苦闘中です。

まずは、GetTextでやってたことを、標準化した、Rails 2.2、2.3 の i18n(国際化機能)を理解しようと思い;


にて、翻訳を作成中。 ミイラとりが、ミイラになっちゃいました。

途中から、よくわからんくなってきたので、誰か助けてー

手段と目的

  • 2009.10.20 Tuesday
  • 10:58
ここ最近、ふたたびケータイ向けサービスを作ろうと画策しています

前回チャレンジした際、ネックになったのが;

1). メールパーサー(携帯向け、デコメ含む)の実装
2). メールサーバ(MTA)の設定と、プログラム連携
3). 公開サーバの置き場所(ホスティング or DDNS+自宅サーバ)


1については、PHPを使ってやろうと決めて、3ヶ月間くらいPHPに慣れようと頑張っていました。ライブラリ組み合わせたり、cakePHP入れてサンプルアプリ作ったり。。。

でも、どうもやっぱりPHP好きになれない。ケータイ関連のライブラリやバッドノウハウの情報も豊富だから。素人プログラマーには適した言語だというのは理解したつもりだし。作りたいものが決まっているなら、PHPでやるのがいいんだろうなとは思うけど。でも楽しくない。気持ちよくない。 まずはサービスを世に出すことが先決だと考えて。なんとかPHPを好きになろうとしたんだけど。

でもダメ。美しくない。各プログラムの点と点が結びつかない感じ。線にならない。全体として、自分の頭の中に組み上がらない感じ。弘法筆を選ばず、なんだろうけど。俺は弘法さまじゃないし。嫌な思いしててはモチベーション続かないし。そもそも、弘法さまは、ホントに書きたい「書」を書くときには、筆を選びに選んでただろうし。

ってことで、やっぱりRuby On Railsでやろうと、初心に帰りました。前回の時に比べて、ライブラリも充実してきているし。情報も豊富になってきているし。まあ、どのバージョンを使うべきかとか、環境構築が大変。とかあるけど。どのみち「2」や「3」をクリアするには、レンタルサーバとかじゃあだめなわけだし。


ようやく、サーバ環境について、頭がまとまってきました。

なるべくお金かけずに。やりやすい環境つくろうっと♪

PR

calendar

S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
<< August 2019 >>

本が出てます☆

Twitter

selected entries

categories

archives

recent comment

  • Mac OS X Lion で、emacs を楽に使うために、Meta キーを「option」に設定したい。
    通りすがり (01/19)
  • 携帯キャリアの、アクセス制限(未成年保護)についてのまとめ
    たけのこの里 (10/01)
  • Mac OS X Lion で、emacs を楽に使うために、Meta キーを「option」に設定したい。
    イシカワ (07/16)
  • さくらインターネットで、gem install すると「chown/chgrp: Operation not permitted 」と叱られる件の対応
    sean (04/20)
  • さくらインターネットで、gem install すると「chown/chgrp: Operation not permitted 」と叱られる件の対応
    てっちー (03/24)
  • Mac OS X Lion で、emacs を楽に使うために、Meta キーを「option」に設定したい。
    JO (01/04)
  • Passbook(パスブック)on iOS6 (NDAに触れない範囲で...)
    ぱん (09/28)
  • Passbook(パスブック)on iOS6 (NDAに触れない範囲で...)
    宮腰睦美 (09/23)
  • magit を、Lion の emacs にインストール
    ぱん (05/08)
  • 【 Xcode4.2 】Interface Builder使わずに、座標を合わせたい(習作1)
    ぱん (12/21)

recommend

iOSプログラミング 第2版
iOSプログラミング 第2版 (JUGEMレビュー »)
アーロン・ヒレガス,ジョー・コンウェイ,Aaron Hillegass,Joe Conway
■独学で初心者を脱出するには、必読ではないでしょうか。翻訳でニュアンスが伝わらない部分があるので、原書と、サポートサイト(英語)を活用すべし!です。

recommend

iPhoneプログラミングUIKit詳解リファレンス
iPhoneプログラミングUIKit詳解リファレンス (JUGEMレビュー »)
所 友太
■内容古いですが、iOSプログラマー中級以上の階段を登るために、必要な本だと思います。iOS5対応版出ないかな。。

recommend

iOSプログラミング入門 - Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎
iOSプログラミング入門 - Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎 (JUGEMレビュー »)
大津 真
■Ch.1「iOS プログラミングを始めるための基礎知識」でXcodeの概要を理解して、Ch.2「Objective-C の基礎知識」で、Objective-Cの考え方を理解できます。iOSプログラミングのキックオフにぴったり。

recommend

去年ルノアールで
去年ルノアールで (JUGEMレビュー »)
せきしろ
■ルノアールで妄想が爆発

recommend

RailsによるアジャイルWebアプリケーション開発 第4版
RailsによるアジャイルWebアプリケーション開発 第4版 (JUGEMレビュー »)
Sam Ruby,Dave Thomas,David Heinemeier Hansson
■Railsのバイブル第4版の日本語版が2011年末にリリース!サーバサイドで準備するAPIや、Webサイト関連のもろもろは、やっぱRailsでしょう。

links

profile

search this site.

others

mobile

qrcode

powered by

無料ブログ作成サービス JUGEM