たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
MozLabの一機能の単体テスト用ツールMozUnitではasync型のテストケースを書くことができる、というのは前にここでも書いたんだけど、使い勝手の悪いポイント?が一つある。それは、テストケースの中で、ある処理が終わってから次の処理に進むといったことが簡単にはできないこと。
現状の仕様では、
という書き方しかできなくて、各テストケースの中でコールバック関数を使って準備が整うのを待つという使い方はできない。一般的な意味での単体テストというのがどうある「べき」なのかは知らないけど、やりたいこととしては、
の方が便利ですよね? ね?
んでscript.aculo.usのユニットテストの機能ではwaitという機能を使って処理待ちができるそうだから、MozUnitステでscript.aculo.usを拡張機能の開発でも使えるようにせよ!という指令が須藤さんから下ったのだけれども。
なんか仕様があちこち違うから今までMozLabベースで作ってた物をこれ用にするにはscript.aculo.usのソースもガッツリ読まなきゃいけないっぽいし、どうもscript.aculo.usは複数のテストが同時に動くことを想定していなさそうな雰囲気だったので、MozReplみたいな機能を使って同時に複数人でテストするようなことは難しいっぽかった(そんな事ほんとにやるのかどうかはさておき)ので、新しいこと覚えるよりは今までの知識がそのまま使えた方が僕が楽だと思った。
ということでMozUnitのTescCaseクラスの定義をゴニョゴニョと書き換えて、JavaScript 1.7のジェネレータを応用し、テストケースの中で yield 5000;
とか書くとそこで指定時間(ここでは5000ミリ秒=5秒)待ってから次の処理に進むということができるようにしてみた。テストケースの実行結果の返り値を見て、 [object Generator]
である場合は、StopIteration例外が出るまでタイマー使って何度もnext()
を実行して、それが済んでから次に処理を進めるようにした次第です。
……ということなんだけど、yieldってこんな使い方しちゃっていいのかしらん? yield(生産)って書いてるのに何も生産しとらんし。
minmax.jsというライブラリを使うと、最小サイズ・最大サイズを設定するCSSの機能を古いIEでも使えるそうで。IE6でやっても動いた。
IE6でもXML宣言があると後方互換モードになってしまってこれらのプロパティが機能しなくなるんじゃなかったかな。だとしたらもうしばらくの間は有用かも?
なんか文章が分かりにくいと言われたんで言い訳しとくと、スクリプト発見→IE6で表示→おお確かに動いてるねぇ→説明読む→ってIE5用なのかよ!→でもIE6で動いたなぁ→ていうかそもそもIE6って本体でmax-widthとか実装してたよね→でも後方互換モードじゃ使えないんだよね、XML宣言あると後方互換モードになっちゃうんだよね→じゃあやっぱりIE6でも有用なんじゃね? という流れがあった結果としてのこのエントリなんですよと。読む人の都合とか利便とか考えてないオナニー文章の典型ですね。
JavaScript 1.7 の yield が凄すぎる件についてを見てもyieldってそもそも何なのかちいとも分かっとらんかったのでそこから調べてみた。
JavaScriptで危険な事や妙ちきりんな事をしてみたい人のための覚え書き。一般的なユーザの立場の人はあんまり見ない方がいい話。興味本位で触ると痛い目を見かねない話。
/latest 以外のディレクトリに置いているページで使っているコンテンツリスト生成用JavaScriptがprototype.jsのObject汚染におもくそひっかかっててメニューぶっ壊れ状態になってたことに今頃気付いた。連想配列とfor-inループの組み合わせで大量死発生。ということでリンク先で提案されている以下のコードを組み込んで対処した。
Object.prototype.forEach = function(func){ for(var key in this){ if(!(key in this.constructor.prototype)){ func(this[key],key,this) }else if(this[key] != this.constructor.prototype[key]){ func(this[key],key,this) } } }; obj.forEach(function(value,key,self){ alert([value,key]); });
ンモー
全ページでprototype.jsを読み込むようにしてみた。とりあえず使える環境にしとかないと遊ぶのも勉強するのもなんもできんからね。
ナローバンドな人はごめんなさいってことで。
prototype.js 1.4.0を使っていることを前提として。
ラジオボタンというのは、こういう奴のことだ。
チェックボックス風のものがいくつか並んでて、一つだけを選べるというもの。ここで1~3のどの項目がチェックされているのかをJavaScriptで知るためには、通常、以下のようにする必要がある。
var nodes = Form.getInputs($('form'), 'radio', 'dummy');
var selectedItem = $A(nodes).find(function(aNode) { return aNode.checked; });
alert(selectedItem.value);
ところでXULでは、同様のものを以下のように書くことができる。
<radiogroup id="dummy">
<radio value="1" label="項目1" />
<radio value="2" label="項目2" />
<radio value="3" label="項目3" />
</radiogroup>
そして、XULではradiogroup要素のノードから直接「選択された項目の値」を取得することができる。
alert($('dummy').value);
XUL生活(?)が長かった僕は、これにすっかり染まってしまって、prototype.jsにラジオボタン用の機能がないことを知って非常にガッカリしたと同時に、どうやってラジオボタンの選択された値を一発で取得すればよいのか分からず大いに困惑した(「Enumerableクラスのfindメソッドまたはdetectメソッドを使う」という前述の方法などで、やろうと思えばできるということには後から気がついたけど、慌てていた僕はそこまで思い至らなかった)。
そういうわけでごろうさんに泣きついてみたところ、以下のような方法を教えてもらえた。
alert(Form.serialize($(form)).toQueryParams()['dummy']);
フォーム全体の値を一旦クエリの形式に変換して、その上でラジオボタンの部分の値を得るという方法だ。なるほど、こんな方法もあるのか……ということでさっそくこれを使わせてもらうことにした。
でも、この方法はちょっと遠回りなのが残念といえば残念。実行時間も少々余計にかかりそうな気がする。ラジオボタンは排他的選択なんだから、XULの場合のような一発で値を得る方法がprototype.jsにもあっても良さそうなものだと思うんだけどなあ。トホホホホ。
Ajax IMEは非日本語環境でも日本語を入力するための手段として使えるので、いざというときあると便利らしいんだけど、Ctrl-q/Ctrl-9でON/OFFを切り替える都合上、これらのキーにショートカットが割り当てられている環境ではAjax IMEを起動できないことになってしまう。
というわけでCtrl-q/Ctrl-9からCtrl-Shift-q/Ctrl-Shift-9に起動キーを変えてしまうブックマークレットの例を作ってみた。
ボタンでON/OFFできるようになってればそもそもよかったのかな?
どうでもいい小ネタ。
この二つの事柄から、application/octet-streamなdata: URLを読み込ませれば、Webページ上のJavaScriptだけでもファイルの生成と保存ができるのではないか? と推測することができる。ンで、Firefoxで実際に試してみた。
var text = textbox.value;
location.href = 'data:application/octet-stream,'+encodeURIComponent(text);
こんな感じに書いてみたところ、改行も含めて問題なくいけた(ダウンロードされたファイルのエンコーディングはUTF-8)。ただし、ファイル名をユーザ自身が指定し直さないといけないのが欠点。
まあ無いよりはマシだろうということで、これを使って高橋メソッド in XUL リターンズの編集画面に「保存」機能を付けてみたわけですが。
malaさんよりタレコミ。<a href="data:...">ファイル名</a>
というリンクを生成してAlt-クリックすると、アンカー文字列がファイル名になるそうな。XULでは使えない技だけど、メモ。