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

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

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

2009-01-01から1年間の記事一覧

逆ポーランド記法

1 3 + 5 / 2 - 3 += 1.8のような式を計算する。整数の四則演算のみ対応。 RPN Calculator function calculateRPN(expression) { var result = 0; var stack = []; var i, c, n, m, x, y; var zero = 48, nine = 54; for (i = 0; i < expression.length; ++i)…

untitled

書きました。 javascripter's gist: 77637 — Gist

URI

locationと同じように使えるURIコンストラクタ。new URI("http://example.com/foo?q=bar#qxx").searchのように使う。 function URI(uri) { uri = String(uri); var parser = /^([^:/?#]+:)?\/\/(([^/?#:]*):?(\d*))?([^?#]*)(\?[^#]*)?(#.*)?$/; var m = uri…

abbrをルビとして表示する

Firefoxの拡張、 HTML Ruby for Firefox ではXHTML Ruby Supportのようにabbrをルビとして表示する機能はサポートされていないので、自分で書く必要がある。この拡張は更新頻度が高いのでソースコードを直接弄るのは避け、abbrをruby要素に変換する方式を取…

Worker

Workerに置いたWorkerの使用例について。 <html> <head> <title>Worker</title> <style> pre { white-space: pre-wrap; } </style> <script>window.onload = function () { var view = document.getElementById("view"); var worker = new Worker("pi.js"); worker.onmessage = function (ev) { view.textConte</head></html>…

クリックジャック

最近流行のクリックジャックについて、メモ程度にまとめておく。 一言で言うと、外部サイトのボタンをユーザが間違えてクリックしてしまうように仕向けるテクニックが、クリックジャックである。 クリックジャッキングってこうですか? わかりませんではifra…

Python風else付きforイディオム

breakした時にだけ実行されるelse節のイディオム。 outer: { inner: { for (var i = 0; i < 10; ++i) { continue; } break outer; } alert("else clause"); } alert("hello!"); hello! outer: { inner: { for (var i = 0; i < 10; ++i) { break inner; } bre…

プロパティアクセスの速度

に置いた。 A: 13 B: 55のように、メンバが静的な場合には最適化がかかってかなり高速になる(Firefox、Safari、Opera)。jQueryとかはインスタンスを配列風に使っているせいでブラウザの最適化が適用できなくなって損しているんじゃないだろうか。 ここらへん…

XPathEvaluator

var XPath = { cache: null, reset: function () { this.cache = {__proto__: null}; }, get: function (context, expr, type) { var cache = this.cache, evaluator; if (expr in cache) { evaluator = cache[expr]; } else { evaluator = cache[expr] = XP…

WebKitのバグ

こういうコードを書いた。 function inspect(evaluator) { var title = "code:", code; while ((code = prompt(title)) !== null) { title = evaluator(code); } } (function () { var i = 0; inspect(function (code) {return eval(code);}); })(); Firefox…

Firebugのパッチ

だいぶ前からFirebugのコンソールをenabledにしてても"Firebug cannot find _firebugConsole element"というエラーが出てリロードしないと動かなかったりしたので、応急処置をした。 Index: console.js ===================================================…

括弧の対応

c

#include <stdio.h> int brackets(char *str) { int bra = 0; for (; *str; str++) { if (*str == '(') { ++bra; } else if (*str == ')') { if (--bra < 0) return 0; } } return !bra; } int main(int argc, char **argv) { puts(brackets(argc > 1? argv[1]: "")? </stdio.h>…

RubyでJavaScriptのプロトタイプもどき

prototype - 素人がプログラミングを勉強するブログの続き。RubyユーザがJavaScriptのオブジェクト指向を学ぶ時に使えるかもしれない。 =begin JavaScriptのようなオブジェクトの実装。 JSObject.newがJavaScriptのnew Object()相当であり、プロパティへの代…

オブジェクトをハッシュテーブルとして使う場合に注意すべき事

javascripter's gist: 64615 — Gist をテストしている時に気がついたこと。 最も一般的な var hashtable = {}; var key = "foo"; if (key in hashtable) { // has key } hashtable[key]; // lookup hashtable[key] = "bar"; // add は、keyがObject.prototyp…

REPL

JavaScript REPLに置いた。OperaのDragonflyは一行しか入力できなくて窮屈なのでこういうのを用意しておくと便利。 いくつかユーティリティ関数を書いておくと快適。 function keys(object) { var keys = []; for (var k in object) keys.push(k); } functio…

printfの可変長引数と型

c

printfの第二以降の引数にいろいろな型の物を渡せる仕組みについて。 まず、可変長引数を使うためにstdarg.hを#includeする。 #include <stdarg.h> で、 void myprintf(char *format, ...); のようにプロトタイプを宣言する。 関数の可変部はどんな型でも受け取ること</stdarg.h>…

プロパティ名と予約語

javascript:try{eval("top.if"),alert(!0)}catch(e){alert(!1)} を実行してtrueになるのはFirefoxだけで、Opera、Safariではfalse。 JavaScript1.7からサポートされているらしい。 getterやsetterを作る時に使うget、set等のキーワードは、どのブラウザでも(…

データ構造等のメモ

Schemeにあるデータ構造についてのメモ。よく分かってない。 数値 1 0.1 99999999999999999999999 ; 大きい数が扱える (* 1 6) ; 6 (= (0.1 * 6) 0.6) ; # #f 小数が絡むと演算の誤差が入る (/ 1 7) ; 有理数が扱える Schemeでは正確数と不正確数に分かれて…

コンパイル時FizzBuzz

http://anond.hatelabo.jp/20081025202001(via b:id:qnigy)で、こういうのはやっぱりSchemeだなと思って書いた。よく考えれば、ファイルに書き出すまでをあらかじめしておけばよかった。

liveイベント

jQueryでサポートされたliveなイベントがどういう風に実現されているのか調べた。かなり複雑だったので詳細は追わなかったが、このようにしているようだ。 var live = function (selector, type, fun) { document.addEventListener( type, function (e) { va…

マクロ

(define-macro (alias new-name old-name) `(define-macro (,new-name . body) `(,,old-name ,@body))) (alias -> 'lambda) (alias identity 'values) (alias いふ 'if) old-nameをシングルクオートで括っているのは、特殊形式に対応するため。 マクロを定義…

ちっこいライブラリ

Greasemonkeyとかから使えるように、よく使う関数を小さくまとめて javascripter's gist: 54503 — Gist に置いた。

疑似ハッシュ

ハッシュのようにアクセスできるけどコンパイル(マクロ展開)時にvectorのインデックスに置き換えられるようにする。 (define-macro (let-pseudo-hashtable accessor-name key&value . body) (let ((key-table (make-eq-hashtable)) (value-vector (gensym)))…

document.readyState

Firefoxでdocument.readyStateがサポートされていた。確認したバージョンはMozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1pre) Gecko/20090124 Minefield/3.2a1pre。 document.readyStateで、document.readyStateがどのような値になる…

非決定性計算

4つの数字から10になる式を探すプログラム(切符の問題とも呼ばれる)を書いた。choose関数とfail関数は、404 Not Foundをypsilon上で動くように少し直した物。 (define *paths* '()) (define *fail* (gensym)) (define (choose choices) (if (null? choices) …

CSSを追加する関数

の39番目とGM_addStyleの実装と最適化 - 0xFFについて。 まず、style要素を使う方法。 function addStyle(css) { var style = document.getElementsByTagName('style').item(0); if (!style) { style = document.createElement('style'); style.type = 'text…

正規表現にコメントをつける

Perl風 RegExp.prototype.__defineGetter__( 'x', function () { if ('__x' in this) return this.__x; var source = this.source; var flags = ''; var re; source = source.replace(/([^\\]) +/g, '$1'); // trim spaces source = source.replace(/([^\\])…

コードの整形

追記:Twitter / 10th543: あ・・・ボタンが��で指摘されたのでmetaタグを追加した。どちらにしろ、script要素のdefer属性を使っているので、Firefox3.1以降じゃないと動かないと思う。 FIrefoxだと、Function#toSourceに数値を渡せばきれいにインデントして…

スタイル

最近はこう書いている。 /* copyrightやlicense情報は必要だったら最初に複数行コメントで書く */ // グローバル変数を初めにvarで宣言する var global = window; // 関数を使用する前に関数本体を書く function times(func, n, self) { // var宣言は最初に…

static

これは便利。 var counter = function () { var static = /(^o^)/; return ('i' in static)? ++static.i: static.i = 0; }; console.log(counter()); // 0 console.log(counter()); // 1 console.log(counter()); // 2 console.log(counter()); // 3 正規表…