Hatena::Groupos0x

FFFF RSSフィード

0xFFのメモです。

2010 July 31st Saturday

密な配列を作る小ネタ

| 00:20 | 密な配列を作る小ネタ - FFFF を含むブックマーク はてなブックマーク - 密な配列を作る小ネタ - FFFF

また脱線メモ。

new Array(10)した配列をforEachしてもスルーされちゃう問題について、IE以外はArray.apply(null, Array(10))とすれば良い via TOYAMA Naoさんのツイート: "そういえば以前、要素数nの密な配列を作るのに Array.apply(null, Array(n)) が使えないかと思ったけど、JScriptでダメだったんだよね。" この方法はIE9pp3でも動いた。

で、ふと別の方法を思いついて試したところIE6でも動いた。こんな感じ。

var a=new Array(10);
a.splice.apply(a, Array(a.length+2));
var r = [];
for (var i in a){
  r.push(i);
}
alert(r);// 0,1,2,3,4,5,6,7,8,9

a.splice.apply(a, Array(a.length+2)); を1行追加するだけ。全然面倒!わかり難い!

まあ、Array(n).join().split(',')よりはマシのような気もしないこともないけど、こういうのが欲しいのは大抵書き捨てのコードなので、やっぱりjoin splitで十分だよね。

今日のJScriptさん

17:22 | 今日のJScriptさん - FFFF を含むブックマーク はてなブックマーク - 今日のJScriptさん - FFFF

調べ物してたらたまたま見つけたどうでもいい知識。

JScriptにはEnumeratorがあった。

var r = [];
var e = new Enumerator(document.all);
e.moveFirst();
while(!e.atEnd()){
  r.push(e.item());
  e.moveNext();
}
alert(r);

Enumerator Object (JavaScript) | Microsoft Docs

まあ、一部の方には今更なんだろうな…。

あと、こんな関数定義もできる。

function Point(x,y){
   this.x = x;
   this.y = y;
}
function Point.prototype.toString(){
   return '{x:' + this.x + ',y:' + this.y + '}';
}
var p = new Point(3,4);
alert(p);//{x:3,y:4}

って、これはEnhanced Scripting in IE9: ECMAScript 5 Support and More – IEBlogでも取り上げられてた。

TOYAMA Naoさんのツイート: "http://bit.ly/9dgaIp JScriptでは function foo, bar, baz() { return 42; } と書くことでひとつの関数をfoo, bar, bazという3変数から参照できたのか。ちょーすげー!!"のほうがアレだ。

あとあと、JScript.NETだとclassとかもあるんですねぇ。

Introducing JScript .NET

2010 July 7th Wednesday

AutoPatchWork for Opera

15:00 | AutoPatchWork for Opera - FFFF を含むブックマーク はてなブックマーク - AutoPatchWork for Opera - FFFF

AutoPagerizeSITEINFOLoader.js - もし高校野球の女子マネージャーがOpera Browserを使ったら - チーム俺等に触発されて、AutoPatchWorkをOperaで動かしてみた。

http://gist.github.com/466322

現状、スタイルの方はUserStylesheetに依存するので、user_stylesheet.cssの内容を自前のユーザースタイルシートにコピペしてください(ユーザースタイルシートを使ってなければ、詳細設定→コンテンツ→スタイルオプション→ユーザースタイルシートで設定)。文字列リテラルで埋め込むのはあまりやりたくないから、これもSITEINFOみたいに…できるかなぁ。

複数行文字リテラル(笑) - JavaScriptで遊ぶよ - g:javascriptのアイディアを頂いて、CSSを埋め込んでみました。ユーザースタイルシートを編集してしまった方はお手数ですが該当部分を削除で。

2010 February 18th Thursday

Chrome Keyconfigのpinを叩く

14:44 | Chrome Keyconfigのpinを叩く - FFFF を含むブックマーク はてなブックマーク - Chrome Keyconfigのpinを叩く - FFFF

こんな感じにできるようにしてみた

document.addEventListener('LDRize.strokedPins',function(e){
	console.log(e);
	console.log(e.target); // pinされてるノード
	console.log(e.newValue);// pinされたノードのリンク
},false);
var ev = document.createEvent('Event');
ev.initEvent('LDRize.strokePins', true, false);
document.dispatchEvent(ev);

LDRize.strokePinsというイベントを投げると、LDRize.strokedPinsというイベントを投げ返してくる。3つpinしてれば3回LDRize.strokedPinsイベントを受け取ることになる。LDRize.strokedPinsはMutationEventです。

ただ、このままだと誰が叩いたのか判断できずに、まさしく誤爆してしまう。なので、MessageEventでEventTypeを指定できるようにしてある。

document.addEventListener('LDRize.strokedPins.Taberareloo',function(e){
	console.log(e);
},false);
//<del>var message = JSON.stringify({args:["LDRize.strokedPins.Taberareloo"]});</del>
var message = JSON.stringify({type:"LDRize.strokedPins.Taberareloo"});
var ev = document.createEvent('MessageEvent');
ev.initMessageEvent('LDRize.strokePins', true, false, message, location.protocol + "//" + location.host, "", window);
document.dispatchEvent(ev);

messageはJSON文字列で。

これでTaberarelooとの連携ができそうだと思うのですが、いかがでしょうか、d:id:Constellation

追記:

コメントを受けて、

os0x / ChromeKeyconfig / commit / ea19a644b6fa — Bitbucket

os0x / ChromeKeyconfig / commit / ca6ccd559be4 — Bitbucket

LDRize.strokedPins.end、LDRize.clearPins、LDRize.getStatus追加

LDRize.strokedPins.endは、MessageEventでtypeを受け取っていた場合はその名前の後ろに.endをつけるようにしました。MutationEventは同期的なので、最後に実行されるはずです(でも、ほんとはMutationEvent使うべきではないんだろうな…)。

document.addEventListener('LDRize.status.Taberareloo',function(e){
	console.log(e);
	console.log(JSON.parse(e.data));//pinの数やsiteinfoなどが入っている
},false);
//var message = JSON.stringify({args:["LDRize.status.Taberareloo"]});
var message = JSON.stringify({type:"LDRize.status.Taberareloo"});
var ev = document.createEvent('MessageEvent');
ev.initMessageEvent('LDRize.getStatus', true, false, message, location.protocol + "//" + location.host, "", window);
document.dispatchEvent(ev);

追記2:

MessageEventで渡すJSONのフォーマットを変更。argsという良く分からない配列になってたので、シンプルにtypeをキーに。

ConstellationConstellation2010/02/18 15:02おおーっ, すばらしいです! いろいろお願いばかりですいません. ありがとうございます!!
Changeset http://bitbucket.org/os0x/chromekeyconfig/changeset/d95135de9b60/ , 先ほど読みましたー.
なるほど, うちは頭固いので一回のEventでやるようにばかり考えてしまっていて, XPath投げつけるとか屈折したことばかり考えていました.

あとお願いばかりで大変心苦しいのですが, clear pinのようなもの, またpin総数を返すもしくはstrokedPinsの終了を報告するようなEventがあると非常に助かります. strokedPins発行後, pin総数の情報を元にstrokedPins側のイベント回数をカウントする, もしくは終了のEvent通知を待って, すべて終了してからpinをclearするなどが出来ればと.

os0xos0x2010/02/18 15:51早速、追加してみました。こんな感じでよろしいでしょうか?

ConstellationConstellation2010/02/18 16:53ありがとうございます! ばっちりです! これでDashboardでやりたい放題できそうです!!
大変助かります. お願いばかりですいませんです...

os0xos0x2010/02/18 18:10いえいえ、こちらこそ本当に助かってます。

2009 December 20th Sunday

Chrome Keyconfig、Chrome Gestureにアクションを追加する方法:ドラフト

| 19:04 | Chrome Keyconfig、Chrome Gestureにアクションを追加する方法:ドラフト - FFFF を含むブックマーク はてなブックマーク - Chrome Keyconfig、Chrome Gestureにアクションを追加する方法:ドラフト - FFFF

Chrome Keyconfig、Chrome Gesturesにアクションを追加する方法について、AutoPatchWork 1.0.2では、下記のようにした。

Google Code Archive - Long-term storage for Google Code Project Hosting.

var CHROME_GESTURES = 'jpkfjicglakibpenojifdiepckckakgk';
var CHROME_KEYCONFIG = 'okneonigbfnolfkmfgjmaeniipdjkgkl';
var action = {
	group:'AutoPatchWork',
	actions:[
		{name:'AutoPatchWork.toggle'},
		{name:'AutoPatchWork.request'}
	]
};
chrome.extension.sendRequest(CHROME_GESTURES, action);
chrome.extension.sendRequest(CHROME_KEYCONFIG, action);

こんな感じでオブジェクトを渡すと、Keyconfig、Gesturesの設定画面のセレクトボックスにAutoPatchWork.toggleとAutoPatchWork.requestが追加される。ユーザーがそれを選択し、どこかのページでそのアクションを呼び出すとその名前のEventが発行されるようにしている。

Gesturesの場合、こんな感じ。

var ev = document.createEvent('Event');
ev.initEvent(act.name, true, false);
ev.direction = GM._directionChain;
ev.action = act;
document.dispatchEvent(ev);

Keyconfigの場合、timesはviモードを有効にしている場合に5 jと押すと5が入る。

var ev = document.createEvent('Event');
ev.initEvent(act.name, true, false);
ev.key = key;
ev.action = act;
ev.times = KC._times||KC.times||1;
ev.target = target;
document.dispatchEvent(ev);

これらのEventオブジェクトに付けたプロパティは、拡張同士だと参照可能だけど、ページ側からは見えないようになっています(今のところ)。

で、とりあえずはこれで使えそうな気がするけど、ちょっと問題がある。

というのも、AutoPatchWorkからsendRequestするタイミングがシビアで、起動時に登録を失敗することがあるみたい。しかも、AutoPatchWorkの有効・無効を切り替えると、アクションが増えてしまう…。

このへん、スマートな解決方法がなさそうでどうしたものかなと悩み中です。

ConstellationConstellation2009/12/21 18:18登録が成功したか, KeyConfigがinstallされているかなどがわかるとありがたいので, callbackを呼んでいただけるとありがたいです. (成功しなかった場合は自前で準備など...)

2009 June 2nd Tuesday

parseIntRight

| 11:24 | parseIntRight - FFFF を含むブックマーク はてなブックマーク - parseIntRight - FFFF

id=”id-1234”からIDを抜き出すjQueryプラグイン

getIdだとId自身を取得すると思ってしまう。やってることはparseIntを逆から処理する感じなので、reduce/reduceRightに倣って、parseIntRightってメソッドを定義するのが良いのではないか。

http://gist.github.com/121940

ただ、parseIntRightなら aaa0xFF な文字列にも対応したいところだけど、その辺は妥協…