2010年04月12日

Rails ページネート(Paginator)

ページネートって?


1画面には表示しきれないものを次のページで表示したりする機能。
例えば、Google検索結果の下の方に出てるGoooooogこんなかんじで番号振ってあるやつ。
それがページネートです。

環境


Rails1.2.6
// Rails2系だと方法が異なるので、ご注意を

使用場所


app/controller/hoge_controller.rb
app/views/hoge/list.rhtml
app/views/hoge/_paginate.rhml
Hogeテーブル


使い方


$ vi hoge_controller.rb
class HogeController < BaseController
 def list
  @pages,@hoges = paginate(:hoges,
                :per_page => 10,
                // 1画面の表示件数
                )
 end
end

$ vi list.rhtml
<%= render :partial => 'paginate' %>

$ vi _paginate.rhtml
<% if @pages %>
 <% if @pages.current.previos %>
  <%= link_to('前', page_params.merge({'page' => @pages.current.previos.number})) %>
 <% end %>
 <% if @pages.current.next %>
  <%= link_to('後', page_params.mege({'page' => @pages.current.next.number})) %>
 <% end %>

 <% if 0 < @pages.item_count %>
  <% @pages.item_count %>件中<%= @pages.current.first_item %> - <%= @pages.current.last_item %>件を表示
 <% end %>
<% end %>


これで、Hogeの一覧を1画面10件表示づつで表示が可能となります。
次回は、もちょっと細かいページネートの設定を書きます。
posted by RicK at 14:46| Comment(0) | TrackBack(0) | 日記

2010年04月09日

Ruby 配列(Array)

配列(Array)って?


箱のなかにカラーボールが詰まっている感じ?
hogeという箱にhoge1、hoge2、hoge3というボールが詰まってる感じ?
hoge=[hoge1, hoge2, hoge3]

箱にいれることも出す事も可能。

環境


Ruby1.8.6

使い方


hoge = []
// 宣言、まぁRubyはいらないけど
hoge << "hoge"
// 挿入、後ろにどんどん追加
hoge << "hoge2"
hoge // ["hoge", "hoge2"]
hoge.length //2
//数も数えれます。
hoge[0] //hoge
//0,1,2,3と数えていきます。
hoge.pop //["hoge"]
//最後尾のhoge2が削除されます。
hoge.delete_at(1) //["hoge"]
//配列1番目(0,1の1番目)のhoge2が削除されます。
hoge << "hoge2" //["hoge", "hoge2", "hoge2"]
hoge.delete("hoge2") //["hoge"]
//hoge2の要素が削除されます。
hoge.uniq! //["hoge"]
//重複しているhoge2は削除されます。
//!は破壊メソッドです。
hoge.refect {|x| /hoge/ =~ x} //["hoge2", "hoge2"]
//条件にあてはまるものを削除します。

こんなところですかね。
posted by RicK at 18:24| Comment(0) | TrackBack(0) | 日記

2010年04月08日

Ruby on Rails findで今月だけ取り出す。

今月だけ取り出すって?


Hogeテーブルのcreated_atカラムに
2010-10-10 10:10:10.123456

などの日付データが複数入っているとします。
これの10月だけ取り出したいな。。。と思って
Hoge.find(:all, :conditions => ["created_at = ?", "2010-10"])

こんなふうにやったとしても、2010-10-10 00:00:00.000000ならヒットするかもしれませんが、2010-10-10 10:10:10.111111などはヒットしてくれません、イコールでないですからね。
DBに入っているデータのフォーマットを2010-10に変えれれば。。。と思う訳です。

環境


Rails1.2.6
PostgreSQL8.3.5

フォーマットの変更方法


変更の前に、
conditions => ["created_at = ?", "2010-10"]

これのcreated_at = ?はなんで=何だと思います?他は=>なのに。
これは、ここだけPostgreSQLのコマンドだからです。
なので、年や月だけ表示したい場合は、PostgreSQLの年や月だけ表示できるような機能を使います。
Hoge.find(:all, :conditions => ["extract(year from created_at) = ? and extract(month from created_at) = ?", "2010", "10"])

こんな風にしてあげると年だけ、月だけを取得できます。

まぁ2010年10月だけを取り出したいだけなら
Hoge.find(:all, :conditions => ["created_at between ? and ?", "2010-10", "2010-10"])

こんなんでも可能ですけどね。
posted by RicK at 16:20| Comment(0) | TrackBack(0) | 日記

2010年04月07日

Ruby on Rails date_select

date_selectとは?


日付フォーマットです。






上記の入力フォームを簡単に作成してくれます。

環境


Rails1.2.6

使い方


$ vi app/views/hoge/hoge.rhtml
<% from_tag :action => 'hoge' %>
<&= date_select :hoge, :boge, {:use_month_numbers => true} %>
<% end %>

上記の様に書くと日本語の日付フォームが作成されます。
オプションも色々あるのですが、今回はパラメーターの取得方法です。

パラメーター


使い方のフォームを飛ばして、paramsで受取ると、
{"hoge"=>{"boge(1i)"=>"2010", "boge(2i)"=>"12", "boge(3i)"=>"31"}}

こんな感じで取得できます。
こいつを、
day = params[:hoge]['boge(1i)]+'-'+params[:hoge]['boge(2i)']+'-'+params[:hoge]['boge(3i)']
days = Date.parse(day)

こうやってやるとちゃんとした日付データになります。

・・・書いておいて何なんですが、こんな面倒な事しなくてもぱぱっとできたきもするんですよねぇ。。。ん〜〜〜〜思い出せん。。。。。。。
posted by RicK at 17:05| Comment(1) | TrackBack(0) | 日記

2010年04月06日

Ruby on Rails 部分テンプレート

Ruby on Rails 部分テンプレート

部分テンプレートとは?


よくあるグローバルメニューとかが部分テンプレートと呼ばれるものです。
(本当はグローバル系は共通レイヤーっていうんですが、まぁ機能的には似たようなものです。)
各ページに同じ事を書くのは面倒なので、
この機能を使えば、共通で使用する事が可能です。
htmlのframesetの片側みたいなかんじですね。

環境


Rails1.2.6

使用方法


$ vi app/views/hoge/hoge.rhtml
<hr />
<%= render :partial => 'boge' %>
<hr />

$ vi app/views/hoge/_boge.rhtml
部分テンプレートです。

上記のような感じで書いて、hoge.rhtmlをwebで見ると、


部分テンプレートです。


こんな感じで表示されます。

$ vi app/views/hoge/moge.rhtml
<hr />
<%= render :partial => 'boge' %>
<hr />

こんな感じでやって、moge.rhtmlをwebでみても


部分テンプレートです。


こんな感じで表示されます。
便利ですよね。
部分テンプレートなどは、ファイル名が_で始まっていないと行けないのでご注意を。

パラメータを渡す方法


通常、部分テンプレートにパラメータは自動では渡りません。
parpams[:hoge]
// こんな感じでパラメータを取得はできない。

部分テンプレートの大体はそのようなパラメータを必要としない作りが多いですが、
たまに取得したい場合が有ります。
そんなときは、
$ vi app/views/hoge/hoge.rhtml
<%= render :partial => 'boge', :locations => {:color => '#FF0000'} %>

$ vi app/views/hoge/_boge.rhtml
<font size='#{color}'>部分テンプレートです。</font>

こうすると


部分テンプレートです。


こうやって表示されます。
posted by RicK at 17:38| Comment(1) | TrackBack(0) | 日記

2010年04月05日

Ruby on Rails 正規表現

正規表現とは?


文字などを記号でグループ化し、まとめて
取り出したりできる。
例)
\w : 英数字(a-zA-Z0-9_)とイコール

環境


Ruby1.8.6

使い方


if /^hoge/ =~ "hogehoge"
puts "bogeboge"
end

上記は先頭がhogeの場合bogebogeを出力する。

肝の部分は一行目の部分です。
/が正規表現の始まりと終わりを示し=~が文字との比較を示しています。

正規表現記号


使い方の^とかですね。
よく使う記号が、
^ : 行頭(以前も書きましたがこの行頭は気をつけてください)
$ : 行末
. : 何か一文字
* : 直前の表現の0回以上の繰り返し
+ : 直前の表現の1回以上の繰り返し
\w : 英数字
\d : 半角数字
\A : 文字列先頭
\z : 文字列末尾
[a-z] : a,b,c,d.....zまで全てにマッチ
[0-9] : 0,1,2,3...9まで全てにマッチ
[^0-9] : 0-9以外にマッチ
(ab)|(cd) : abかcdにマッチ$1でab、$2でcdを取り出せる
こんぐらい覚えておけば大体OKでしょう。

言語によって記号などは多少変わってきますが、
だいぶ便利な機能なので、覚えましょう。
posted by RicK at 16:29| Comment(0) | TrackBack(0) | 日記

2010年04月02日

Ruby on Rails プルダウン

プルダウンとは?





こんなやつです。
言葉で言うと、選択できるものが決まっており、
選択できるのは一つだけのときなどに使用されます。

環境


Rails1.2.6

使い方1


$ vi RAILS_ROOT/app/view/hoge/hoge.rhtml
<% from_tag :action => 'hoge' do %>
<% options = [['東京', 1], ['大阪', 2], ['沖縄', 3]] %>
<%= select_tag :hoge, options_for_select(options) %>
<% end %>

これで



こんなん作成されます。

まぁ、作れますけどこんなべた書きじゃださいですよね。
というわで、

使い方2


DBを使用しない場合
$ vi RAILS_ROOT/app/view/hoge/hoge.rhtml
<% from_tag :action => 'hoge' do %>
 <%= select_tag :hoge, options_for_select(Hoge.location_select) %>
<% end %>

$ vi RAILS_ROOT/app/view/model/hoge.rb
class Hoge %lt; ActiveRecord::Base
 HOGE = [['東京', '1'], ['大阪', '2'], ['沖縄', '3']]
 class << self
  def location_select
   HOGE.map{|location|
    [location[0], location[1]]
   }
  end
 end
end


使い方3


DBを使用する場合
$ vi RAILS_ROOT/app/view/hoge/hoge.rhtml
<% from_tag :action => 'hoge' do %>
 <%= select_tag :hoge, options_for_select(Hoge.location_select) %>
<% end %>

$ vi RAILS_ROOT/app/view/model/hoge.rb
class Hoge %lt; ActiveRecord::Base
 class << self
  // Hogeテーブルに東京などの名前とidが入っている
  def location_select
   find(:all).map{|location|
    [location.name, location.id]
   }
  end
 end
end


選択するものが増えたり多いのであれば使い方3を使用した方がいいし、
固定で少ないのであれば使い方2でも何ら問題ありません。
すくなくとも使い方1よりは、繰り返しがすくなくすっきりしています。
posted by RicK at 14:29| Comment(0) | TrackBack(0) | 日記

2010年04月01日

HyperEstraierのinstallと設定

HyperEstraierとは?


PostgreSQL用の全文検索システムです。
※全文検索とは、複数の文書から特定の文字列を検索すること。

普通にsqlのlikeとかでいいんじゃない?とか思ったりもしますが、
速いらしいですね。比べた事無いのでよくわからないんですけどね。

まぁつまり、検索のとこにこれを使うと速くなるってことですね。

環境


CentOS5.2
PostgreSQL8.4.0
HyperEstraier1.4.13
Rails1.2.6

libiconv install


文字コード変換ソフト
versionは、1.9.1以上を使用してください。
$ yum install -y gcc
$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.10.tar.gz
$ tar zxvf libiconv-1.10.tar.gz
$ cd libiconv-1.10
$ ./configure
$ make
$ make install


zlib install


データ圧縮ライブラリー
versionは、1.2.1以上を使用してください。
$ wget http://www.zlib.net/zlib-1.2.3.tar.gz
$ tar zxvf zlib-1.2.3.tar.gz
$ cd zlib-1.2.3
$ ./configure -s
$ make
$ make install


qdbm install


データベースライブラリー
versionは、1.8.75以上を使用してください。
$ wget wget http://qdbm.sourceforge.net/qdbm-1.8.77.tar.gz
$ tar zxvf qdbm-1.8.77.tar.gz
$ cd qdbm-1.8.77
$ ./configure --enable-zlib
$ make
$ make install


mecab install


形態素解析ソフト(単語辞書を使うソフトみたいなもの)
$ wget http://downloads.sourceforge.net/mecab/mecab-0.98pre3.tar.gz
$ tar zxvf mecab-0.98pre3.tar.gz
$ cd mecab-0.98pre3
$ yum install gcc-c++
$ ./configure
$ make
$ make install


mecap-ipadic install


meacbで使う単語辞書
$ wget http://downloads.sourceforge.net/mecab/mecab-ipadic-2.7.0-20070801.tar.gz
$ tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801`
$ ./configure
$ make
$ make install


hyperestraier install


$ wget http://hyperestraier.sourceforge.net/hyperestraier-1.4.13.tar.gz
$ tar zxvf hyperestraier-1.4.13
$ cd /usr/local/src/hyperestraier-1.4.13
$ ./configure --enable-mecab
$ make
$ make install


設定


$ cd /usr/local/share/hyperestraier
$ estmaster init blog_index
$ estmaster start -bg blog_index
$ w3m http://localhost:1978
// id:admin passwd:admin
// ManageNodes選択hoge hogeで作成
$ vi RAILS_ROOT/config/database.yml
estraier:
host: 192.168.3.22
user: admin
password : admin
port: 1978
node: hoge

$ ruby script/console
Hoge.reindex!
// これでHogeテーブルが検索可能になる

posted by RicK at 11:57| Comment(0) | TrackBack(0) | 日記

2010年03月30日

PostgreSQLの冗長化

前回の続きのようなかんじのPostgreSQLの冗長化のご紹介。

冗長化とは?


例えばDBサーバが1台だけだと、その1台が故障した場合、
データが無くなる・サービスが停止するなどの障害がおきます。
それを防ぐ為に、2台構成で動かしたりする事を冗長かといいます。

環境


サーバ db1(192.168.10.122)
サーバ db2(192.168.10.123)
CentOS5.2
PostgreSQL8.4.0(/usr/local/pgsql)

pg_standby install


$ cd postgresql-8.4.0/contrib/pg_standby/
$ make
$ make install


準備・設定・起動


db1) $ cd /usr/local/pgsql/
$ mkdir archive1
db2) $ cd /usr/local/pgsql/
$ mkdir archive2
db1) $ cd /usr/local/pgsql/
$ vi data/postgresql.conf
archive_mode = on
archive_command = 'scp %p 192.168.10.123:/usr/local/pgsql/archive2/%f'
archive_timeout = 10

$ pg_ctl -o "-i" reload -D /usr/local/pgsql/data/
$ psql
$ select pg_start_backup('backup');

$ scp -r /usr/local/pgsql/data 192.168.10.123:/usr/local/pgsql/data
$ psql
$ select pg_stop_backup('');

db2) $ cd /usr/local/pgsql/
$ vi data/postgresql.conf
archive_command = 'scp %p 192.168.10.122:/usr/local/pgsql/archive1/%f'

$ rm postmaster.pid
$ rm pg_xlog/*
$ rm pg_xlog/archive_states/*
$ vi recovery.conf
restore_command = 'pg_standby -l -t /usr/local/pgsql/failover /usr/local/pgsql/archive1 %f %p %r'

$ pg_ctl start -D /usr/local/pgsql/data
$ pg_ctl -o "-i" reload -D /usr/local/pgsql/data/
psql: FATAL: the database system is stating up
// 上記の
$ sh /usr/local/pgsql/pg_stand.sh &
// シェルの起動 一分おきにdb1の動作確認をする。3回だめだったら切り替える


なんかだいぶわかりにくいけど、、、こんな感じです。
posted by RicK at 16:45| Comment(0) | TrackBack(0) | 日記

2010年03月29日

PostgreSQLのインストールと設定

PostgreSQLとは?


フリーのDBです。

環境


CentOS5.2
Postgresql.8.4.0 install

PostgreSQL install


$ wget ftp://ftp2.jp.postgresql.org/pub/postgresql/source/v8.4.0/postgresql-8.4.0.tar.gz
$ tar zxvf postgresql-8.4.0.tar.gz
$ cd postgresql-8.4.0
$ yum install -y gcc
$ yum install -y zlib-devel
$ yum install -y readline-devel
$ ./configure --prefix=/usr/local/pgsql --with-readline
$ make
$ make install


初期設定


$ mkdir /usr/local/pgsql/data
$ chown postgres /usr/local/pgsql/data
$ su - postgres
$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
$ /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &
$ /usr/local/pgsql/bin/createdb -U postgres -E utf-8 hoge
$ /usr/local/pgsql/bin/psql hoge
$ pg_ctl -o "-i" restart -D /usr/local/pgsql/data/


接続設定


$ vi /usr/local/pgsql/data/pg_hba.conf
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 192.168.10.114/24 password
# IPv6 local connections:
host all all ::1/128 trust

これで外部(192.168.10.114/24)からの接続をパスワード付きで許可
passwordをtrustにするとパスワード無しで許可

$ vi /usr/localpgsql/data/postgresql.conf
listen_addresses = '*'
port = 5432
log_destination = 'stderr'
logging_collector = on
log_directory = '/usr/local/pgsql/data/pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_line_prefix = '%t:%r[%d %m]'
log_statement = 'mod'

こんなとこかなぁ。
あぁ設定変えたら再起動とかわすれずにね。

次はpostgresの冗長化でpg_standbyとHearBeatかな。
posted by RicK at 14:23| Comment(0) | TrackBack(0) | 日記

2010年03月26日

UNIXコマンド mount

mountとは?


別サーバのフォルダを指定した場所に、
あるがごとく表示させることができるUNIXコマンドです。

Aサーバに/home/hoge/a.htmlがあるとします。
Bサーバで/home/hoge/にAサーバの/home/hogeをマウントします。
すると
Bサーバに/home/hoge/a.htmlが作成されます。

Aサーバのa.htmlを変更・削除をすればBサーバにも反映されますし、
Bサーバでa.htmlを変更・削除してもAサーバに反映させることができます。

環境


CentOS5.2

設定


$ vim /etc/fstab
// 一番下に追記
192.168.4.104:/var/www/hoge/public/images/ /home/hoge/images/ nfs defaults 0 0
// 192.168.4.104の/var/www/hoge/public/images/の中身をこの設定を書いたサーバ(105)の/home/hoge/images/にマウントする

$ ssh 192.168.4.104
$ vim /etc/exports
// 追記
/var/www/hoge 192.168.4.105(rw,no_root_squash,sync)
// 104サーバの/var/www/hogeを105 にマウントさせる事を許可

$ vim /etc/hosts.allow
// 追記
portmap : 192.168.4.105 : allow

$ exportfs -ra
$ /etc/rc.d/init.d/nfs restart
$ ssh 192.168.4.105
// 追記
vsftpd : ALL

$ exportfs -ra
$ /etc/rc.d/init.d/nfs restart


起動?


$ mount -a


Error


mount: mount to NFS server '192.168.4.104' failed: System Error: No route to host.
解決
/etc/hostsの記述がない

mount: mount to NFS server '192.168.4.104' failed: RPC Error: Program not registered.
解決
$ /etc/rc.d/init.d/nfs


mount: 192.168.4.104:/home/hoge/digimerfce/public/images/ failed, reason given by server: Permission denied
解決
/etc/exportsの間違い
cat /proc/fs/nfs/exports
// だめな場合
# Version 1.1
# Path Client(Flags) # IPs
// おKな場合
# Version 1.1
# Path Client(Flags) # IPs
/home/hoge 192.168.4.105(rw,no_root_squash,sync,wdelay,no_subtree_check)


確認


マウントしている一覧がでる
$ mount

ディスク容量のほかにマウント一覧もでる
$ df
posted by RicK at 15:58| Comment(0) | TrackBack(0) | 日記

2010年03月25日

apacheのインストールと設定と起動

apacheとは?


フリーで提供されているWebソフトで、
サイトを作成して公開するのに必要なソフトです。

環境


CentOS5.2

apache install


apache2.2.6をソースからインストールします。
$ cd /usr/local/
$ wget http://archive.apache.org/dist/httpd/httpd-2.2.6.tar.gz
$ tar zxvf httpd-2.2.6.tar.gz
$ cd httpd-2.2.6
$ yum install -y zlib-devel
$ yum install -y openssl-devel
$ yum install -y httpd-devel
$ ./configure --enable-mods-shared=all --enable-proxy --enable-proxy-balancer --enable-ssl --enable-so --enable-rewrite --enable-vhost-alias --prefix=/usr/local/apache2
$ make
$ make install


環境設定


$ vim /usr/local/apache2/conf/httpd.conf

Options FollowSymLinks
AllowOverride All
// .htaccessの使用許可
Order deny,allow
Allow from all
// 全ての人のアクセスを許可

Include conf/extra/httpd-vhosts-hoge.conf
//個別設定
$ vim /usr/local/apache2/conf/extra/httpd-vhost-hoge.conf
NameVirtualHost *:80

ServerName hoge.jp
DocumentRoot "/usr/local/apache2/htdocs"
AddDefaultCharset UTF-8
ErrorLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/error/error.log.%Y%m%d 86400 540"
CustomLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/access/access.log.%Y%m%d 86400 540" combined env=!no_log
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)|(ico)\??.*$" no_log


起動


$ /usr/local/apache2/bin/httpd -t
// 設定ファイルが正しいかチェック
$ /usr/local/apache2/bin/httpd -k start


これでhttp://サーバIPにアクセスすれば表示されるはずです。
posted by RicK at 14:06| Comment(0) | TrackBack(0) | 日記

2010年03月24日

KeepAlivedのinstallと設定

環境


CentOS5.2

KeepAlivedとは?


IPVS※を冗長化しているものです。

※IPVSとは、ロードバランサー(負荷分散)機能です。
リアルサーバーのクラスタとしてバーチャルサーバーを構築することで、エンドユーザーからは1つのサーバーとして見えます。
といった長ったらしい説明がありますが、まぁよくわかんないですよね。
ようは一つのグローバルIPで複数のサーバを使用できて、
ユーザにはグローバルIPが一つだから一つのサーバでやってる様に見えるって言う訳ですね。

ipvsadm install


こいつがIPVSですね。
$ yum install ipvsadm


KeepAlived install


ソースから入れます。
yum install -y gcc
$ yum install -y kernel-devel
$ yum install -y openssl-devel
$ yum install -y rpm-build
// 上記は、あれば別に再度いれなくていいです。

OSが32bitの場合


$ wget http://dag.wieers.com/rpm/packages/keepalived/keepalived-1.1.13-5.el4.rf.i386.rpm
$ wget ftp://195.220.108.108/linux/ASPLinux/i386/updates/12.1/i386/openssl097a-0.9.7a-9.1.asp121.i386.rpm
$ rpm -ivh openssl097a-0.9.7a-9.1.asp121.i386.rpm
$ rpm -ivh keepalived-1.1.13-5.el4.rf.i386.rpm

OSが64bitの場合


$ wget http://dag.wieers.com/rpm/packages/keepalived/keepalived-1.1.13-5.el4.rf.x86_64.rpm
$ wget ftp://195.220.108.108/linux/ASPLinux/i386/updates/12.1/x86_64/openssl097a-0.9.7a-9.1.asp121.x86_64.rpm
$ rpm -ivh openssl097a-0.9.7a-9.1.asp121.x86_64.rpm
$ rpm -ivh keepalived-1.1.13-5.el4.rf.x86_64.rpm


KeepAlivedの設定


$ vi /etc/keepalived/keepalived.conf
global_defs {
notification_email {
hoge@hoge.com
}
notification_email_from hoge@hoge.com
smtp_server gate01.kbmj.org
smtp_connect_timeout 30
! router_id LVS_DEVEL
}

vrrp_instance VI {
state MASTER
interface eth0
smtp_alert
virtual_router_id 2
priority 150 // サブの方は100
advert_int 1
authentication {
auth_type PASS
auth_pass ajikko
}
virtual_ipaddress {
192.168.10.111 dev eth0
}
}


起動


$ /etc/init.d/keepalived start


確認


$ ping 192.168.10.111
// pingが通るか確認
ip addr show eth0
// マスターのみが192.168.10.111を所持している事


Error


なぜかバーチャルIPを両方のサーバが持っている事があります。
そんな時はiptablesを停止してみてください。なおるかもしれません。
posted by RicK at 12:09| Comment(0) | TrackBack(0) | 日記

2010年03月23日

CenOSのインストールからネットワークの設定まで

以前にXenを使用してCentOSをCUIでインストールする方法を紹介しましたが、
今回は普通にGUIでのご紹介です。

インストール・設定するもの


・CentOS5.2(CDから入れます)
・ntp(時刻)
・ネットワーク設定

CentOSのインストール(GUI)


PCにCentOS5.2を入れて起動。
起動してCentOS5のロゴとENTERを促す文が出てきたらEnterを押す。

「メディアチェック CD Found」


skip

「インストール開始」


Next

「言語選択」


Japanese(日本語)を選択 → Next

「キーボード選択」


日本語を選択 → 次

「ディスクパーティション選択」


一番上のプルダウンで、カスタムレイアウトを作成します。を選択 → 次

「ディスクの設定」


全て削除する。
▽ ハードドライブ
▽/dev/sda
   空き
となるようにする。
/dev/sdaをクリックして新規作成
マウントポイント → /boot、 サイズ → 100、 → OK
/dev/sdaをクリックして新規作成
ファイルシステムタイプ → physical volume(LVM)、 追加容量オプション → 再大容量まで使用、 → OK
LVM(L)ボタンをクリック(名前はVolGroup00) → OK
VolGroup00をクリックして編集 → 追加
ファイルシステムタイプ → swap、 サイズ → 256、→ OK → 追加
マウントポイント → /、 → OK
▽LVMボリュームグループ
  ▽VolGroup00 全容量
   LogVol00 swap 256
   LogVol01 / ext3 残りの容量
 ▽ハードドライブ
  ▽/dev/sda
   /dev/sda1 /boot ext3 101
   /dev/sda2 VolGroup00 LVMPV 残り容量
最終的な形は上記のようにする。

「プーとローダーの設定」



「ネットワークの設定」



「タイムゾーンの選択」


アジア/東京を選択 → 次

「パスワードの設定」


**** → 次

「インストールの種類」


チェックボックスのServerのみ選択 → 次

「完了」


再起動

「終了」


CD取り出して再起動ボタンを押す。

起動


「初期設定」


Exit

「ログイン」


login: root
Password: ***

時刻設定


$ yum install ntp
$ ntpdate ntp2.jst.mfeed.ad.jp
$ hwclock --systohc
$ /etc/rc.d/init.d/ntpd start
$ chkconfig ntpd on

確認


$ date
//今の時間が表示される
$ ntpq -p
//ns2.ktroad.netがあればOK


サーバ設定


$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
# Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express
DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.10.255
HWADDR=00:1D:09:0A:38:83
IPADDR=192.168.10.104
NETMASK=255.255.255.0
NETWORK=192.168.10.0
TYPE=ethernet
ONBOOT=yes
//HWADDRは、デフォルトのままでよい

$ vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=hoge
GATEWAY=192.168.10.1

$ vim /etc/resolv.conf
nameserver 119.86.11.19
//DNSのIP

再起動


$ /etc/init.d/network restart


これでping google.comとかやってつながればOK
posted by RicK at 15:07| Comment(0) | TrackBack(0) | 日記

2010年03月19日

mongrelのインストールと使い方

install


$gem install mongrel
$gem install daemons
$gem install mongrel_cluster


設定


$vi config/mongrel_cluster.yml

user: digimerce
cwd: /var/www/digimerce
port: "3000"
//ここでポート変更
environment: production
group: digimerce
pid_file: log/mongrel.pid
servers: 5
//ここでポートの数指定


mongrel起動


$mongrel_rails cluster::start

デフォルトだとポート3000~3004まで走ります。

mongrel再起動


$mongrel_rails cluster::restart


mongrel停止


$mongrel_rails cluster::stop
posted by RicK at 18:17| Comment(0) | TrackBack(0) | 日記

2010年03月18日

UNIXコマンド scpとrsync

scpとrsyncは?


簡単に言ってしまうとUNIXの転送コマンドってとこですかね?

scpの使い方


$scp ファイル ユーザ名@グローバルIP:転送先

例えば、/home/hoge/hoge.txtをhoge.comのhogeユーザに送りたい場合
$scp /home/hoge/hoge.txt hoge@hoge.com:/home/hoge/

こんな感じでファイルを転送可能です。

rsyncの使い方


$rsync -auvz -e "ssh -p 10000" /home/hoge/boge hoge.com:/home/hoge/ --exclude-from="hoge.txt"

解説:
 「オプション」
  -a 使用用途が高いオプション群をまとめて指定するオプション
  -u 同期先のファイルがコピーファイルよりも新しい場合スキップ
  -v 進行状況の表示
  -z 転送の際ファイル圧縮
  -e sshを使用
  --exclude-from 転送する中身の指定
 「転送」
  ローカルの/home/hoge/bogeの内容を、グローバルIPがhoge.comの/home/homeへ転送します。(ただし、exclude-fromで指定している場合、指定内容のみ転送)
$vi hoge.txt
/app/*

上記は、bogeの中身がappフォルダやそれ以外があるが、appしかあげたくない場合上記の様にするとapp以下の階層しか転送しない様にできます。

scpとrsyncの違い


同期先のファイルが新しい場合上書きしないというところですかね。
コピーだけならscpで十分で、新しいのは上書きしたくない時なんかはrsyncってかんじですね。
posted by RicK at 18:36| Comment(0) | TrackBack(0) | 日記

2010年03月17日

Rails include joins

includeとjoins、Railsにしたがって大して細かいことをしない場合なんかは、includeで細かく指定したいときなんかはjoinsなんて風に自分は考えています。

なにそれ?


include・joinsなんだそれ?という方に、
これは、Railsのfind文の中に書くもので、
Hoge.find(:all, :include => 'boges')
Hoge.find(:all, :joins => 'LEFT JOIN boges ON hoges.id = boges.hoges_id')

上記のようにして、HogeテーブルとBogeテーブルを結合させています。

include


includeを使用する場合は、modelにてどのテーブルのどこを見るという下記のような指定が必要です。
$vi hoges.rb
class Hoge < ActionRecord::Base
 has_many :boges
end

$vi boges.rb
class Boges < ActonRecord::Base
 belongs_to :hoge
end

上記の例だと、hoge : boge = 1 : n(多)となっており、
カラム名を指定しない場合、HogeテーブルのidとBogeテーブルのhoge_idを自動で指定してくれます。
has_many :boges, :foreign_key => 'mo_id'

上記の様にすると、HoegテーブルのidとBogeテーブルのmo_idを見るようになります。

Hoge.find(:all, :include => 'boges')
//bogesという名前はhoges.rbのbogesと同じ名前


joins


これはSLQ(PostgreSQL)を書く内容を書くだけです。
特にこれといって書くことはないので、
LEFT JOINとRIGHT JOINの違いについて書いておきます。

LEFT JOIN


table1
----------
id | name
----------
1 | test1
2 | test2

table2
-----------
id | table1_id | name2
----------------------
1 |     1 | mo1
2 |     3 | mo2

Hoge.find(:all, :joins => 'LEFT JOIN table2 ON table1.id = table2.table1_id')

上記の場合の結果は、
table3
-------
id | name | id | table1_id | name
1 | test | 1 | 1 | mo1
2 | test2| 2 | |
つまり、table1が優先されるため、table2のtable1_id=3はtable1に存在しないので無視されます。

RIGHT JOIN


RIGHTの場合は、table2が優先されます。
table3
----------
id | name | id | table1_id | name
1 | test | 1 | 1 | mo1
| | 2 | 3 | mo2
こんな感じになります。

includeとjoinsの違い


何が違うか?
自分が思うところの違いは2点です。
1、joinsは、モデルに宣言不要
2、joinsは、selectで指定が可能。
ほかのも速度関連で違いがあると思いますけど、
まぁ何かしらincludeで不備がないかぎりincludeを普通つかいますかね。
ほかの言語のDBとかの連携だとidの決まりなんかがぜんぜん違うんでjoinsのほうがよかったりします。
posted by RicK at 16:36| Comment(0) | TrackBack(0) | 日記

2010年03月16日

Rails form check_box_tag

昨日のsubmit_tagに引き続き、check_box_tagの使い方をご紹介。

check_box_tag


これもしょっちゅう使いますね。
アンケートや設定なんかは大体チェックボックスかラジオボタンですもんね。

<% form_tag :action => "momo" %>
<&= check_box_tag "hoge", "1" %>
<%= submit_tag "登録" %>
</form>

上記の書き方で、パラメーターが
{hoge => "1"}

と返ってきます。
これが通常の使い方ですね。

複数のcheck_box


上で普通って書いてありますけど、まぁチェックボックスといったら複数ですよね。
<% form_tag :action => "momo" %>
<&= check_box_tag "hoge[]", "1" %>
<&= check_box_tag "hoge[]", "2" %>
<%= submit_tag "登録" %>
</form>

上記の書き方で、パラメーターが
{hoge => ["1","2"]}

と返ってきます。
取得したらeachでまわして使えますね。

ついでに
<% form_tag :action => "momo" %>
<&= check_box_tag "hoge[boge][]", "1" %>
<%= submit_tag "登録" %>
</form>

こんな風にすると、
{hoge => {:boge => "1"}

こんな感じでパラメーターが返ってきます。

デフォルトチェック


今までの書き方だと、チェックボックスにチェックがついていません。
最初からつけておきたい、そんなときは、
<% form_tag :action => "momo" %>
<&= check_box_tag "hoge", "1", true %>
<%= submit_tag "登録" %>
</form>

これだけでおkです。
posted by RicK at 19:20| Comment(0) | TrackBack(0) | 日記

2010年03月15日

Rails form submit_tag

今日は、Railsのformのsubmit_tagです。

submit_tagは、formの締めくくりのボタンです。

submit_tag


<% form_tag :action => "momo" %>
<&= text_field_tag "hoge", "boge" %>
<%= submit_tag "登録" %>
</form>

だいぶ適当ですけど、、hogeテーブルのbogeカラムに
何か入力して、submit_tagのボタンを押下すると、
momoにパラメータを渡しつつ遷移してくれます。

パラメータ


submit_tagを押下して、momoへ遷移してきたときのパラメータは、
{"hoge" => {"boge" => "12345"}}

このようにハッシュになって出てきます。
一個づつ取り出すなら、
params[:hoge][boge]

これで取り出し可能です。

submit_tag オプション


例えば、登録ボタンと修正ボタンを二つおきたくて、違う場所に遷移させたい場合、actionはひとつしか指定できませんので、
まず、momoへ遷移させてからパラメータで判断してredirectさせます。
<%= submit_tag "修正", :name => "edit"%>

上記によるパラメータは、
{"edit" => "修正"}

となりますので、コントローラで受け取って分岐させます。
def momo
 unless params[:edit].blank?
  render :action => "edit"
 end
end

適当にパラメータをつけても反応してくれないのでご注意を。
posted by RicK at 19:40| Comment(0) | TrackBack(0) | 日記

2010年03月12日

Mduplicate key violates unique constraint "**_pkey"

何の障害もなくDBを直接操作など一切しないと件名のようなエラーはおそらくでてこないとおもいますが、
もしINSERTなどをDBで直接行うことがあった場合、おそらくこんなエラーが出てくると思います。

環境


Rails 1.2.6
PostgreSQL

問題


Mduplicate key violates unique constraint "**_pkey"

たとえば日記を投稿しようとするとおきます。
本番環境では投稿できるのに、テスト環境だとこんなエラーがおきる。。なんで?といったぐあいですね。

原因


Railsは、各テーブルをシーケンスで管理しています。
hogesテーブルがあるとしたら、hoges_id_seqというテーブルが存在するはずです。
$psql
$SELECT * FROM hoges_id_seq;
sequence_name | last_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called
----------------------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
hoges_id_seql_datas_id_seq | 2 | 1 | 9223372036854775807 | 1 | 1 | 32 | f | t

hoges_id_seqの内容は上記みたいな感じです。
今回のエラーでは、このlast_valueというカラムが重要です。
$psql
$SELECT * FROM hoges order by id desc limit 1

上記のコマンドを打つとどんなIDが返ってくるでしょうか?
last_valueの2とは違うIDのはずです。
例えば、hogeのIDが3の場合last_valueが2なので、Railsは次に入れる場所はID3だと思い続けてしまいます。
しかし、実際はID3はデータが入っています。
そのため、すでに値が入っています。というエラーが発生してしまうわけです。

解決策


$psql
$SELECT SETVAL("hoges_id_seq", 3);

これで、last_valueの中身が3になればOKです。
posted by RicK at 12:41| Comment(0) | TrackBack(0) | 日記