2014/07/22

Railsにてポリモーフィック関連のサンプルコード

Rails のポリモーフィック関連って便利ですよね。
でも、関連の貼り方までは結構サンプルコードが転がっているんですが、データ保存部分まで含めたものがあまりないような気がしたので、どうするのがいいかなと悩みつつ書いてみた。

has_oneの場合

has_one のサンプルとして、備考のモデルで作ってみた。
コメントは結構複数の場合があるけど、備考はたいてい 1 つしか持たないだろう。 1つしかオブジェクトを持たないので、note 属性で値を直接やりとりしたかったのでこんな風に。
Notable を include すればもう備考書き放題。

has_manyの場合

こんどは定番のタグをサンプルにしてみた。 関連テーブルをポリモーフィック関連にするわけですな。

雑感

* xxx_typexxx_id は Rails に任せる。自分では処理しない。
* 関連を定義してくれる module を作っておくと後が便利だと思う。
* t.references :taggable, polymorphic: true とするサンプルが多いけど、null が入ることは設計上ありえないんだから null: false を付けておいたほうがいいと思う。
* save_note では保存のみ実行しているけど、note_store.note が nil の場合はデータサイズ的なことを考えると note_store.destroy としてもいいと思う。(集約されるテーブルなので) まあサンプルなのでシンプルにした。

2014/07/15

Redmine 2.5.0 からプラグインでの文言上書きが復活しています

Redmine 2.3, 2.4 のころはプラグインで登録した locales よりも、本体の locales が load_path での優先度が高く、tail -f pinzo.log: Redmineのプラグインで既存の文言を上書きする みたいなことをしないと、文言を上書きできませんでした。
しかし、Redmine 2.5 からプラグインが読み込まれると、本体の locales よりも優先度が高くなるように load_path に登録されるため、特に何もせずに上書きされるようになっています。
コレが関連のチケット → Patch #12753: Update config.i18n.load_path for plugin-supplied locales - Redmine
I18n.load_path でなく Rails.application.config.i18n.load_path に追加すると。なるほど

Vagrant で Bitnami Redmine の環境を作る

検証環境として Vagrant 上に bitnami redmine を構築したのでメモ。

Vagrant

% vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
% vagrant init centos65
これで Vagrantfile が作成されたので少し編集。
起動して最新状態にしておく
% vagrant up
% vagrant ssh
$ sudo yum check-update
$ sudo yum update

Bitnami のインストール

$ sudo yum install wget
# 公式サイトでは 32bit が Recommended されているが、こっちでないと動かない
$ wget https://bitnami.com/redirect/to/38030/bitnami-redmine-2.5.2-0-linux-x64-installer.run
$ chmod 775 bitnami-redmine-2.5.2-0-linux-x64-installer.run
$ sudo ./bitnami-redmine-2.5.2-0-linux-x64-installer.run
ウィザード形式でインストールが完了するが、最初に英語を選ばないと、表示が怪しい

Redmine を自動起動に

$ sudo cp /opt/redmine-2.5.2-0/ctlscript.sh /etc/init.d/bitnami-redmine
$ sudo vi /etc/init.d/bitnami-redmine
こちらを参考に少しスクリプトを編集
$ chkconfig --add bitnami-redmine # ついでに起動しておく $ sudo sh /etc/init.d/bitnami-redmine

アクセス

いちいち ip 打つのはめんどくさいので hosts に 192.168.33.10 vm を追加して、http://vm/redmine にアクセス。
無事表示された。
こんな感じ。さすが All in one、かなりフルで入る。

2014/07/14

RxTstudy 11th で発表してきました

先日 7/12 に大阪で行われた RxTstudy 11th で一時間ほどセッションしてきました。
初の長時間セッションということで、資料作成時にどれぐらいの分量を書けばいいかわからず、時間が余った時のためにおまけネタも用意していたのですが、ちょうどいい感じで終われたので安心しました。
使わなかったおまけネタは今度どこかの LT ででも発表したいと思います。

スライドはこちら。 スライドだけではニュアンスが伝わらない部分が結構あると思いますが、@akahane92 さんが録画してくださってていて、そのうちアップされると思いますので、そちらを御覧ください。
その他のスライドや全体の感想などは @akipiiさんの第11回RxTstudy勉強会「Redmine Plugin 活用最前線」の感想~今後の課題はRedmineのエコシステムの創造 #RxTStudy: プログラマの思索にまとまっています。

以下、今回の私的な感想やフォローです。
  • 今回のRxTstudy はセッションは2つと少なめですが、どちらも一時間の長めのセッションであり、パネルディスカッションもあったので結構ボリュームも有り、人によっては疲れたかもしれません。
  • プラグインを作り始めてまだ日の浅い私と違い、@haru_iidaさんの経験からくるお話が非常に勉強になりました。
  • いくつかで、Redmine 本体のテスト実行に2,3時間という話が出ていますが、こんな感じのビルドマトリクスを Travis-CI で走らせた場合、Travisの状況によっては二時間後ぐらいに全部終わった通知が来ることもあるということです。ローカルで rake ci する分には 10〜20分足らずで終わります。
  • 私が言及した Redmine とプラグインを取り囲むエコシステムの欠乏というのがひとつの大きな主題となって「価値のある発表ができたな」という自己満足感があったw
  • プラグインを利用したRedmineの情報集約能力は非常に高いと思うのでお勧めですよ
  • Redmine環境の構築、プラグインの導入の敷居はまだまだ高いらしい。プラグイン作りまくったり自分で環境立ちあげたりしているとその辺りの感覚が薄れてしまうので、それらを考慮した開発をこれからも心がけたい
ほんまこれ

2014/07/11

tmuxとvimとpbcopy

peco/peco が便利で色々と設定をしていたら、vim のヤンク→ペーストが出来ない場合があることに気づいた。
どうも、tmux から呼び出した vim でクリップボード連携をしていると動かないらしい。
あと pbcopy も動かなかった。
調べてtmux上で起動したvimでヤンクする時にクリップボードを使う - takanamitoのブログを参考に解決したのでメモ。
# reattach-to-user-namespace をインストール
% brew install reattach-to-user-namespace

# .tmux.conf に設定追加
% echo 'set-option -g default-command "reattach-to-user-namespace -l zsh"' >> ~/.tmux.conf

# Brewfile にも忘れずに追加
% echo 'install reattach-to-user-namespace' >> ~/src/github.com/pinzolo/env/Brewfile
これで tmux からの vim や gvim でクリップボードが使えるし、pbcopy も正常に動きます。

2014/07/09

Redmine2.5.2のプラグインアップデート確認機能が使えない

前回のエントリで、せっかく新機能として追加されたプラグインアップデートの確認機能ですが、VPS 上の Redmine では失敗する。
ブラウザの開発ツールを使えば原因は一目瞭然。
アクセス先の URL がベタ書きなので、Redmine を HTTPS 運用していても http://www.redmine.org/plugins/check_updates にアクセスしてしまい、セキュリティ上ブロックされてしまう。
上の画像からそもそもリクエストを発行すらしていないことがわかる。
じゃあ、https にアクセスすればいいんじゃね?と app/views/admin/plugins.html.erb を修正してみる。
// 修正前
dataType: "jsonp",
url: "http://www.redmine.org/plugins/check_updates",
data: <%= raw_json plugin_data_for_updates(@plugins) %>,
// 修正後
dataType: "jsonp",
url: "//www.redmine.org/plugins/check_updates",
data: <%= raw_json plugin_data_for_updates(@plugins) %>,
そうすると今度は別のエラーが発生する。
リクエストは正常に発行されているが、500エラーが返ってくる。
それも当然で、https://www.redmine.org というのはどうも SVN の WebDAV アクセスで使用されているっぽい。
ちなみに直接アクセスしてみるとこんな画面になる。

これどうすんだろ?Redmine を HTTPS 運用しているのは結構多いと思うんだが、このままではこの機能を利用することはできない。
SVN のリポジトリの URL を今更変えるというのも大変だろうし。
別の URL で API を提供するのがいいんじゃねーかな?http://api.redmine.org と https://api.redmine.org みたいな感じで。

[追記]
ちなみにエラーになるのは Google chrome と Firefox で Opera と Safari は正常に機能しました。
IEでは初回に警告がでるものの「すべてのコンテンツを表示」をクリックすれば実行可能。

Redmine 2.5.2 へアップデート

さくらVPSの Redmine を 2.5.2 にアップデート。
毎回同じことやっているので、スクリプト化。
一発成功。
余程の大きく破壊的なバージョンアップでない限りコレで行けるはず。

せっかくなので、新機能のプラグインバージョンチェックを試してみると...
むむむむ、調査せねば

2014/07/04

ActiveRecord の ! つきメソッドについて

ActiveRecord の更新系メソッドには、!つきのものとそうでないものがあって、一般的には例外を発生させるかどうかの違いという認識だと思う。
しかし!が付いているからといって例外を発生させるメソッドとは限らない。
属性値を変更するだけで、!がつくと同時に保存も実行するというパターンも存在する。 なので、「decrement で減らしているけど、万が一負数になってしまった場合、例外を発生させてトランザクションを失敗させる」場合(バリデーションでやれというのは置いといて)、@user.decrement!(:count) ではなくて @user.decrement(:count).save! と書かなければならない。

あと、 becomesbecomes! という STI(単一テーブル継承)用のメソッドもあるが、これはちょっと別枠ですね。
ちなみに becomes!becomes + type カラムの変更となっていて、変換後に保存するときに便利なのかな。あんまり STI を使ったことないけど。

2014/07/03

prettyprint が有効にできた

tail -f pinzo.log: ブログデザイン変えたで有効にならねーと嘆いていた Google code prettify だが、どうやら指定するスクリプトが違っていたようだ。
<!-- 誤 -->
<script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'></script>
<!-- 正 -->
<script src='https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js' type='text/javascript'></script>
間違っていたスクリプトはモジュールだけで実行はしてくれないっぽいな。

screen から tmux に乗り換えた

tmux の存在はずっと知っていたけど、screen 自体ヘビーユーザーでもないので特に乗換のメリットが見いだせずそのまま使い続けていた。
しかし、なぜか唐突に GVim 派だけどコンソールでたまに使う Vim でも綺麗な色で使いたい!と思い、調べてみると別に特に設定などはいらなさそう。
ならなぜ俺の vim はこんなにも貧相な色なんだ!!と調べるとどうやら screen が対応していないらしい。
自前でビルドするのもめんどくさいので、tmux に乗り換えてみた。
もともと screen 自体を対した設定にしていないので、.tmux.conf も少し調べたらかけた。
しかし、これがなかなか有効にならない。C-t が効かずC-b が無効になっていない。
どうやら tmux は exit で全部終了してから、再度起動しても設定ファイルを再読み込みしてくれるわけではないらしい。
設定ファイルを再度読み込む方法はあるんだろうが、調べるのがめんどくさかったので killall tmux して再度立ち上げたらちゃんと反映された。
とりあえず今の .tmux.conf はこんな感じ。
# utf-8
set-window-option -g utf8 on
set-option -g status-utf8 on

# prefix: C-b -> C-t
unbind C-b
set-option -g prefix C-t

# ignore all bells
set-option -g bell-action none

# highlight status line on window activity
set-window-option -g monitor-activity on

# use vi keybinds
set-option -g mode-keys vi

# reduce escape key delay
set-option -sg escape-time 1

# reload ~/.tmux.conf
bind r source-file ~/.tmux.conf \; display "Reloaded!"

# show last window
bind C-t last-window

# enter copy mode
unbind Escape
bind Escape copy-mode

# enable rbenv local
set-environment -gu RBENV_VERSION

# default status color
set-option -g status-fg black
set-option -g status-bg white

# current window's status color
set-window-option -g window-status-current-fg blue
set-window-option -g window-status-current-bg white
これでカラフルな vim がコンソールでも使えるようになった。
そして、homebrew のビールも表示されるようになった。