読者です 読者をやめる 読者になる 読者になる

PerlerのRuby日記

Rubyとか

配列の要素を条件によって2つに割ってループしたい

配列の中のものに同じ処理を施すんだけど、先に奇数を処理してから、偶数を処理したい。

numbers = [1,2,3,4,5,6,7,8,9,10]
numbers.select{|n| n.odd?}.each{|n| puts n*n}
numbers.reject{|n| n.odd?}.each{|n| puts n*n}

Array#rejectとかselectでは、条件によって割ることができなくって、探したらArray#partitionがあった。

numbers.partition{|n| n.odd?} #=> [[1, 3, 5, 7, 9], [2, 4, 6, 8, 10]]

都合よく前半後半に分割されたので、flattenしてeachできた。

numbers.partition{|n| n.odd?}.flatten.each{|n| puts n*n}

剰余算の自己代入の優先順位

よく変数に数を足し込むときには、+=を使う。
これと同じように掛け算、割り算も*=、/=が使えるけれど、この場合の四則演算の優先順位が気になったのでやってみたメモ。

a = 120
a /= 12 + 3
puts a #=> 8

# 120 / (12 + 3) = 8
# 120 / 12 + 3 = 13

b = 12
b *= 5 + 3
puts b #=> 96

# 12 * (5 + 3) = 96
# 12 * 5 + 3 = 63

よって、右辺が計算された結果が先に格納された値と演算しているということがわかった。

Capistrano3のデプロイのリポジトリ先を変更する

Capistrano3を使ってデプロイを行っているアプリがあったのだけれど、途中でgitのリポジトリを変更しなければならなくなってしまったので、そのときのメモ。

config/deploy.rbのrepo_urlを変更する。

diff --git a/config/deploy.rb b/config/deploy.rb
index 871df02..ba68d20 100644
--- a/config/deploy.rb
+++ b/config/deploy.rb
@@ -2,7 +2,7 @@
 lock '3.2.1'

 set :application, 'mywebapp'
-set :repo_url, 'git@git123.foo.com:mywebapp.git'
+set :repo_url, 'git@git789.bar.com:mywebapp.git'

 # Default branch is :master
 ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call

新しいgitリポジトリに向き先を変えて、pushする。

$ git remote set-url origin git@git789.bar.com:mywebapp.git
$ git push -u origin master

ここまでは簡単なのだけれど、Capistrano3ではこのままだとまだ旧リポジトリの方を参照し続けてしまうので、デプロイ先のサーバで作業が必要だった。

$ cd /var/www/mywebapp
$ rm -r repo

deploy_toに設定しているディレクトリの、「repo」というディレクトリに既存のリポジトリ情報が入っているので、一度消してしまえば次からは上で設定したrepo_urlのリポジトリを見るようになる。


試してないけど、

$ cat repo/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = true
[remote "origin"]
	url = git@git123.foo.com:mywebapp.git
	fetch = +refs/*:refs/*
	mirror = true

のurlを書き換えるだけでもいけるかもしれない。

あとはデプロイ。

$ bundle exec production deploy


参考:
ruby - Capistrano deploy fails after I changed the repository URL - Stack Overflow