RSpecを使ってViewのスペックを書く時のメモ。

  • RSS Builder等を使っている場合も、renderでOk
       1  render 'articles/index.rss.builder'
    
  • renderはデフォルトではlayoutを伴わないので、必要に応じて明示的に指定する。
       1  render 'articles/index', :layout => 'application'
    
posted by Png genki on Wed 13 Aug 2008 at 15:25

Formulaは、 数式をブログにはりつけて共有するコミュニティサービスです。

このたび、FormulaでXyMTeX記法による化学構造式が利用できるようになりました。 以下のような化学構造式を簡単にブログに埋め込むことができるようになります。

XyMTeXの記法については、以下のサイトを参照ください。

See Also

本サービスに関する各種お問い合わせは までお気軽にお寄せください。

posted by Png genki on Mon 11 Aug 2008 at 21:45

Formulaは、 数式をブログにはりつけて共有するコミュニティサービスです。

このたび、Formulaで利用できるLaTeX記法が増えました。 具体的には、eqnarray*環境で利用可能なLaTeX記法をほとんど全て利用することができます(セキュリティ上の観点から、一部のコマンドは無効化されています)

以下のように、複数行の数式を記述することもできるようになりました。

連立方程式も変数を揃えて記述できます。

posted by Png genki on Sun 10 Aug 2008 at 18:22 with 1 comment

Rubyに複数の脆弱性

Rubyに複数の脆弱性が発見されました。最新バージョンへのアップグレードを推奨します。

ということで、EC2で使ってるRubyをruby 1.8.7 (2008-08-08 patchlevel 71) [i686-linux]にアップデートしました。

よろしくお願いします。

posted by Png genki on Fri 8 Aug 2008 at 16:28 with 1 comment

Redmineで2203年の予定を立てようとしたところ、エラーが出たので原因を調べていました。 どうやら、Railsのdistance_of_time_in_wordsでエラーが出ているようです。

   1  def distance_of_time_in_words(
   2      from_time, to_time = 0, include_seconds = false)
   3    from_time = from_time.to_time if
   4      from_time.respond_to?(:to_time)
   5    to_time = to_time.to_time if
   6      to_time.respond_to?(:to_time)
   7    distance_in_minutes =
   8      (((to_time - from_time).abs)/60).round
   9    distance_in_seconds =
  10      ((to_time - from_time).abs).round

8行目あたりの減算でエラーが出ているようです。 実際、以下のような減算をしようとするとエラーが出ます。

   1  Time.now - Date.parse("Mon, 01 Aug 2203").to_time
   2  #=> RangeError: time - 7371010800.000000 out of Time range

ということで、あまりにも長い時間である場合には、 以下のような例外処理で対処するようにしました。

   1  module ActionView
   2    module Helpers
   3      module DateHelper
   4        def distance_of_time_in_words_with_limit(
   5          from_time, to_time = 0, include_seconds = false
   6        )
   7          distance_of_time_in_words_without_limit(
   8            from_time, to_time, include_seconds)
   9        rescue
  10          'a long time'
  11        end
  12        alias_method_chain :distance_of_time_in_words, :limit
  13      end
  14    end
  15  end

これで23世紀の予定も思いのままです。

posted by Png genki on Fri 8 Aug 2008 at 07:10

セキュリティ強化のために、管理画面のURLを若干変更いたしました。 管理画面での各種操作については、 特にこれまでと変わりなく利用できます。

ブラウザ上で管理画面を開いた状態にしている場合は、 お手数ですが一度開きなおしていただけますようお願いいたします。

posted by Png genki on Wed 6 Aug 2008 at 16:37

secondlifeさんのご指摘の通り、 この方法ではうまくいかない事がわかりました。

代案を探してみたところ、 とりあえず以下のようにすることで目的を果たせるようです。

  1. 空ディレクトリとしたいディレクトリ(例えばtmp/)の中に.gitignoreファイルを置く
  2. tmp/をROOTの.gitignoreファイルの中でignoreする
       1  tmp
    
  3. git add tmp/.gitignoreをする。

.gitignoreファイル自体は含まれてしまいますが、 実用上は問題なさそうですね。 しかし、完全な方法は無いものか・・・。

See Also


log/tmp/ディレクトリの中身はignoreしたいけれど、ディレクトリそのものの存在はリポジトリに含めたい場合は、以下のように.gitignoreを書けば良いみたいです。

.gitignore

   1  log/**/*
   2  tmp/**/*

Zshで特定のディレクトリ以下のrbファイルを全部開きたい時などに、

   1  vim **/*.rb

などとやりますが、そんな感じですね。

posted by Png genki on Wed 6 Aug 2008 at 09:37 with 2 comments

このところ、named_scope関係のバグの原因と対処法を調べるために ActiveRecordのEager Loadingの実装を調べていました。 ActiveRecordのEager Loadingは、 Rails2.1から、若干生成するSQLが変化しています。

Rails 2.1 Eager Loading

上記サイトでも紹介されているように、 今まではLEFT OUTER JOINを使って、 一回のクエリで全て読み込むようなSQLを生成していたのですが、 Rails2.1からは、複数回のクエリに分割するようになりました。

ということで、Eager Loadingを実際にやっているコードを調べてみたのですが、自分で好きなタイミングでEager Loadingを行う方法を見つけたので紹介します。

ActiveRecord::BaseクラスのprotectedメソッドActiveRecord.preload_associationsを利用します。

   1  articles = Article.all(:limit => 5)
   2  Article.send :preload_associations, articles, [:user => :face]

1行目は普通にEager LoadingせずにArticleリストを取得していますが、 二行目を実行することで、各ArticleのアソシエイションがEager Load されます。あとは、

   1  articles.first.user.face

などを実行してもSQLクエリは発行されません。 実質的に発行されるSQLは通常の:include を指定した場合と同じになるので、好きなタイミングでEager Load を実行できるようになったといえます。

posted by Png genki on Mon 4 Aug 2008 at 21:10

SQLのログを見ていて気がついたのですが、 最近のActiveRecordは以下のようにEagerLoadingしようとすると、 こんな感じのSQLを発行します。

   1  ?> Article.find(:all, :include => [:user => :face]);1
   2  => 1
   3  >>   Article Load (0.005234)   SELECT * FROM `articles`
   4    User Load (0.000645)   SELECT * FROM `users` WHERE (`users`.id IN ('13','9','37','17','1','3'))
   5    Face Load (0.002931)   SELECT `faces`.* FROM `faces` WHERE (`faces`.user_id IN (1,3,9,13,17,37))

以前のようにJOINを使わずに、3回に分けるようになっているのですね。

しかしながら、条件が複雑になってくると、 :limitオプションとの相性が悪いケースがあるようで、 まだ若干バグがあるようです。 そんな時は手で:joinsを書いています。

posted by Png genki on Sun 3 Aug 2008 at 22:18

いくつか要望をいただいていた、 コピー&ペーストする時に行番号は邪魔になるという問題を解決するために、 コピー&ペーストモードを実装いたしました。 ソース部分をクリックすると、行番号が隠れるようになります。 ソース部分の外をクリックすると元に戻ります。

以下テスト用。

   1  class User < ActiveRecord::Base
   2    has_many :comments
   3  end

  • インデント対応テスト
       1  def foo
       2    puts "foo"
       3  end
    

一行テスト。

   1  Hash.new({})

posted by Png genki on Sun 3 Aug 2008 at 11:49