2006年4月 2日
virusフィルタ偉大
ついでに昨年度のvirusの数も数えてみました。 完全に正確ではないんですが、サーバ側で検出して捨てた数が(フィッシングも含めて)3,000くらい。 これ、他のサーバでも一度検出して捨てられてるので、実際には倍くらいあるかもしれない。 とすると、月刊500通?まじすか。
2006年4月 9日
Sortable.createでonUpdateが効かない
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
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いれてます)。
| TH | TD1 |
|---|---|
| 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の話。 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日
参照されていないレコードを探す
今回は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なオプションを抜く
最近(といってもだいぶ前からですが)の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 XPでは(もっと前からかもしれないけど)、 デフラグのためのコマンドラインツールが提供されています。 これを使えば、タスクに登録して定期的に自動でフラグという芸当が可能です。
c:\windows\system32\defrag.exe c:
なんていうコマンドを登録しておくといいでしょう。 私の場合は毎週土曜日の明け方4時にデフラグしています。
2006年4月20日
続:ActionView::Helpers::FormHelperをlocal varibaleで使いたい
先日、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
みたいな感じ。どっちがいいというわけではなくて、使い分ければいいんじゃないかと思います。