FC2ブログの個別記事画面から個別編集画面に飛ぶブックマークレット
- 2007-11-30
- カテゴリ: Client Side
- タグ: JavaScript Tips トラックバック ブックマークレット
ずっと面倒だと思ってた。
記事から編集画面に直接行く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で名前つき関数オブジェクトの扱いが変
- 2007-11-29
- カテゴリ: Client Side
- タグ: Tips JavaScript IE バグ トラックバック
以前、JavaScriptの名前つき関数オブジェクトのスコープについて調べたことがあった。
僕は名前つき関数オブジェクトを使うのが好きだからよく使う。↓のような感じに。
var fn = function self(i) {
return (i < 10) ? self(++i) : i;
};
↑の関数はまったく意味がない関数だが、名前つき関数オブジェクトを使えば、var fn = の部分に依存せずに再帰処理が書けることがわかる。つまり、関数定義部分だけ適当にコピー&ペーストして使えるということ。
JavaScriptでマージソート
- 2007-11-28
- カテゴリ: Client Side
- タグ: Tips 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 y - 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);
};
意外とシンプルなんだなー
アスタリスクで隠されたパスワードを確認
- 2007-11-26
- カテゴリ: Client Side
- タグ: Tips JavaScript 安易な発想 トラックバック
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-11-22
- カテゴリ: Client Side
- タグ: Tips JavaScript hover prototype.js jQuery
[追記(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関数のコードに感動
- 2007-11-08
- カテゴリ: Client Side
- タグ: JavaScript prototype.js 配列
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でクイックソート
- 2007-11-05
- カテゴリ: Client Side
- タグ: Tips 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);
};
ソートがこんな簡単に書けるものだと思わなかった。最近、アルゴリズム系の話に興味津々。
[PHP][mod_rewrite]ユーザーエージェントでPCとケータイを判別
- 2007-11-04
- カテゴリ: Server Side
- タグ: Tips ケータイ mod_rewrite apache PHP Perl 正規表現
HTTP_USER_AGENTの文字列を判断して、PCからのアクセスなのかケータイからのアクセスなのかを判別するというのは、広く使われているテクニック。
例えばDoCoMoのケータイならば、ユーザーエージェントの先頭に必ずDoCoMoの文字列が入ることになっているから、それを見てドコモのケータイだと判断すればよい。
先ほど、各キャリアのユーザーエージェントを調べたのでメモ。

