ActiveRecord::RecordNotSaved - before_save problem

ActiveRecordのクラスで、before_* コールバック がfalseを返すと、以降の処理がキャンセルされてしまうから、saveもされなくなる。
Rubyのメソッドは最後に評価された式が返り値になるから、うっかりコールバックがfalseを返してしまい、saveで変更が保存されず、「どうしてなのか?」とはまることがある。
そういう時は明示的にメソッドを
true
で終わるようにする。
after_* コールバックがfalseを返す場合も、以降のコールバックがキャンセルされてしまう。

If a before_* callback returns false, all the later callbacks and the associated action are cancelled. If an after_* callback returns false, all the later callbacks are cancelled. Callbacks are generally run in the order they are defined, with the exception of callbacks defined as methods on the model, which are called last.

Sketchpad - Dan Sketcher's personal blog » Blog Archive » ActiveRecord::RecordNotSaved - before_save problem

追跡ブランチを作成する

リモートブランチを追跡するブランチ(tracking branch)を作成する

git branch [branch] [remotename]/[branch]
git checkout -b [branch] [remotename]/[branch]

例:origin/serverfix を追跡するローカルブランチsfを作成してチェックアウト。

$ git checkout -b sf origin/serverfix

既存のローカルブランチにリモートブランチを追跡させる

既に手元にあるローカルブランチを、リモートブランチの取り込み先に設定したい場合や、追跡する上流のブランチを変更したい場合。

現在のブランチ

git branch -u [remotename]/[branch]

ローカルブランチを指定

git branch -u [remotename]/[branch] [branch]

例:現在のローカルブランチにorigin/masterを追跡させる。

$ git branch -u origin/master

例:ローカルブランチsfにorigin/serverfixを追跡させる。

$ git branch -u origin/serverfix sf

3.5 Git のブランチ機能 - リモートブランチ

cronでRVMのRubyを使う

現在のRVMでは、以下の方法では、
line 2: rvm: command not found
というエラーになります。
今はもっとよい方法があるので、以下をご覧ください。
cronでRVMのRubyを使う

RVMで複数のRuby環境がある場合に、Railsアプリケーションのためのcronをどうするか? Rubyのパスはフルパス指定すればいいが、gemがRVMのgemを見に行かないのが問題。RVM環境でcronを実行する必要がある。

  1. crontabでrvmのrubyを使う - 橋本詳解
  2. RVM and cron in production
  3. rvm+railsなアプリケーションをcronで動かす - sanojimaru.com

1.の方法にしてみた。
以下のような感じ。

cron用スクリプト

/home/pistolfly/app_dir/cron/delete_sessions.sh

source /home/pistolfly/.rvm/scripts/rvm
rvm use 1.8.7 > /dev/null
cd /home/pistolfly/app_dir
ruby script/runner -e production "ActiveRecord::SessionStore::Session.delete_all(['sessions.updated_at < ?', 1.day.ago])"

cronの設定

$ crontab -e
*/10 * * * * sh /home/pistolfly/app_dir/cron/delete_sessions.sh

RubyGemsのバージョンダウン、バージョンアップ

バージョンダウン

目的のバージョンのrubygems-updateをインストールする。

$ sudo gem install rubygems-update -v 1.6.2

もし、目的のバージョンより新しいバージョンのrubygems-updateがインストールされている場合は、アンインストールする。

$ sudo gem uninstall rubygems-update -v 1.8.15

update_rubygemsコマンドを実行する。

$ sudo update_rubygems 
[sudo] password for admin: 
RubyGems 1.6.2 installed

=== 1.6.2 / 2011-03-08

Bug Fixes:

* require of an activated gem could cause activation conflicts.  Fixes
  Bug #29056 by Dave Verwer.
* `gem outdated` now works with up-to-date prerelease gems.


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

RubyGems installed the following executables:
	/opt/ruby-enterprise-1.8.7-2012.02/bin/gem

どんなバージョンがあるのかは以下で表示できる。

$ gem search -ar rubygems-update

*** REMOTE GEMS ***

rubygems-update (1.8.24, 1.8.23, 1.8.22, 1.8.21, 1.8.20, 1.8.19, 1.8.18, 1.8.17, 1.8.16, 1.8.15, 1.8.14, 1.8.13, 1.8.12, 1.8.11, 1.8.10, 1.8.9, 1.8.8, 1.8.7, 1.8.6, 1.8.5, 1.8.4, 1.8.3, 1.8.2, 1.8.1, 1.8.0, 1.7.2, 1.7.1, 1.7.0, 1.6.2, 1.6.1, 1.6.0, 1.5.3, 1.5.2, 1.5.0, 1.4.2, 1.4.1, 1.4.0, 1.3.7, 1.3.6, 1.3.5, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.0, 1.1.1, 1.1.0, 1.0.1, 1.0.0, 0.9.5, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.8.11, 0.8.10, 0.8.8, 0.8.6, 0.8.5, 0.8.4, 0.8.3)

バージョンアップ

特定バージョンへのバージョンアップもバージョンダウンと同様。
最新版へアップデートする場合は、バージョン指定せずにrubygems-updateをインストールして、update_rubygemsを実行する。

注意

gemのバージョンダウンをしたら、passengerで以下のような例外が発生した。

*** Exception NoMethodError in PhusionPassenger::ClassicRails::ApplicationSpawner (undefined method `full_name' for nil:NilClass) (process 2338, thread #<Thread:0x270f268>):
... 以下略

passenger-install-apache2-moduleでpassengerを再インストールして、httpdをreloadしたらなおったけど、httpdのreloadだけでよかったかも。

RubyGemsをバージョンダウンしたりバージョンアップしたり - アインシュタインの電話番号☎

RVM, Ruby 1.8.7 and OSX Lion

Mac OSX Lion で RVMでインストールしたRuby 1.8.7 で、

$ gem install rails

などとやると、

ruby-1.8.7-p352/lib/ruby/1.8/timeout.rb:60: [BUG] Segmentation fault

というエラーになってしまう。
その解決方法。
.bash_profileなどに、

export CC=gcc-4.2

とやっておいてから、RVMでRuby をインストールする。
ただし、後述するように、Xcode 4.2.1にはgccが含まれていない。別途gccを入れる必要がある。
私は、.bash_profileへの追加はせずに、RVMでのRubyインストール時に、

$ CC=/usr/bin/gcc-4.2 rvm install 1.8.7

とした。

Xcode 4.2.1 にはgcc-4.2が入っていないので、gcc-4.2を別途インストールする必要がある。
rvm requirements に記載があった。
まず、kennethreitz/osx-gcc-installer - GitHub でgccをインストール。
その後、必要があれば、Xcode 4.2.1をインストールすればよい。

osx-gcc-installerをインストールする前にXcodeをアンインストールした方がいいらしい。
Xcode4.3以降は、アンインストールはXcode.appを削除するだけでいい。

Do not install this if you already have Xcode installed! Mixing Xcode and osx-gcc-installer is known to cause various difficult-to-diagnose problems and is not recommended.

If you intend to only use command line tools you should first uninstall Xcode entirely before installing osx-gcc-installer, or see below for other options.

※ 1.9.2では、上記の問題は発生しなかった。
※ Snow Leopard では、RVMでのRubyインストール時に、

$ rvm pkg install readline
$ rvm install 1.9.2 --with-readline-dir=$rvm_path/usr

とやらないと、irbで日本語が入力できなかったが、Lionではreadlineの互換ライブラリlibeditが改善され、ふつうにインストールすれば大丈夫になった。
RVM, Ruby 1.8.7 and OSX Lion « frymanet.com

gitolite

gitosisを使っていたが、gitosisではブランチごとにパーミッションを設定できない。
gitoliteではブランチごとにパーミッションを設定できるらしいので、インストール、設定してみた。
sitaramc/gitolite - GitHub

インストール

http://sitaramc.github.com/gitolite/install.html の、root methodで行った。

設定

http://sitaramc.github.com/gitolite/admin.html
ユーザ、レポジトリの追加方法、パーミッションの設定など。

感想

gitoliteはよい!
gitosisではできないブランチごとのパーミッション設定が可能だし、設定ファイルもgitosisよりきれいで分かりやすい。(特にレポジトリが多くなった場合。)
また、ドキュメントも充実していて分かりやすいので、インストールや設定が楽だった。

その他

  • /etc/ssh/sshd_config にAllowUsersを設定している場合は、gitoliteユーザを追加すること。
  • gitoliteで管理しているレポジトリを Redmineのレポジトリブラウザで使用する場合、パーミッションに注意。
    gitoliteのデフォルトでは、push時にファイルのパーミッションが600になるので、Redmineの実行ユーザがgitoliteユーザと異なると、

    redmine fatal: Failed to resolve HEAD as a valid ref.
    

    というエラーになる。
    push時に作成されるファイルのパーミッションを変更するには、 gitoliteユーザの.gitolite.rcを以下のように編集する。

    #$REPO_UMASK = 0077; # gets you 'rwx------'
    #$REPO_UMASK = 0027; # gets you 'rwxr-x---'
    $REPO_UMASK = 0022; # gets you 'rwxr-xr-x'
    

    Redmine - redmine read git repo without having to reset - Redmine

このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります

64ビットシステムのAccess2011で、あるMDBを開いたら、以下のエラー。

このプロジェクトのコードは、64 ビット システムで使用するために更新する必要があります。Declare ステートメントの確認および更新を行い、次に Declare ステートメントに PtrSafe 属性を設定してください。

Declare Function ...

Declare PtrSafe Function ...
に修正すればOK。
なにやらかにやらメモ - Windows 7 - @ウィキモバイル