2007年3月25日

Firefox が、ひどいメモリ食い

Mac で、Firefox を長時間使っていると、いつの間にか、ものすごいメモリを食っていて、めっちゃスワップしてしまいます、、、何故でしょう、、、。。。
>top
PID COMMAND %CPU TIME #MREGS RPRVT RSHRD RSIZE VSIZE
2059 firefox-bi 12.9% 80:50.32 3073 422M+ 65.9M 448M 1022M

2007年3月23日

RedHat で CapsLock → Ctrl に変更

IBM ThinkPad X22(古!!) に、RedHat9 を入れてあって、たまにしか使っていなかったのだが、いい加減キーボード使いづらいよって事で、キーの配置を変更しました。その時の作業メモ。
cd /etc/X11/
vi XF86Config
----------------------------------------------
Option "XkbOptions" "ctrl:nocaps"
追加するか、コメントはずして X を reboot すると有効になりました。これで、やっと快適な、ThinkPad Life を過ごせそうです、、、w

参考
中谷彰宏のサイバー研究室

2007年3月19日

ブラウザの特殊文字認識について物申す

ブラウザの特殊文字(&..etc)の認識についてご報告です。

A タグの href 属性の中で、以下のようなコードを書くと、IE や Opera では、特殊文字として認識されてしまいます。FireFox では認識されずに済む。
<A href="./xxx.cgi?q=test®_flg=xxx">LINK</A>
とした場合に、&reg が、® として認識されてしまう、、、orz
確かに、特殊文字については、;(セミコロン)を省略して記載できるのだが、href 属性の中まで、特殊文字の表示として認識しなくてもいいのでは??これは、Bug ではないかと思っているのだが、どうなのだろう、、。
W3C で規定されている特殊文字は、他にも多く存在するため、同様の問題に遭遇する人は多いのではないかと思うのだが、、、。何か、回避策をご存知のかたは、コメント頂けると嬉しいです。
おそらく、この投稿を IE や Opera で見ると、A タグの &reg が特殊文字に変換されてしまっているのでは、と思います。

2007年3月16日

WSH でショートカットを作成

Becky でメール新規作成画面をショートカットアイコンから起動したいので、どうにかならないかと調べた。
まず、Becky でメール新規作成画面をショートカットで起動するには、ショートカットに以下のようにリンク先を設定する
"C:\Program Files\RimArts\B2\B2.exe" mailto:hogehoge@fugafuga.com
ちなみに、mailto に、
mailto:hogehoge@fugafuga.com?subject=件名&body=内容
とすれば、件名と内容を設定できる。
RFC2368 準拠らしい。Becky ヘルプより

で、今度は上記で作成したショートカットを、メールアドレスを変えて、大量に作成したいので、WSH というスクリプトを利用して、create_mail_sc.wsf を下記の内容で作成。
[']シングルクオートで、コメントらしい
<package>
<job id="vbs">
<script language="VBScript">
Const ForReading = 1, ForWriting = 2, ForAppending = 8

Set objShell = WScript.CreateObject("WScript.Shell")
strDesktop = objShell.SpecialFolders("Desktop")

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objInput = objFSO.OpenTextFile("mail.txt", ForReading) 'メールアドレスのファイル
Do Until objInput.AtEndOfStream
strLine = objInput.ReadLine

Set objShortCut = objShell.CreateShortcut(strDesktop + "\" + strLine + ".lnk")
objShortCut.TargetPath = "C:\Program Files\RimArts\B2\B2.exe"
objShortCut.Arguments = "mailto:" + strLine ' Beckyの引数
objShortCut.WorkingDirectory = "C:\Program Files\RimArts\B2"
objShortCut.Save

Loop
objInput.Close

WScript.Echo "ショートカットを作成しました。"
</script>
</job>
</package>
そして、mail.txt をデスクトップに作成して、
hogehoge1@fugafuga.com
hogehoge2@fugafuga.com
hogehoge3@fugafuga.com
ってな内容で、作成して。create_mail_sc.wsf をダブルクリックで実行すると、ショートカットが簡単に大量に作れる。

参考:
Windows管理者のためのWindows Script Host入門
msdn - Windows Script Host

2007年3月12日

SQL::Abstract を勝手に拡張

DBIx::Simple を使っていて、SQL::Abstract が、"GROUP BY" 句 に対応していないので、勝手にプラグインっぽいの作って、対応させたのだが、、、いいのだろうか、、、;
"SQL/Abstract/Plugin/Groupby.pm" っての勝手に作って、以下のようなコードを書いたのだけど、、ほとんど、SQL::Abstract の "order by" の実装をパクッただけ、、、orz
ちなみに、な部分以外はオリジナルを持ってきた、、、。
package SQL::Abstract::Plugin::Groupby;
use Carp;
use strict;

our $VERSION = '0.01';

sub puke (@);

sub where {
my $self = shift;
my $where = shift;
my $order = shift;

# Need a separate routine to properly wrap w/ "where"
my $sql = '';
my @ret = $self->_recurse_where($where);
if (@ret) {
my $wh = shift @ret;
$sql .= $self->_sqlcase(' where ') . $wh if $wh;
}

# group by?
if (ref $order eq 'HASH') {
$sql .= $self->_group_by($order->{group_by}) if $order->{group_by};
$sql .= $self->_order_by($order->{order_by}) if $order->{order_by};
# order by?
} elsif ($order) {
$sql .= $self->_order_by($order);
}

return wantarray ? ($sql, @ret) : $sql;
};

sub _group_by {
my $self = shift;
my $ref = ref $_[0];
puke "Undefined group_by data struct" unless $_[0];

my @vals = $ref eq 'ARRAY' ? @{$_[0]} :
$ref eq 'SCALAR' ? ${$_[0]} :
$ref eq '' ? $_[0] :
puke "Unsupported data struct $ref for GROUP BY";

my $val = join ', ', map { $self->_quote($_) } @vals;
return $val ? $self->_sqlcase(' group by')." $val" : '';
};

{
no strict 'refs';
*SQL::Abstract::where = \&where;
*SQL::Abstract::_group_by = \&_group_by;
}
ってか、"group by" って、一般的な RDBMS で対応しているのかどうか、不安なので俺々勝手モジュールだけにしておく、、。コメントとか頂けたら嬉しいかもです。。。とか、勝手に言ってみる、、、orz

ちなみに使い方は、こんな感じです。。気分的には、DBIx::Class インスパイア?!っでも無いか、、orz
use SQL::Abstract;
use SQL::Abstract::Plugin::Groupby;

my ($query, @bind) = SQL::Abstract->new->select(
'table_name',
[qw/field1 field2/],
{field1 => 'value1'},
{
group_by => [qw/field1/],
order_by => [qw/field2/],
},
);

Regexp::Assemble 便利っぽい

にぽたん研究所 - 二度目の公開!電話番号の正規表現 で、紹介されてた Regexp::Assemble がとっても便利そうなのでメモメモ。
  use Regexp::Assemble;

my $re = Regexp::Assemble->new;
$re->chomp(1);
$re->add(<DATA>);
print $re->re;

__DATA__
104
103
102
ってな感じで、正規表現としてマッチさせたいデータを流し込むと、解析してマッチさせるための正規表現を作ってくれちゃう、便利そうなモジュール。

Google - Regexp::Assemble
ってか、ずいぶん前から紹介されてたんだね、、、orz
今度、機会があったら試してみよう。

2007年3月5日

FireFox CPAN 検索プラグイン

環境を移行して入れなおしたので、メモ。
"C:\Program Files\Mozilla Firefox\searchplugins" に下記の設定ファイルを追加。
cpan.xml
<?xml version="1.0" encoding="UTF-8"?>
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>CPAN</ShortName>
<Description>CPAN Search</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAB3RJTUUH1gUdASQWZt5rYAAAABd0RVh0U29mdHdhcmUAR0xEUE5HIHZlciAzLjRxhaThAAAACHRwTkdHTEQzAAAAAEqAKR8AAAAEZ0FNQQAAsY8L/GEFAAAAMFBMVEX///8AAHsAewAAe3t7AAB7AHt7ewC9vb17e3sAAP8A/wAA////AAD/AP///wAAAAAAJ/C6AAAACXRSTlP//////////wBTT3gSAAAAQUlEQVR4nD3NMQ4AIAwCwD6fja86sqHUKulwA6EFGklx6cJ+oBAXKNoNJx8qoMEDPmA6mR7wXMpirgchocvML0w26AFaAyIThioAAAAASUVORK5CYII=</Image>
<Url type="text/html" method="GET" template="http://search.cpan.org/search">
<Param name="query" value="{searchTerms}"/>
<Param name="mode" value="all"/>
<MozParam name="client" condition="defaultEngine" trueValue="firefox-a" falseValue="firefox"/>
</Url>
<SearchForm>http://search.cpan.org/search</SearchForm>
</SearchPlugin>
適当に、Google のプラグイン見て作ったやつなので、おかしげな所満載ですが、、あまり、気にしないでください。。。
あぁ、、プラグインが全然入ってないから入れなきゃ、、、とりあえず、FireBug は必須だよね