Ruby blocks, Procs and lambdas

Rubyのブロックを使いこなせるようになると、Ruby初級者を脱した感があるかなと思います。
以下の記事はRubyのブロックとProc、lambdaについてわかりやすくまとまっています。


Ruby blocks, Procs and lambdas

このあたりが理解できると、例えば、配列の処理でなんとなく使っている以下のような構文がちゃんと理解できるようになります。
[ruby]
ary = [1, 2, 3]
ary.map! {|i| i * 3 } #=> [3, 6, 9]
[/ruby]

form_helperのselectがdisabledにならない

form_helperで生成したselectは、オプションにdisabledを指定しても反映されません。
disabledにしたい場合には、HTMLオプションに指定します。
[ruby]
<%= f.select :content, options, {}, :disabled => true %>
[/ruby]

参考: RUBY ON RAILS – DISABLING A SELECT TAG USING THE SELECT HELPER

options_for_selectで、disabledを指定することもできますが、あまりこちらは使わないかも
http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_for_select

Rails 自動生成されるパス用メソッド(Named Path)まとめ

リソースのCRUDについては、Rails Guildの2.2 CRUD, Verbs, and Actionsにまとめられています。

よく使うところを抜粋してまとめてみます。

普通のリソース

resource :photos
HTTP Verb Path action Named Helper
GET /photos index photos_path
GET /photos/new new new_photo_path
POST /photos create photos_path
GET /photos/:id show edit_photo_patth(@photo)
GET /photos/:id/edit edit photo_patth(@photo)
PUT /photos/:id update photo_patth(@photo)
DELETE /photos/:id destroy photo_patth(@photo)

resourcesに独自のパスを追加

resources: :posts do
  comment "/comment", on: :collection
end

このときのNamed パスは

comment_posts_path

 

namespeceを使った場合

namespace :admin do
  resources :posts, :comments
end
HTTP Verb Path action named helper
GET /admin/posts index admin_posts_path
GET /admin/posts/new new new_admin_post_path
POST /admin/posts create admin_posts_path
GET /admin/posts/:id show admin_post_path(:id)
GET /admin/posts/:id/edit edit edit_admin_post_path(:id)
PUT /admin/posts/:id update admin_post_path(:id)
DELETE /admin/posts/:id destroy admin_post_path(:id)

ActionMailerをsendmailで動かしたい

Rails4
http://guides.rubyonrails.org/action_mailer_basics.html#example-action-mailer-configuration

Rails3.2
http://guides.rubyonrails.org/v3.2.13/action_mailer_basics.html#example-action-mailer-configuration

[ruby]
config.action_mailer.delivery_method = :sendmail
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
[/ruby]

sendmailのテスト
[bash]
$ /usr/sbin/sendmail hoge@examle.com
Test mail
[/bash]
[Ctrl+D]で送信

OCFS2でクラスタしてみる

以下のアドレスの2台のノードでクラスタを構成します。

1.2.3.1
1.2.3.2

FireWallの設定
クラスタに参加するノードはそれぞれ7777をお互いに受け入れるように設定する必要があります。

UFWなら
1.2.3.1

ufw allow from 1.2.3.2 to any port 3260

1.2.3.2

ufw allow from 1.2.3.1 to any port 3260

1台目(1.2.3.1)

$ hostname
iscsi-client-01
$ sudo vi /etc/ocfs2/cluster.conf
node:
	name = iscsi-client-01
	cluster = ocfs2
	number = 0
	ip_address = 1.2.3.1
	ip_port = 7777
node:
	name = iscsi-client-02
	cluster = ocfs2
	number = 1
	ip_address = 1.2.3.2
	ip_port = 7777
cluster:
	name = ocfs2
	node_count = 2
$ sudo service o2cb restart
$ sudo mount -t ocfs2 /dev/sda /mnt/ocfs2/

2台目(1.2.3.2)

$hostname
iscsi-client-02
$sudo vi /etc/ocfs2/cluster.conf
node:
	name = iscsi-client-01
	cluster = ocfs2
	number = 0
	ip_address = 1.2.3.1
	ip_port = 7777
node:
	name = iscsi-client-02
	cluster = ocfs2
	number = 1
	ip_address = 1.2.3.2
	ip_port = 7777
cluster:
	name = ocfs2
	node_count = 2
$ sudo service o2cb restart
$ sudo mount -t ocfs2 /dev/sda /mnt/ocfs2/

トラブルシューティング

2台目のマウントに以下のエラーで失敗した場合

mount.ocfs2: Transport endpoint is not connected while mounting /dev/sda on /mnt/ocfs2/. Check 'dmesg' for more information on this error.

/var/log/syslog エラー1

Aug 16 18:58:09 localhost kernel: [ 4520.624131] o2net: Connect attempt to node iscsi-client-01 (num 0) at 1.2.3.1:7777 failed with errno -22

以下を確認してください

  • ポート7777が開いているか?
  • 各nodeのip_addressは正しく設定されているか?
    各ノードは自分のノードに指定してあるIPアドレスでバインドされるため、127.0.0.1などでなく実際にアクセスされるアドレスを指定します。

/var/log/syslog エラー2

Jun 22 00:14:51 isci-client-02 kernel: [17472.209613] Please double check your configuration values for 'O2CB_HEARTBEAT_THRESHOLD'
Jun 22 00:14:51 isci-client-02 kernel: [17472.345474] (20121,0):o2net_check_handshake:1264 node ubuntu21 (num 0) at 1.2.3.1:7777 uses a heartbeat timeout of 238000 ms, but we use 60000 ms locally.  disconnecting

ログに出ている通りO2CB_HEARTBEAT_THRESHOLDの長さが足りないので設定する

$ sudo /etc/init.d/o2cb offline
$ sudo dpkg-reconfigure ocfs2-tools

O2CB heartbeat thresholdを設定
ocfs2-tools
反映を確認後、起動

$ cat /sys/kernel/config/cluster/ocfs2/heartbeat/dead_threshold
61
$ sudo service o2cb start
$ sudo mount -t ocfs2 /dev/sda /mnt/ocfs2/