webプログラミング



2010 7月1日

相変わらずクソな実装のIE。
他のブラウザで全部動くのにIE 7.0 以下の挙動はホントにクソ。
先人の方々に感謝感激雨あられですわ。

IEでのgetAttribute,setAttributeのバグ

// NG
element.getAttribute("class");
element.setAttribute("style", "background-color: #fff; color: #000;");
element.setAttribute("onclick", "clickHandler(event);");

// OK
element.getAttribute("className");
element.style.cssText = "background-color: #fff; color: #000;";
element.setAttribute("onclick", new Function("clickHandler(event);"));

IEでsetAttribute()とremoveAttribute()がうまく動かない問題 (ウップス!!なかわけ)

しかも、かなり重要なことを発見しました。

属性名を小文字で書かないとうまく動かない!!(IE7で確認)

setAttribute("onClick", new Function(""));

ではダメなのです。うまく処理されません。

setAttribute("onclick", new Function(""));

あー、これも引っかかってたわ。

ただし、上記の対応をすると他のブラウザで動かない。IE8 でもエラーが出る。IE 7以下用に振り分けないとダメなのか。。。

まぁ、そろそろIE7以下は捨ててもいいよ・・・ね?

結局

ベタにHTMLを document.write() で書けばいい訳で・・。
クロスブラウザにするには手間ががかかる・・。







2010 7月1日

以前に配列をシャッフルの記事( http://perl.no-tubo.net/2010/01/08/pelrで配列をシャッフル/ )を書いたのだけれど、その時にコメントで List::Util を使いましょうよ、と頂いた。

そういうものもあるのか、と思っていたのだけれど理由があったので軽く調べてみた。

perl を書く時には配列処理と言うのはよく使うので、メモとしてエントリー。

配列処理をするモジュール List::Util

配列処理に置いて同じような処理は自前で書いても書けない事は無い。ただし、コアモジュール List::Util は C(XS) で実装されている(?)ので多量の処理になるほど実行速度に差が出る。

ベンチマークをとって比較しているエントリー
配列のしゃほぅ!のベンチマーク

上記エントリーにはシャッフルのベンチマークのみだけど、きっと他の処理でも違いがあるのだろう。

もっとたくさんの処理を使える List::MoreUtils

List::MoreUtils を使うとさらに多くの配列処理を使用出来る。
簡単なリファレンス
List::MoreUtils – List::Utilに含まれない関数群 – あじゃぱー

インストールに関して注意点があるようです。
YellowStore: [Perl]List-MoreUtils-0.24はPerl5.8.8以前には入らない







2010 6月30日

Perl の $ENV{PATH} は何処を参照しているのか?

例えば bayon を perl から使うのに Text::Bayon モジュールを利用したら
sh: bayon: command not found
と言うエラーログが残る。

コマンドが見つからない = パスが通っていない、と言う事なんだろうけど、apache を2.2 にしたらパスが変わったのか apache2.0 の時に使えた Lingua::JA::Summarize を使用するスクリプトも

sh: mecab: command not found

となる。

mecab も bayon も /usr/local/bin にインストールしてあるのだけれど、$ENV{PATH} を調べてみると、
$ENV{PATH} = /sbin:/usr/sbin:/bin:/usr/bin
となっており、/usr/local/bin にはパスが通っていない。

この 環境変数はどこを参照しているのかまさに以下のページのような迷い方をした。

apacheの起動ユーザーにPATH通しときゃいいのか?とか、httpd.confにそういう設定が?とか、もしかしてPHP.iniにそんな設定が?とか思ってたんですが、全部ハズレ。

Apache2の環境変数PATHを設定する – masahilog

SetEnvやPassEnvディレクティブを追加してみたり、. bash_profile を変更したり、散々いろいろ試してみたけど、上記ページのおかげでヒントが得られたのでメモ。

CentOS系(というかRedhat系、だろうか)は/etc/sysconfig/httpdがそれに該当するような。探しても調べてもenvvarsの影も形も無かったけど、/etc/init.d/httpdの冒頭箇所で/etc/sysconfig/httpdがあったらそれを評価してからhttpdが起動するようになってる。なんでこんな仕様なんだろうか。

追記でこのように書かれていたのだけれど、/etc/rc.d/init.d/httpd を見てみると、 /etc/sysconfig/httpd のみではなく、 /etc/rc.d/init.d/functions も参照している。

/etc/rc.d/init.d/functions を見ると、ビンゴでした。

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH

ここのパスを変更して、保存。

注意点としては、apache を再起動ではなく 停止してから起動する事。
再起動では反映されませんでした。

ちなみに CentOS (4.x 5.x) での話ですので他のディストリビューションでは違うかもしれません。