Compact Menu 2 2.3.0a5

  • ブックマークツールバーから「新しいウィンドウで開く」を選択した場合の問題を修正しました。
  • Compact Bookmarks ボタンを追加しました。

テストリリースなので Sandbox にあります。
インストールするには Firefox Add-ons のユーザアカウントが必要です。

Firefox 3.1 に合わせて正式リリースしようといてたんですが…いつ出るのよ。

Compact Menu 2 2.3.0a4

  • 2.3.0a3 でアイコンの変更ができなくなっていたのを修正しました。
  • Thunderbird のメニューに「表示」>「ツールバー」>「メニューバー」を追加しました。

テストリリースなので Sandbox にあります。
インストールするには Firefox Add-ons のユーザアカウントが必要です。
(リリースしたのは去年ですが)

Compact Menu 2 2.3.0a3

  • ALT キーでメニューを開閉できるようにしました。
  • Fx3.1 での「ブックマーク」メニューの動作を修正しました。
  • 初期化ダイアログを追加しました。
  • ツールバーのカスタマイズの「初期設定に戻す」ボタンで、メニューバーを復元するようにしました。
  • その他、細かい修正をしました。

テストリリースなので Sandbox にあります。
インストールするには Firefox Add-ons のユーザアカウントが必要です。


前回の Compact Menu 2 2.3.0a2 もテストリリースのはずだったのに、なぜかレビュー後公開されていました。
Firefox Add-ons のシステムがいまいちわからない……。

Compact Menu 2 2.3.0a2

  • アイコンを変更可能にしました。
  • Thunderbird のアドレス帳、メッセージウィンドウ、メッセージ編集ウィンドウに対応しました。

テストリリースなので Sandbox にあります。
インストールするには Firefox Add-ons のユーザアカウントが必要です。

パイプかリダイレクトかファイル指定による入力が存在するかの判定

入力がなにも無ければヘルプ表示をしたいという場合に使える。

isinput.rb

unless File.pipe?('/dev/stdin') || IO.select([ARGF], nil, nil, 0)
  puts 'no input'
end
出力例
$ touch x
$ cat x | ruby isinput.rb
$ ruby isinput.rb < x
$ ruby isinput.rb x
no input
$ ruby isinput.rb y
isinput.rb:1:in `to_io': No such file or directory - y (Errno::ENOENT)
        from isinput.rb:1:in `select'
        from isinput.rb:1

ARGF が読めない場合の例外処理は適宜行う。

ActiveRecord で関連レコードの size をプリロードする その2

前回のやつをその後いじってた。
動作確認は ActiveRecord-2.1.2
2.1.1 では動きません。(差分があります)

使い方

records = Record.find(:all, :include => :subrecords_count)
records[0].subrecords.size # カウント SQL が実行されない

active_record_sizes_preload.rb

require 'active_record'

module ActiveRecord
  module AssociationPreload::ClassMethods
    def preload_count_associations(records, associations, preload_options={})
      preload_associations(records, associations, preload_options.merge({:only_count => true}))
    end

  protected
    def preload_associations_with_count(records, associations, preload_options={})
      records = [records].flatten.compact.uniq
      return if records.empty?
      case associations
        when Symbol, String then
          if associations.to_s =~ /(.*)_count$/
            return preload_sizes(records, $1.to_sym, preload_options)
          end
          return if preload_options[:only_count]
      end
      preload_associations_without_count(records, associations, preload_options)
    end
    alias_method_chain :preload_associations, :count

  private
    def preload_sizes(records, association, preload_options)
      class_to_reflection = {}
      records.group_by {|record| class_to_reflection[record.class] ||= record.class.reflections[association]}.each do |reflection, records|
        raise ConfigurationError, "Association named '#{ association }' was not found; perhaps you misspelled it?" unless reflection

        sizes = {}
        ids = records.map {|record| record.id}
        conditions = "#{reflection.primary_key_name} IN (?)"
        conditions << append_conditions(reflection, preload_options)
        reflection.klass.count(:conditions => [conditions, ids],
                               :group => reflection.primary_key_name
                              ).map {|record| sizes[record[0]] = record[1]}

        records.each do |record|
          unless sizes[record.id]
            record.send(association).loaded
          else
            write_attribute = defined?(record.write_attribute_without_dirty) ? record.method(:write_attribute_without_dirty) : record.method(:write_attribtue)
            write_attribute.call("#{reflection.name}_count", sizes[record.id])
          end
        end
      end
    end

  end

  class Associations::ClassMethods::JoinDependency
    def instantiate_with_count(row)
      records = instantiate_without_count(row)
      records.first.class.preload_count_associations(records, @associations) unless records.empty?
      records
    end
    alias_method_chain :instantiate, :count

  protected
    def build_with_count(associations, parent = nil)
      case associations
        when Symbol, String
          return if associations.to_s =~ /_count$/
      end
      build_without_count(associations, parent)
    end
    alias_method_chain :build, :count

    def construct_with_count(parent, associations, joins, row)
      case associations
        when Symbol, String
          return if associations.to_s =~ /_count$/
      end
      construct_without_count(parent, associations, joins, row)
    end
    alias_method_chain :construct, :count

  end

end

ActiveRecord-2.1.1 以前用 patch。

--- lib/active_record_sizes_preload.rb
+++ lib/active_record_sizes_preload.rb
@@ -30,7 +30,7 @@
         sizes = {}
         ids = records.map {|record| record.id}
         conditions = "#{reflection.primary_key_name} IN (?)"
-        conditions << append_conditions(reflection.options, preload_options)
+        conditions << append_conditions(reflection, preload_options)
         reflection.klass.count(:conditions => [conditions, ids],
                                :group => reflection.primary_key_name
                               ).map {|record| sizes[record[0]] = record[1]}

mecab-config --libexecdir の出力を修正

mecab-config.in がおかしかった。
おまけで、辞書は share にいれるものだろうという patch。

--- mecabrc.in.old      2007-01-29 00:09:05.000000000 +0900
+++ mecabrc.in  2008-10-30 22:37:47.000000000 +0900
@@ -3,7 +3,7 @@
 ;
 ; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
 ;
-dicdir =  @prefix@/lib/mecab/dic/ipadic
+dicdir =  @datadir@/mecab/dic/ipadic

 ; userdic = /home/foo/bar/user.dic

--- mecab-config.in.old 2007-10-07 23:13:12.000000000 +0900
+++ mecab-config.in     2008-10-30 22:37:47.000000000 +0900
@@ -91,7 +91,7 @@
                ;;

     --dicdir)
-               echo @libdir@/mecab/dic
+               echo @datadir@/mecab/dic
                ;;

     --inc-dir)
@@ -107,7 +107,7 @@
        ;;

     --libexecdir)
-               echo @prefix@/libexec/mecab
+               echo @libexecdir@/mecab
                ;;

     --sysconfdir)