素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

2008-08-01から1ヶ月間の記事一覧

いちいちhasOwnPropertyを使わなくてよくする(ジェネレータの使いかた)

prototypeを拡張していると、forやfor eachでループしたときに、それも列挙されてしまって、困る。 なので、for(var i in o)if(o.hasOwnProperty(i){doSomething()};とすることが多いのだけど、hasOwnPropertyというメソッド名が長いので、面倒臭い。また、…

liveなquerySelectorAll

追記:いまいちだったので書き直し。 var liveQuery = function(){ document.addEventListener("DOMSubtreeModified",update,false); var queries = {}; function liveQuery(selector){ if(!(this instanceof liveQuery)) return new liveQuery(selector); t…

Prototype.jsのSelectorのバグ

prototype/src at master · sstephenson/prototype · GitHubを読んで、234行目くらいの、 'checked': "[@checked]", 'disabled': "[(@disabled) and (@type!='hidden')]", 'enabled': "[not(@disabled) and (@type!='hidden')]", という、CSSの疑似クラスをX…

クラス変数、Object.clone、クロージャ

prototype使わないようにすればいいんじゃないかという話。 var base = function() { return function() { var name = ""; return { say: function() { alert(name); }, set name(str) { if (typeof str == "string" || str instanceof String) { return nam…

sizeof、メモ

c

配列のサイズの取得 - 素人がプログラミングを勉強するブログを書いた後に、配列のサイズを取得する部分を関数にしたらうまくいかなかったので、原因とかをメモ。 #include <stdio.h> int size(int *arr){ return sizeof arr / sizeof arr[0]; } int main(){ int arr[</stdio.h>…

mapと__noSuchMethod__(失敗)

を見てたら、格好いいコードを書きたくなった。 で、__noSuchMethod__を使って、 var $ = { __noSuchMethod__: function(name, [parent]) { return parent[name]; } }; $.max(Math)(1,2,3); // 3 と書けるようにした。 本当はこの後に、 Array.map(document.…

配列のサイズの取得

c

sizeof arrayで、array全体のバイト数を取得して、個々の配列の要素のバイト数で割る。 配列の中身はどれも同じ型だから、[0]のバイト数と、他の要素のバイト数は同じ。 #include <stdio.h> int main(void){ int array[42] = {0}; int array_size = sizeof array / si</stdio.h>…

オブジェクトをキーにできるハッシュ(object_id)

ただし、Object.prototypeを汚染してしまう。 次の JavaScript の仕様はこうなる! ECMAScript 3.0 から 3.1 への変更点まとめ - IT戦記を見た感じ、ECMAScript3.1だとenumerableをfalseにできるのでObject.prototypeを汚染してもfor(bar in foo)で列挙され…

最近、Firebugのコンソールを有効にしてるとGreasemonkeyがうまく動かない

Consoleタブの矢印をクリックして、Enabledを選んで、いつもFirebugコンソールを使えるようにしてる。 FirebugのコンソールとGreasemonkeyとの相性が悪いらしく、コンソールを有効にしていると、 FirebugConsoleHandler is not definedというエラーが出てGre…

static変数

c

猫でもわかるC言語プログラミング、148ページまで読んだ。 #include <stdio.h> int counter(void){ static int i = 0; return i++; } int main(void){ int i; for(i = 0;i < 10;i++) printf("%d\n",counter()); // 0, 1, 2, 3, ..., 9 } static変数便利だ。JavaScript</stdio.h>…

querySelectorAllとgetElementsByClassName、速度比較

XPathとSelectorsAPIとgetElementsBy〜の使い分け - 素人がプログラミングを勉強するブログを書いた時に、複数クラス名で取得する場合はquerySelectorsAllのほうが早いと書いたが、本当かどうかきちんと調べてなかったので、やってみた。Googleの検索結果の…

GoogleサジェストをオフにするGreasemonkeyスクリプト

追記:はてブのコメントでid:asiamothに教えてもらいましたが、普通に表示設定で設定できるみたい。Greasemonkeyとかいらない。Googleのホームページから、Googleサジェスト(Google Suggest)の機能を削る。 // ==UserScript== // @name GoogleSuggestOff // …

upperCase()して==するのと正規表現を使う場合の速度比較

追記:正規表現が間違っていたので、コメントを参考に修正。結果は、ブラウザのバージョンによってだいぶ違うみたい。 (function(){ console.time("upperCase"); for(var i=0;i<10000;i++) "POST".toUpperCase()=="POST"; console.timeEnd("upperCase"); })(…

Firebugのconsoleを有効にしているとWebページ側からクリップボードを上書きされる危険性がある

簡単に言うと、下のようなコードをWebページ側が仕込んでいると、ユーザーが気づかないうちにクリップボードを書き替えられてしまう。 <script> window.addEventListener("load",function(){ alert("クリップボード置き替えのテスト"); window._FirebugCommandLine.c</script>…

lengthが自動的に更新されるArrayみたいなオブジェクト

NodeListとかjQueryオブジェクトみたいに配列っぽいものを作る時、普通はlengthは自分で管理しなければいけない。 例えば、 Array.push(arrayLike,123); みたいにすると、lengthをArray.pushがインクリメントしてくれるからいいけど、 arrayLike[arrayLike.l…

動的引数を使ったsum関数

c

動的引数を参考に、引数の数が動的な関数を作ってみた。 けっこう面倒くさい。特に、引数の数を教えなければいけないあたりがスマートじゃないなあ。 #include <stdio.h> #include <stdarg.h> int sum_args(int,...); int main(){ int n = sum_args(10,0,1,2,3,4,5,6,7,8,9); pr</stdarg.h></stdio.h>…

range

Number.prototype.__noSuchMethod__ = function(max_s){ var ret = [], max = + max_s.substr(1); for(var i = this;i <= max;i++) ret.push(i); return ret; }; 1.._3(); // [1, 2, 3]

FizzBuzz

c

ここら辺はJavaScriptとあんまり変わらないな。printfが一つ目の引数の文字列によって二つ目以降の引数に渡すものの型が文字列だったり数値だったり変わってるけど、どうやってるんだろう。気になる。 #include <stdio.h> int main(void){ int i; for(i=0;i<=100;i++)</stdio.h>…

JavaScriptでSXMLを使う(__noSuchMethod__)

neat sxmlを、JavaScriptでやってみようとした。 with({__noSuchMethod__:function(){}}){ x(); // ReferenceError: x is not defined } がうまくいかなかったので、見た目が汚い。 function sxml2dom(list) { var tagName = list[0], childs = list.slice(1…

#defineの使いかた

c

id:qnighyにいろいろ教えてもらったので。それをそのままメモる。 #include <stdio.h> #define square(E) E*E int main(int argc,char* argv[]) { printf("#define square(E) E*E\n\n"); printf("square(10)==%d\n",square(10)); printf("square(100)==%d\n",square(1</stdio.h>…

C言語できるようになりたい

c

id:gin5005くんもやりはじめるようなので僕も始める。 前によく分からなくて放置した「猫でも分かるC言語プログラミング」っていう本を読み進める。 まず、C言語で書いたプログラムをコンパイルするには、gccってのを使えばいいらしい。 vi test.c gcc test.…

Comet通信について(キャンプで書いたコードの一部の紹介)

キャンプ4日目に、グループ実習で通信対戦型のテトリスを作ろうという話になって、僕がクライアント側のJavaScriptのコードをだいたい書いて、id:qnighyがRubyでサーバー側のComet通信の部分を担当する、といったことをしてた。Comet通信もこの時初めて知っ…

セキュリティ&プログラミングキャンプ2008に参加した話

追記:他の人の感想は セキュリティ&プログラミングキャンプに関連する記事集め - 葉っぱ日記にまとまっているようなので、下のリンク集の更新は止めます。昨日は疲れてすぐ寝てしまったので、今日書く。 404 Not Foundの、プログラミングコースのほうに参…

Hash

var Hash; (function(){ Hash=function(n){ this.max=n; this.list=new Array(n); } Hash.prototype.add=function(key,value){ var hv=getHashValue(this.max,key); var lv=this.list[hv]; if(!lv) this.list[hv]=[]; this.list[hv].push([key,value]); retu…

__noSuchMethod__について

Object.prototype.__noSuchMethod__の挙動。 var a={ __noSuchMethod__:function(id,args){ console.log(id,args); } } a.x; // undefined a.x(); // OK console.log(a["y"]); // undefined a["y"](); // MDCには駄目と書いてあるけど、何故か上手くいく。 v…

ラベル付きbreak

普通だったら一時変数にフラグを立てなきゃいけないような場面でも、ラベル付きbreakを使えば一気に多重ループから抜け出すことができる。 例えば、高速なgetElementsByClassName - 素人がプログラミングを勉強するブログをこの構文を使って書き直すと、flag…

GoogleのI'm Feeling Luckyボタンをどける

I'm Feeling Luckyボタンは使わないので、画像検索に変える。 // ==UserScript== // @name GoogleFeelingChanger // @namespace http://d.hatena.ne.jp/javascripter/ // @include http://www.google.co.jp/ // ==/UserScript== var [b]=document.getElement…

newを省略できる、可変引数を取るコンストラクタの作り方

追記:コメントを元に、__proto__を使ったthisのエミュレートをやってみた。結構シンプルでいい。 参考:JavaScript のコンストラクタ関数 - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。 - subtech function defer(){ if(!(this instanceof de…

GM_xmlhttpRequest風XMLHttpRequestラッパー

追追記:前にやつも直した。拡張機能向けだと、XHR — Gistがおすすめ。 追記:コメントで変数がグローバルになっていると指摘されたので直した。 function GM_xmlhttpRequestModoki(method,url,headers,data,onload,onerror,onreadystatechange){ if (typeof…

DocumentFragmentとdisplay:none、documentに直接追加する場合の速度比較

追記:コメント欄で指摘されたように、下のコードではイベントリスナは削除されなかった。 DocumentFragmentに一旦ストックすると、登録したイベントリスナは削除される。cloneNode、innerHTMLなども同様。 つまり、下のようなコードを書いて、ドキュメント…