2012-09-29

ActiveRecordの変更履歴を保存するにはpaper_trailがよさげ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
以前、rails2.3の時はActiveRecordでデータの履歴管理をするというエントリで
vestal_versions
がよさげとしていましたが、どうやら今は、
paper_trail
が人気な気配です。

https://www.ruby-toolbox.com/categories/Active_Record_Versioning
にいろいろな履歴管理のものが紹介されています。

ちなみに
paper_trail
を利用するには以下のような感じです。

Gemfileに以下を追加してbundle installします。
gem 'paper_trail', '~> 2'

そして
rails g paper_trail:install --with-changes
とします。するとversionsという履歴管理用のテーブルのmigrationが作成されます。
ちなみに--with-changesとつけるとchangesetというカラムに変更された場所だけ記録することができるようになります。

そして
rake db:migrate
します。

履歴を残したいmodelに以下のようにすると履歴情報が残せるようになります。
class Blog < ActiveRecord::Base
  has_paper_trail
end

履歴情報は以下のような感じで取得できます。

すべての変更履歴情報を取得
blog.versions

最新の変更履歴情報を取得
blog.versions.last

変更前の情報を取得
blog.versions.last.reify

変更した部分だけの情報の取得
blog.versions.last.changeset
これで
{'article' => ['変更前', '変更後']}
みたいな形で取得できます。

結構他にもいろいろなことができそうです。
詳しくは以下を見てみてください。
https://github.com/airblade/paper_trail

2012-09-28

iphone4Sのケースをxperia SXにつけてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
xperia SXを買って、スマホケースをつけてみたい気分になってみました。

しかしxperia SXのスマホケースはそんなに種類がないし、ちょっと試すには高いなぁとか思っています。

そこでiphone4Sのケースに注目してみました。
というのもxperia SXとiphone4Sのサイズがすごく近いというのに気づいたからです。

それぞれのサイズは以下のような感じです。

Xperia SX  54(W)×9.4(D)×115(H)mm
iPhone 4S  58.6(W)×9.3(D)×115.2(H)mm


さすがのiphoneはケースの品揃えもすごいし、100円ショップにもあるというのが魅力でお試しするにはよさげです。
iphone5が発売されたので、今後おしゃれなiphone4S関連商品が安くなっていく可能性があるのかもとか思っています。

で100円ショップで以下のケースを買ってみました。

これをxperia SXにつけてみました。
ぱっと見よさそうに見えます。縦と厚さは確かに問題ないのですが、幅はちょっとカパカパする感じです。
落ちてしまうということはないのですが、ちょっと気になります。

表はこんな感じなのですが、裏はこんな感じです。
カメラの位置が違います・・・
このまま写真を撮ると・・・
トイカメラ風の味があると好意的に見ることもできますが、いつもこれでは困ってしまいます。

他の面も見てみましょう。

まずは上面です。ヘッドホンをさすところがあります。
ぼけてしまっていますが、ヘッドホンの位置が違います。ヘッドホンがさせません・・・

続いて右面です。電源ボタンや音量ボタンがあります。
ケースには何もありません。ソフトケースなので電源ボタンや音量ボタンの操作はできます。
ただカパカパしているので、ちょっと使いにくいです。

左面です。microUSB端子があります。
いい感じの位置に穴が開いているようですが、小さすぎてmicroUSB端子を差すことはできません。

最後に下面です。特に何があるというわけではないです。強いて言えばストラップホールがあるぐらいです。
ケースには余計な穴が開いています。そしてストラップケースの位置とはあいません。

とりあえず実用を考えると、
①カメラの穴の位置
②microUSBが挿せない
③ヘッドホンが挿せない
が問題かなと思います。

というわけで、ソフトケースなので強引に切ってみました。
ソフトケースですが、加工は結構大変です。

まずはカメラの穴対策です。
すごく広げることになりました。そしてかっちょ悪くなりました。
しかし、カメラは普通に使えるようになりました。
この通りです。

続いてヘッドホン対策です。
ちょっと穴が小さすぎました。ぎりぎり挿せないことはないけど、とても扱いにくいです。
もっと大きな穴が必要です。
そしてやっぱり2つ穴があり、かっちょ悪いです。

最後にmicroUSB対策です。
ここの加工が一番大変でした。もともとあいている穴を広がるスペースが狭い中広げるのは、なかなか大変です。
他の二つに比べれば、かっちょ悪い感じは若干ましかもしれませんが・・・


というわけで、結論的にはiphone4ケースは、カメラをトイカメラ風に使い、ヘッドホンを利用せずにに充電時にはケースをはずして充電するようにすれば使えないことはないかな?という感じです。

普通に使いたい場合は、もっとうまくカットできて、さらに余計な穴をオシャレにふさぐなどことができる技術が必要です。

普通にxperia SXのケースを買ったほうがよさそうです。

店頭では、xperia SXのケースの数はそんなにないのですがamazonさんで調べれば結構ありました。
amazonさんでxperia SXのケース

2012-09-21

ActiveScaffoldで新規作成画面にデフォルト値を表示する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActvieScaffoldで新規作成画面にデフォルト値を埋め込む方法です。

対象のコントローラーに以下のような感じのdo_newを作成すればOKです。

protected
def do_new
  super
  @record.end_date = 1.month.from_now
end

superは忘れてはだめです。
そして@recordに値を設定すればOKです。
上記の例ではend_dateに今日の1ヶ月をデフォルト値として埋め込んでいる例です。


ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ


2012-09-18

xperia tabletを買ったよ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
xperia SXを買ったのに続き、xperia tabletも買いました。



こちらもなかなかよいです。

まず軽いです。初代ipadは使っているのですが、こちらを使ってしまうとipadが重く感じるのと、あとさすが新しい端末だけあって動作が軽快です。
なので、ipadよりもこちらを優先して使う感じになっています。

他にもテレビリモコンにもなるのは、何かと便利です。
結構テレビ見ながら、雑誌感覚でタブレットも見るみたいなこともあるのでタブレットからテレビを操作できるのは結構便利です。

あと、ゲストモードというのがあってこれが便利です。
うちでは子供用のゲストモードを用意して子供に触らせてもよいアプリだけを表示させるようにしています。
ipadの時は、まれによけいなことをされたりしたので、このゲストモードは相当便利です。


残念こととしては、スリープしたときにいちいちwifiも切断される感じで、スリープから復帰したときにwifiへの接続がもたつく感じがあります。

あともう一つ残念なこととしては、防水のため充電ケーブルをさすところにカバーがしてあるのですが、これが充電するときにいちいちはずすのが面倒です。

なので以下のクレードルはあったほうが便利です。(もちょっと安いとうれしいのに・・・)



まだまだ使い始めたばかりの感想です。

2012-09-17

iphone5が発表されたけどxperia SXを買ったりした

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
iphone5が発表されてiphone5への注目が集まっている中、
xperia SXを買いました。

iphoneはいい端末だと思うのですが、
いろんなセンサー系などをついていたり、arudinoとの接続も簡単そうなandroidのほうに興味がったのでiphoneの購入はまったく考えていなかったのです。

ですが、android端末はでかいのが多すぎです。
なのでxperia SXです。

発売された直後は、品薄みたいでしたが、
最近はだんだん出てきている感じですが、全色すべてそろっているというのは、なかなかない感じです。

で、xperia SXですが、よいです。
動作もいい感じですし、なにより大きさがほんとによいです。

xperia SXに限らず最近のスマートフォンでは充電ケーブルとかがついてきません。
なので充電ケーブルを購入する必要があります。

とりあえず昔のFOMAの充電ケーブルがあったので、FOMA->microUSB変換ケーブルがあれば充電はOKです。



100円ショップにも変換ケーブルはあるので、それでもよいかもしれません。

しかしこれだけでは、スマホに音楽データを入れることなどができないので、USBでスマホと接続できるケーブルも必要なことを忘れてはいけないのでした。


こちらは100円ショップにもあるのですが、データ通信できずに充電だけできるというのが多いです。
なので間違って買わないように注意してください。
meet.という100円ショップにはあるようです。

せっかくUSBとmicroUSBのケーブルを買ったら以下のようなコンセントからUSBを充電できるものもあると便利だと思います。



というわけで、xperia SXはよいよということと、スマホを買ったらコンセントからUSB機器を充電できるものとデータ通信ができるUSB-microUSBケーブルがあると便利ですよということでした。


2012-09-14

rubyでDate.todayを使っているメソッドのspecを書くとき

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyでDate.todayをどこかで使っているメソッドのspecを作るときのことです。

単に今日の値を表示するだけならば、普通にテストすればよいと思うのですが、
今日の日付によって動作が変わるときの場合です。

そんなときは、
Date.stub!(:today).and_return(Date.new(2012, 9, 14))
みたいにstubを用意してやって、テストを実行する感じです。

2012-09-13

ActiveScaffoldを使っているときにログインユーザ情報をモデルに持ち込む方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ログインしているユーザ情報をモデルでも利用できるようにしたい場合です。

以下のような手段があるようです。
http://rails-bestpractices.com/posts/47-fetch-current-user-in-models

ActiveScaffoldを使っていれば、以下のようにcontrollerにcurrent_userメソッドを定義すれば、
modelでcurrent_userが使えるようになります。

以下のような感じです。
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  protected
  def current_user
    User.find(session[:user_id])
  end
end

app/models/aaa.rb
class Aaa < ActiveRecord::Base
  def set_user_info
    self.user_name = current_user.name
  end
end

みたいな感じです。

以下が参考になります。
http://www.ibm.com/developerworks/jp/linux/library/l-activescaffold/
https://github.com/activescaffold/active_scaffold/wiki/Security

current_userがモデルで使えるようになる処理は

lib/active_scaffold/active_record_permissions.rb
に記載されています。
ざっくりとした仕組みとしては、以下のような感じのことが行われているようです。

#モデル相当のもの
class Moo
  class << self
    attr_accessor :test_func
  end
  
  def current_user
    Moo.test_func.call
  end
end

#コントローラ相当のもの
class Con
  attr_accessor :val
  
  def set_mod_func
    Moo.test_func = proc { p "========#{@val}" }
  end
end

c = Con.new
c.val = "111"

m = Moo.new
m.current_user
NoMethodError: undefined method `call' for nil:NilClass

c.set_mod_func
m.test
"========111"


ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ

2012-09-12

ActiveScaffoldでmodelのデータ内容に応じて変更できたり、できなかったりする方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldでmodelのデータ内容によって変更の可否を決めたい場合などのケースです。

たとえばあるモデルの状態が特定の値になったら変更できなくする場合です。

モデルにauthorized_for_update?という関数を定義しtrueを返せば変更ができてfalseを返すと変更ができなくなります。
class Sample < ActiveRecord::Base
  def authorized_for_update?
    if self.status < 99
      true
    else
      false
    end
  end
end

画面上では、変更できないレコードの変更ボタンがグレーになり利用できなくなっています。

authorized_for_update?をauthorized_for_delete?にすると削除できたり、できなかったりになります。

以下が参考になります。
https://github.com/activescaffold/active_scaffold/wiki/Security

ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ



2012-09-11

ActiveScaffoldでsession情報によってメニューを出したり出さなかったり

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldでsessionにuser情報などを入れておいてログインしたユーザによって利用できる機能を変えるといったことをやる方法です。


class SampleController < ApplicationController
  
  #filterを利用するのがポイントです
  before_filter :update_table_config

  active_scaffold :samples do |config|
    #ここの処理はだいぶ早い段階で処理されるようでsessionオブジェクトが生成されていません
    config.label = "Sample"
    ・・・
  end

  protected
  def update_table_config
    #ここでsessionを利用して変更ができます。
    #Uesrモデルをsession[:user]にセットする処理はApplicationControllerなどで行います
    #年齢によって変更できるカラムが異なる例です
    if session[:user].age >= 20
      active_scaffold_config.update.columns = [:hobby,:smoke,:sake]
    else
      active_scaffold_config.update.columns = [:hobby]
    end
  end

end


active_scaffoldブロックの中で記載している設定をfilterではactive_scaffold_configというのに記載すればsession情報によって画面内容を変更できます。
ただfilter内ではすべての設定項目を変更できるわけではなさそうです。
試した限りactionsとnestedは利用できませんでした。

以下が参考になります。
https://github.com/activescaffold/active_scaffold/wiki/Per-Request-Configuration


ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ

2012-09-07

日よけ付きスマホカバーを試作してみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
晴れた日、外でスマホの画面って見えにくいですよね。
これを何とかできないかなぁと思って、日よけつきのスマホカバーをダンボールで試作してみました。

こんな感じです。画面側にもカバーがある感じのケースです。


開くとこんな感じです。


光の下では、通常こんな感じで見にくいです。


カバーの途中でちょっと折れる感じで日よけになります。カバーの一部は日よけの支えにしてみました。
ちょっと見やすくなったような気がしないでもないです。

横から見るとこんな感じです。


どっかに、こんな感じでもっと良さげなスマホカバーないかなぁと思ってみたしだいです。

2012-09-06

MANHATTAN PASSAGEのカバンを買い換えた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
今までMANHATTAN PASSAGEのサイドウェイズパックというカバンを使っていました。

 

かなり気にいって長い間使っていたのですが、今年の暑さのせいか肩紐に汗染みみたいなものが入ってしまったのと、一部ほつれが出てきたので買い換えることにしてみました。

こんどはシティ トレイルというカバンにしてみました。



サイドウェイズパックに比べると横幅がスリムになっていて肩紐部分のつくりがだいぶしっかりした感じです。
MANHATTAN PASSAGEらしく、いろんな小ポケットがついていて、いろいろ入れることができる感じです。
こちらも、気に入ったので長く使っていこうと思ったりしています。
なかなかオススメのバッグです。