配列の要素を検索

Array#searchとかあっても良さそうだけど、用意されていないようなので適当に定義。

/**
 * 配列から要素を検索
 * @param  a0  検索する要素またはテスト関数
 * @return  number  要素の添字。見つからない場合は-1
 */
Array.prototype.search = function(a0)
{
    if( a0 instanceof Function ){
        for( var i=0, l=this.length; i < l; i++ )
            if( a0(this[i]) ) return i;
    }else{
        for( var i=0, l=this.length; i < l; i++ )
            if( this[i] == a0 ) return i;
    }
    return -1;
};

用意されてそうで無いのは何故だろう。

JavaScriptでコールスタックを取得

arguments.callee.callerが使える環境でのみ動作

コード

function getCallStack()
{
	var caller = arguments.callee, 
		ret = [];
	while( (caller = caller.caller) )
		ret.unshift(caller);
	return ret;
}

テストBookmarklet

javascript:function f(a,b){a=[],b=arguments.callee;while(b=b.caller)a.unshift(b);return a}function a(){alert(f())}function b(){a()}b()

Eclipse Helios(3.6)が起動せず、"Failed to create the Java Virtual Machine."というエラーが出る場合の対処法(Windows)

"eclipse.exe"と同じフォルダ内にある"eclipse.ini"を以下の方法で編集することで対処。

方法その1

"-Xmx512m"を"-Xmx256m"に変更

方法その2

"-vmargs"の前の行に

-vm
C:\Program Files\Java\jdk1.6.0_20\bin\javaw.exe (javaw.exeのパス)

を追加


参考

選択した範囲のURLをまとめて開くBookmarklet

Google Chrome 6.0.472.53 betaで動作確認。
厳密に動作を検証したわけではないので、予期せぬ動作をするかもしれません。

javascript:var r=getSelection().getRangeAt(0),b=r.startContainer,e=r.endContainer,t='childNodes',b=b[t][r.startOffset]||b,e=e[t][r.endOffset]||e,t='firstChild',c='nextSibling';while(r=b[t])b=r;for(;;){if(r=b.href)open(r);while(b!=e&!b[c])if(b=b.parentNode,r=b.href)open(r);if(b==e)break;b=b[c];while(r=b[t])b=r}!1


Web Inspectorから動作確認したときはwindow.openがポップアップブロックに引っ掛かって、さらに解除しても新規ウィンドウで開いたが、Bookmarkletとして実行するとポップアップブロックに引っ掛からず新規タブで開かれるみたい。


ちなみにos0xさんのLDRですべての外部リンクをバックグラウンドタブで開くUserScripts - os0x.blogの方法でミドルクリックをエミュレートしても、Web Inspectorだとポップアップブロックに引っ掛かってwindow.openと同じ挙動となった。

Bookmarkletの短縮化作業の間に使った手法など。
  • 長いメソッド名を変数に格納
  • 1文字の識別子名(変数・メソッド)
  • 変数の使い回し
  • "window."の省略
  • &&を&に置き換える (左右の項がtrue or falseの場合に等価)
  • while(1)をfor(;;)に置換
  • カンマ(",")演算子の使用 (カンマ演算子は右辺の値を返す)
  • ブロック末尾直前のマルチステートメント(";")省略
  • javascript:疑似スキームの末尾に置かれるvoid(0)を!1に置換 (false, null, undefinedだとページ遷移しない模様)
  • 変数定義(var)で同じ変数を何度も列挙 (var a=1,b=2,a=3のような記述で、左辺の値を右辺で参照可能)
使っているDOM API
  • window.open
  • window.getSelection
  • Selection#getRangeAt
  • Range#startContainer
  • Range#startOffset
  • Range#endContainer
  • Range#endOffset
  • Node#firstChild
  • Node#childNodes
  • Node#childNodes[]
  • Node#nextSibling
  • Node#parentNode

正規表現メモ

忘れがちなのでまとめておく。
基本的な部分はどこのサイトにでも載っているので割愛。

  • 後方参照 $n,\n
    グループ化した部分文字列を後で利用
    • パターン内で
      /(A)b\1/ → AbAにマッチ
    • 置換文字列内で
      /(A)b\1/, $1 → Aとなる
  • 非格納グループ化 (?:…)
    内部でキャッシュされない
  • 後読み (?<…), (!<…)
    /(?/(!
  • 先読み (?=…), (?!…)
    /hoge(?=fuga)/ → fugaが後に続くhogeにマッチ
    /hoge(?!fuga)/ → fugaが後に続かないhogeにマッチ


Perl正規表現

パターン 意味
(?=XXX) ゼロ幅肯定先読み表現。パターンの後にXXXがある場合にマッチ
(?!XXX) ゼロ幅否定先読み表現。パターンの後にXXXが無い場合にマッチ
(? ゼロ幅肯定後読み表現。パターンの前にXXXがある場合にマッチ
(! ゼロ幅否定後読み表現。パターンの前にXXXが無い場合にマッチ


正規表現 エンジン・ライブラリ

名前 コメント
K2Regexp K2Editor
Irregexp Google Chrome
PCRE(Perl Compatible Regular Expression) Webkit, PHP
JPCRE Webkit?
RE2 Google
鬼車(Oniguruma) 小迫氏作, Ruby
Carakan Opera
Futhark Opera
jre.dll 山田和夫氏作, 秀丸エディタ, EmEditor
hmjre.dll 秀まるお作, 秀丸エディタ
Bregexp SakuraEditor
WREC(the Webkit Regular Expression Compiler) SquirrerlFish Extreme


参考URL
後日書く。
忘れた…

JavaScript言語メモ

プロパティの属性について
  • var宣言文で定義された変数はDontDelete属性がついており、delete演算子で削除することができない。
  • ArrayインスタンスのlengthプロパティなどはDontEnum属性がついており、for in構文で列挙されない。
    object.propertyIsEnumelable(propertyName)でプロパティのDontEnum属性を調べることが可能。

ツイートを読むのに必要な時間を表示するBookmarkletを140文字で書いてみた

元ネタ。
http://tt3000.blog12.fc2.com/blog-entry-15.html
たった一行追加するだけでサイトの滞在時間を13.8%伸ばす方法・・・ | IDEA*IDEA
http://briancray.com/2010/04/09/estimated-reading-time-web-design/


Twitterの自分のTL(https://twitter.com/home)を開いて以下をアドレスバーに入力、Enterで実行してみてね。

javascript:$('.entry-content').each(function(){$(this).parent().next().append($('<b>'+Math.round(this.innerText.length/.67)/10+'秒</b>'))})


文の長さが60文字のワケ - コラム - ライトノベルを書こう!!より、NHKのアナウンサーは1分に平均400文字程度読むということから、文字数/(400/60)で1秒あたりにかかる文字数を計算してます。


参考
jQuery 日本語リファレンス