bug_or_spec

IE DOM table tips  [javascript]  [bug_or_spec]  [IE]

  • DOM作成時にtbody書かないとIEはtableを表示しない
  • colspan は colSpanとして設定する必要がある

perlのimportで&プロトタイプ関数が使えない  [perl]  [Question]  [bug_or_spec]

解説希望。 よくわかりません。

複数パッケージを含む以下のようなperlスクリプトで(&)プロトタイプ宣言した関数を実行すると、動きません。(Can't call method 'fuga' without a package or object....)

package hoge;
use base 'Exporter';
our @EXPORT = qw/ fuga foo/; 

sub fuga(&){ print $_[0]->();}
sub foo(){ print $_[0];}
1; 
package main;
import hoge;
# 駄目パターン
fuga {'fuga'};
#プロトタイプ宣言(&)してないやつはOK
foo('foo');
#関数として渡すとOK
fuga(sub{'fuga'});

プロトタイプで'&'を指定した場合、subをつけない無名関数(ブロック)を渡せるはずですが、渡せません。

で、package hogeを別ファイルに置くと、動きます。

use 'hoge' 
fuga {'fuga'}; #OK

なんか変だなぁ。

importとuseは違うのかなぁ?

なんか間違ってる?

Railsのテスト中の出来事  [bug_or_spec]  [日記]

<0.5> expected but was
<0.5>.

意味不明

調べてみると、floatの誤差の問題だった。

irb > 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.02 + 0.02 + 0.02 + 0.02 + 0.02 + 0.15 == 0.5
false

困った。全部100倍して計算するのか。。。あほくさ


assert_in_deltaというのがあるのでこれを利用することにした。

RubyのYAMLの変な挙動  [ruby]  [rails]  [bug_or_spec]

railsでto_yamlでactiverecordのオブジェクトをyaml化すると、日付関連がこのようになった。

mydate: !timestamp 08/10/10

で、これをrubyのYAML::loadで、読ませると'argument out of range'というエラーになる。

日付で問題なのはなぜか10月(他にもあるかもしれない。)


irb> require 'yaml'
irb> YAML::load("mydate: !timestamp 08/10/10")
ArgumentError: argument out of range
irb> YAML::load("mydate: !timestamp 08/11/10")
=> {"mydate"=>Thu Jan 10 00:00:00 UTC 2008}

(あれ?、よくみると11月も1月になってるし。。。)


irbでDateをyaml化すると、以下のようなフォーマットになる。

irb> Date.new(2008,10,10).to_yaml
=> "--- 2008-10-10\n"

なので、きっとrailsがto_yamlで変なことをしてるんだろう。


いろいろ調べて、environment.rbの記述を変更することで対処できた。

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.update :default => "%Y/%m/%d"

なぜか、'%y'で設定してたので、'%Y'に変えた。


俺のミスってことだな。


perlの改行自動出力がくせもの  [perl]  [bug_or_spec]

Perlは、内部的に改行をLFとして扱い、入力時・出力時に環境に合わせたコードで出力する。

なので、Windows上のperl (Strawberry perl使用)で、以下のようにすると

perl -e 'print "\x0a";'

出力に 0x0d0a (CR+LF)がでてしまう。

Windows環境でもLFで出したい時もある。

そのときは、こうしなければならないみたい。

perl -e 'binmode STDOUT; print "\x0a";'

$/とか$\とかいろいろいじったけど、できなかった。

IE javascriptではformのname属性を変更できない  [javascript]  [bug_or_spec]  [IE]

javascriptでformをname属性でアクセスする手法は良く使う。

var abc = document.formname.hoge.value;

これを、動的に生成させたformで行おうと思った場合、IEで問題が起こる。

var myNode = document.getElementById('fuga');
var myForm = document.createElement('form');
myForm.name = 'formname';
var myInput = document.createElement('input'); 
myInput.name = 'hoge'; 
myInput.type = 'text';
myInput.size = "40";
myForm.appendChild(myInput);
myNode.appendChild(myForm);

dom生成時に.nameでname属性を変更しているにもかかわらず、IEでは独自のIDがつけられてしまい、上記のname属性を利用したアクセス方法ではアクセスできないのだ!

有り得ないよ。

そこで、こんなユーティリティ関数が必要になる。

function createNamedElement(tag,name){
  var isIE =/*@cc_on!@*/false;
  var element;
  if (name) {
    element = (isIE)? document.createElement('<' + tag + ' name="' + name + '">'): document.createElement(tag);
    element.name = name;
  } else {
    element = document.createElement(tag);
  } 
  return element;
}

IE恐るべし。

ちなみに'cc_on'の所は、IEの判定で良く使われる方法(らしい)。

この記事のタグ名'bug_or_spec'のネーミングセンスの良さに自画自賛

IE javascriptではRadioのchecked属性はドキュメントにappend後じゃないと変更できない  [javascript]  [bug_or_spec]  [IE]

またしてもIE。

ラジオボタンを動的に生成する場合、デフォルトとか以前の結果とかをチェックした状態で表示するために

var myRadio = document.createElement('input'); 
myRadio.type = 'radio';
myRadio.value = 'hoge';
myRadio.checked = true;

とかやるじゃないですか。

IEの場合、これではチェックが付かない。

ドキュメントにappendした後に変更する必要があるんだって。

いい加減にしてくれよIE

IE"インターネットサイトxxxを開けません。"のバグ  [javascript]  [bug_or_spec]  [IE]

またでたよ。IE。

jasonpとかでスクリプトを読み込んで実行するときに、最初のkicker(loader?)的なスクリプトを書く場所によってエラーが発生する。

「インターネットサイトxxxを開けません。操作は中断されました」というエラーウィンドウがでて、サイトは表示されない状態となる。

例:

kicker.js

function kicker(){
  var script = document.createElement("script");
  script.setAttribute("type","text/javascript");
  script.setAttribute("src","./callee.js");
  document.body.appendChild(script);
  return true;
}

scriptタグを作ってcallee.jsを読み込むだけ。

callee.js

function callee(){
  document.getElementById("hogefuga").appendChild(document.createTextNode("hogefuga"));
  return true;
} 
callee();

テキストノードを埋め込むだけ。最後に自分を呼んでいる。

buggy.html(動かないケース)

<html>
  <head>
    <script type="text/javascript" src="./kicker.js" charset="utf-8" ></script>
  </head>
  <body>
    <div>
      <div id="hogefuga"></div><!-- ここにテキストノードが書き加わる -->
      <script>
      <!--
        kicker();
      //-->
      </script>
    </div>
  </body>
</html>

問題は、scriptタグがdivに囲まれていることらしい。

下記のように変更すると動く

:
<div>
  <div id="hogefuga"></div>
</div>
<script>
<!--
  kicker();
//-->
</script>
:

でも、いつもいつも外側に書けるわけでもないよね?

そういう時はeventListenerだそうだ。

if(window.addEventListener){
  window.addEventListener("load",kicker, false);
}else{
  window.attachEvent("onload",kicker);
}

もう、いい加減面倒くさいよ。

参考: http://yusuke.homeip.net/diary/2006/03/12/1142155862799.html

ちなみに、何を作っていて気付いたかというと、このブログの「コメント」欄。

といっても、「はてなブックマーク」をコメント欄代わりに表示しているだけ。