« 2006年3月 | Main | 2006年6月 »

2006年4月 2日

virusフィルタ偉大

[ カテゴリ: Technology / Technology ]

ついでに昨年度のvirusの数も数えてみました。 完全に正確ではないんですが、サーバ側で検出して捨てた数が(フィッシングも含めて)3,000くらい。 これ、他のサーバでも一度検出して捨てられてるので、実際には倍くらいあるかもしれない。 とすると、月刊500通?まじすか。

2006年4月 9日

Sortable.createでonUpdateが効かない

[ カテゴリ: Web ]

scriptaculousにはSortableというコントロールがあります。 その名の通り、部品をソートできるという代物です。 で、ただソートできるだけでは普通は意味がなくて、 変更があったらAJAXでリクエストを投げて欲しいわけですね。 そのためのcallbackがonUpdateです。 しかし、このonUpdate、試してみてもなかなか動きません。

なんでじゃってことで調べ回りました。 てか、scriptaculousのページの構造って欲しい情報に到達しにくいんですけど。 で、結論から言うとそれはFAQにありました。

4.3 The onUpdate callback on Sortable.create doesn’t seem to work!

You’re probably missing the requirements for naming the id attributes in the elements contained in your sortable element. See Sortable.serialize for more on this.

はりゃー。ずーっとSortable.create見てたよ。てか、onUpdateに書いとけよ。 で、Sortable.serializeを見ると、

Important: For this to work, the elements contained in your Sortable must have id attributes in the following form:

 id="string_identifier" 
 // example: id="image_1" 

Only the identifier part of the id attribute will be serialized. If you want to use an other form of id attributes, you need to implement your own serialization.

まーじで。こんなのonUpdateに書いておかないとみんなはまるよ…

2006年4月10日

Builder.nodeとtableとIE

[ カテゴリ: Web ]

Builder.nodeでテーブルを作る話。 例えば<div id="tbl"></div>に対して、次のコードを実行してみます。

$('tbl').appendChild(
  Builder.node('table', [
    Builder.node('tr', [
      Builder.node('th', {rowspan:2}, 'TH'),
      Builder.node('td', 'TD1'),
    ]),
    Builder.node('tr', [
      Builder.node('td', 'TD2'),
    ]),
  ]));

期待としては以下のようになって欲しいわけですね(見やすいようにborderいれてます)。

THTD1
TD2

ところがこのコード、IEでは動きません。tableを作ったとき、 その内部にtbodyができてしまうのです。すなわち、超適当に書くと、

var node = $('tbl').appendChild(Builder.node('table'));
if (node.firstChild && node.firstChild.nodeName == 'TBODY') {
  node = node.firstChild;
}
node.appendChild(
    Builder.node('tr', [
      Builder.node('th', {rowspan:2}, 'TH'),
      Builder.node('td', 'TD1'),
    ]));
node.appendChild(
    Builder.node('tr', [
      Builder.node('td', 'TD2'),
    ]));

みたいなことをしないといけないわけです。

さてこれで動くかというと、実はまだだめです。 実行してみるとわかりますが、 rowspanが効いていません。 しかし、生成されたhtmlにはしっかりrowspanがついてるんですね。 というわけでこれはIEのバグではないかと。 すなわち、IEでJavascriptによって動的にtableを生成する場合、 現状ではrowspanは使えないということのようです。

2006年4月12日

ActionView::Helpers::FormHelperをlocal varibaleで使いたい

[ カテゴリ: Rails ]

今回はRailsの話。 local variableに対してFormHelperを使いたくなることがあります。 例えば、eachでぶんまわしたいときなんかが典型例です。 でも、ひとつめの引数object_nameからinstance variableを取りに行くので、 こりゃどうしたもんじゃいと思ってました。

で、コードを読んで目から鱗。なんと、optionsでオブジェクトを指定できるではないですか!! ドキュメントも端から端まで読むと確かにかいてーる。 例えば以下のような感じですな。

@users.each do |user|
  text_field 'user', 'name', :object => user, :name => 'user[]'
end

この例ではnameにuser[]なんてやってるので実質役に立ちませんが、 オブジェクトを指定できるのはほんとに目から鱗でした。

2006年4月15日

参照されていないレコードを探す

[ カテゴリ: Technology ]

今回はSQLの話。 一対一の関係づけを考えます。 一般的には一対多の場合と同じようにどちらかに外部参照キーをつけることになると思います。 このとき、迷子というか相方のいないレコードを探すにはどうしたらいいでしょうか。

例えば、次のようなふたつのtableがあるとします。

CREATE TABLE computers (
  id            SERIAL NOT NULL,
  name          VARCHAR(8),

  PRIMARY KEY (id)
);

CREATE TABLE keyboards (
  id            SERIAL NOT NULL,
  computer_id   INTEGER,
  keymap        VARCHAR (8),

  PRIMARY KEY (id),
  FOREIGN KEY computer_id
    REFERENCES computers (id) ON DELETE SET NULL
);

テーブルの内容には特に深い意味はありません。 で、KVMとか使ってないとしてコンピュータとキーボードは一対一の関係だとします。 Railsを使ってるとmodelは以下のようになるでしょう。

class Computer < ActiveRecord::Base
  has_one :keyboard
end

class Keyboard < ActiveRecord::Base
  belongs_to :computer
end

さて、迷子のキーボードを探すのは簡単です。

SELECT * FROM keyboards WHERE computer_id IS NULL;

問題は迷子のコンピュータを探す場合です。 一般的にどうするかはよくわかりませんが、例えば次のようにすれば実現できます。

SELECT computers.*
  FROM computers LEFT OUTER JOIN keyboards ON computers.id=keyboards.computer_id
  WHERE keyboards.computer_id IS NULL;

LEFT OUTER JOINして、さらに相方がいないやつを探しています。 Railsのmodelでは、以下のようにしておくといいでしょう。

class Computer < ActiveRecord::Base
  has_one :keyboard

  class << self
    def orphans(order = nil)
      options = {
        :select => 'computers.*',
        :joins => 'LEFT OUTER JOIN keyboards ON computers.id=keyboards.computer_id',
        :conditions => 'keyboards.computer_id IS NULL',
      }
      options[:order] = order if order
      find(:all, options)

    end
  end
end

class Keyboard < ActiveRecord::Base
  belongs_to :computer

  class << self
    def orphans(order = nil)
      options = {
        :conditions => 'computer_id IS NULL',
      }
      options[:order] = order if order
      find(:all, options)
    end
  end
end

PKG_SUGGESTED_OPTIONSなオプションを抜く

[ カテゴリ: NetBSD ]

最近(といってもだいぶ前からですが)のpkgsrcは、 options.mkを使ったシステムになってきています。 例えば、devel/aprでは、mk.confに

PKG_OPTIONS.apr=db4

と書くと、databases/db4を使ってくれるようになるわけです。

では、options.mkはどうなっているかというと、

# $NetBSD: options.mk,v 1.6 2006/04/06 06:22:00 reed Exp $

PKG_OPTIONS_VAR=        PKG_OPTIONS.ImageMagick
PKG_SUPPORTED_OPTIONS=  x11
PKG_SUGGESTED_OPTIONS=  x11

.include "../../mk/bsd.options.mk"

.if !empty(PKG_OPTIONS:Mx11)
BUILDLINK_API_DEPENDS.jasper+=  jasper>=1.701.0
DEPENDS+=               mpeg2codec>=1.2:../../graphics/mpeg2codec

.include "../../graphics/jasper/buildlink3.mk"
.include "../../graphics/libwmf/buildlink3.mk"
.include "../../mk/x11.buildlink3.mk"
.else
CONFIGURE_ARGS+=        --without-x
.endif

という感じ。これはdevel/aprじゃなくてgraphics/ImageMagickです。

ここで大事のなのは

  • PKG_OPTIONS_VAR
  • PKG_SUPPORTED_OPTIONS
  • PKG_SUGGESTED_OPTIONS

の3つ。一番最初のものはオプションを指定するときに使う変数名で、 この例ではmk.confでPKG_OPTIONS.ImageMagickを設定すればいいことがわかります。 二番目はこのパッケージでサポートされているオプションで、 ここではx11というオプションが指定できることがわかります、と。

さて、問題は最後のひとつです。 これは、デフォルトで使われるオプションを示しています。 すなわち、mk.confになにも書かなければx11を指定したと云うことになるわけです。 それじゃあ、x11というオプションをつけたくない場合はどうするんだってことで、

PKG_OPTIONS.ImageMagick=

とか書いてみたくなりますよね。でもはずれです。 実はPKG_SUGGESTED_OPTIONSで指定されたオプションを抜くためには、 以下のようにしなければなりません。

PKG_OPTIONS.ImageMagick = -x11

これは知らないとわかんないなあということで、メモでした。

2006年4月17日

自動でデフラグ

[ カテゴリ: Windows ]

ファイルシステムの断片化が発生するとアプリケーションの起動などが猛烈に遅くなることがあります。 断片化を解消することを一般的にデフラグといいます。 Windowsでは日課のようにデフラグしてるひともいるかもしれません。 でも、自動でやりたいですよね、こんな仕事。

WIndows XPでは(もっと前からかもしれないけど)、 デフラグのためのコマンドラインツールが提供されています。 これを使えば、タスクに登録して定期的に自動でフラグという芸当が可能です。

c:\windows\system32\defrag.exe c:

なんていうコマンドを登録しておくといいでしょう。 私の場合は毎週土曜日の明け方4時にデフラグしています。

2006年4月20日

続:ActionView::Helpers::FormHelperをlocal varibaleで使いたい

[ カテゴリ: Rails ]

先日、FormHelperでobjectを指定する方法について書きましたが、 Rails 1.1からはform_forとfieldsforを使って同様のことができるようになったようです。 正しい使い方なのかなんだかよくわかりませんが、

@users.each do |user|
  fields_for :user, user do |u|
    u.text_field :name, :name => 'user[]'
  end
end

みたいな感じ。どっちがいいというわけではなくて、使い分ければいいんじゃないかと思います。