アーカイブ: 2007年11月

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

FC2ブログの個別記事画面から個別編集画面に飛ぶブックマークレット

ずっと面倒だと思ってた。

#!電式ブログ Entry->Edit 作成メモ

記事から編集画面に直接行くBookmarklet「Entry->Edit(FC2)」の作成メモ

僕は個別記事画面から個別編集画面に飛べるだけで満足なので、↓のような簡単なスクリプトにしてみた。

javascript:
    location.href = 'http://'
        + location.hostname.match(/blog\d+\.fc2\.com/)[0]
        + '/control.php?mode=editor&process=load&eno='
        + location.pathname.match(/\d+/)[0]

ブックマークレット

ものすごく手抜きな実装。元記事のようにお行儀のよい処理はしていないので、使う場所を間違えたらバグるので注意。

Firefoxでのみ動作確認。

locationオブジェクトはlocation.hrefだけじゃなくてlocation.hostnameとかlocation.pathnameとかいろいろ使えるから使ってみると便利かも。

続きを読む

スポンサーサイト

[JavaScript]IEで名前つき関数オブジェクトの扱いが変

以前、JavaScriptの名前つき関数オブジェクトのスコープについて調べたことがあった。

僕は名前つき関数オブジェクトを使うのが好きだからよく使う。↓のような感じに。

var fn = function self(i) {
    return (i < 10) ? self(++i) : i;
};

↑の関数はまったく意味がない関数だが、名前つき関数オブジェクトを使えば、var fn = の部分に依存せずに再帰処理が書けることがわかる。つまり、関数定義部分だけ適当にコピー&ペーストして使えるということ。

続きを読む

JavaScriptでマージソート

以前、JavaScriptでクイックソートを書いてみたことがあったが、今度はマージソートを書いてみた。

var sort = function self(list) {
    if (list.length < 2) return list;
    var left = self(list.splice(0, list.length >>> 1)), right = self(list.splice(0));
    while (left.length && right.length)
        list.push(left[0] <= right[0] ? left.shift() : right.shift());
    return list.concat(left, right);
};

比較関数を使う場合は↓

var sort = function(list, comparer) {
    if (!comparer) comparer = function(x, y) { return x - yy - x; };
    return (function self(list) {
        if (list.length < 2) return list;
        var left = self(list.splice(0, list.length >>> 1)), right = self(list.splice(0));
        while (left.length && right.length)
            list.push(comparer(left[0], right[0]) <>= 0 ? left.shift() : right.shift());
        return list.concat(left, right);
    })(list);
};

意外とシンプルなんだなー

[追記 (2011-06-29)]

安定ソートになっていなかったので一部ソースを修正。Thanks, id:escape_artist!

[追記 (2011-07-03)]

比較関数の定義がECMAScriptのsort関数と逆になっていたので一部修正。

アスタリスクで隠されたパスワードを確認

アスタリスクで隠されたパスワードを確認する方法

javascript:(function(){var s,F,j,f,i; s = ""; F = document.forms; for(j=0; j<F.length; ++j) { f = F[j]; for (i=0; i<f.length; ++i) { if (f[i].type.toLowerCase() == "password") s += f[i].value + "\n"; } } if (s) alert("Passwords in forms on this page:\n\n" + s); else alert("There are no passwords in forms on this page.");})();

こういうのを見ると、無意味にコードを短くしたくなる変な癖がある。

ということで、簡単にして短縮したのが↓

javascript:for(var i=0,s='',e=document.getElementsByTagName('input');i<e.length;i++)if(e[i].type=='password')s+=e[i].value+'\n';alert(s||'no passwords')

ブックマーク

元のバージョンはdocument.formsを走査しているので、form要素の中のパスワードフィールドしか拾えないっぽいので、document.getElementsByTagName('input')で全input要素を取得するように改造。

(function() { ... })()でくくってないから変数汚染を起こす可能性があるが、問題になる可能性は低い。どうしても変数汚染を避けたければ↓のバージョンで。

javascript:(function(i,s,e){for(;i<e.length;i++)if(e[i].type=='password')s+=e[i].value+'\n';alert(s||'no passwords')})(0,'',document.getElementsByTagName('input'))

ブックマーク

車輪の再発明

ってことはわかってるんだけど、何でこんなことをやってしまうんだろうな。

追記1

弾さんが同じことやってた!

追記2

id:amachangさんだったら、document#evaluate()を使って

javascript:(function(s,e,t){while(t=e.iterateNext())s+=t.value+'\n';alert(s||'no passwords')})('',document.evaluate('//input[@type="password"]',document.body,null,XPathResult.ANY_TYPE,null));

ってやったりするのかなー

[JavaScript]jQuery#hover()を移植してみた

[追記(2007-12-09)]バグが出たので、修正版を書いて別のエントリーで公開しました。

[追記(2007-11-23)] 改善案を思いついたので書き換え。jQueryの原型をとどめなくなった。

jQueryのhoverメソッドが便利です。↓こんな感じに使います。

$('#example').hover(
    function() {
        this._message = document.createElement('span');
        this._message.innerHTML = 'Let\'s hover.';
        this.appendChild(this._message);
        this.style.backgroundColor = 'yellow';
    },
    function() {
        this.removeChild(this._message);
        this.style.backgroundColor = 'white';
    }
);

続きを読む

[JavaScript][prototype.js]$A関数のコードに感動

prototype.jsの1.6がリリースされましたね。

なんかますます複雑化した感じがします。特に、Class関係のAPIなんかは、もうJavaScriptとは思えない。

んで、例によってソースをつらつらと眺めていたわけですが、$A関数のコードに少し感動。

var length = iterable.length, results = new Array(length);
while (length--) results[length] = iterable[length];
return results;

この発想はなかった。whileを使ってこんなシンプルに配列をコピーする方法があるとは。

ただし、調べてみると、IEとOperaでは↓の方が速いみたいです。

for (var i = 0, l = o.length, r = []; i < l; r[i] = o[i++]);
return r;

インターネットでの決済のオーバーヘッド

インターネットでは決済のオーバーヘッドが大きいからでないかね。

「価格はあなた次第」のレディオヘッド新作、幾らで売れた? - ITmedia News

人気バンドのレディオヘッドが先月、買い手が価格を決められるアルバムをオンライン販売して話題になったが、一銭も払わずにダウンロードした人が6割に上った。

インターネットで実際にお金を払うのは面倒くさい。丁寧に住所とかを名前とかを登録して、リスクとってカード番号送ってとかをするからだ。

もし、今回のレイディオ・ヘッドの企画が、公式サイト上じゃなくてAmazonでやってたら事情が違ったんじゃないかと思う。Amazonなら多くの人がカード番号も登録を済ませて、1クリックで決済できるわけだから。

5ドルくらいなら払う人がたくさん出たんじゃないかな?

なかなかものが良く見えている

Life is beautiful: 優秀なエンジニアは「入社時のスキルを問わない会社」には就職してはいけない

しかし、この書き手の学生だが、なかなかものが良く見えているようですばらしい。

この程度のことを書ける学生ならあちこちにいるような気がするんだが。ブログに書いたりしなくても、会話の中で出てくるぐらいならよくある。

書き手のid:itoyosukeさんが平凡だと言っているのではなく、探せば見つかる優秀な学生を大人がスルーしているのではないかという気がした。

JavaScriptでクイックソート

Haskellでのクイックソートを参考に、JavaScriptで単純なクイックソートを行う関数を書いた。

第一引数にはソートする配列を渡して、第二引数には比較関数を渡す。比較関数はArray.prototype.sortに渡す関数と同じ。

var sort = function(list, comparer) {
    if (!comparer) comparer = function(x, y) { return y - x; };
    return (function s(l) {
        var len = l.length;
        if (len < 2) return l;
        var x = l[0], y = l[1], lt = [], gt = [];
        for (var i = 1; i < len; y = l[++i]) (comparer(x, y) < 0 ? lt : gt).push(y);
        return s(lt).concat([x], s(gt));
    })(list);
};

ソートがこんな簡単に書けるものだと思わなかった。最近、アルゴリズム系の話に興味津々。

Haskellに入門

関数型言語というものにあこがれて、Haskellを勉強してみようと思い立ちました。

とりあえず、Hugsという処理系を導入(ダウンロードしてインストールするだけ)して、いろいろ調べてみました。

でも、まったく意味がわからない…

続きを読む

[PHP][mod_rewrite]ユーザーエージェントでPCとケータイを判別

HTTP_USER_AGENTの文字列を判断して、PCからのアクセスなのかケータイからのアクセスなのかを判別するというのは、広く使われているテクニック。

例えばDoCoMoのケータイならば、ユーザーエージェントの先頭に必ずDoCoMoの文字列が入ることになっているから、それを見てドコモのケータイだと判断すればよい。

先ほど、各キャリアのユーザーエージェントを調べたのでメモ。

続きを読む

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。