JS

JavaScript で 32bit int を扱う

JS

追記 (2014/3/21) 最近ではMath.imulというものがあります。 Math.imul() - JavaScript | MDN signed int への変換: x | 0 unsigned int への変換: x >>> 0 これで大抵の場合はうまくいく。IEEE64bit浮動小数点数では整数は2の53乗までしか正確に表現できな…

V8 で -- array.length; より array.pop(); の方がかなり速い

JS

function strTimes(str, times) { var result = ''; for(var i = 0; i < times; ++ i) { result += str; } return result; } function benchmark(s, n) { var array = []; for(var i = 0; i < n; ++ i) { array[i] = null; } var body = ''; if((n / 50 | 0)…

Webkit Nightly Builds (r39088) で setTimeout 内で canvas 2d context の fillText メソッドを呼んでも何も描画されない

JS

環境: WebKit-r39088 (Windows XP Home SP2) デモ: http://www.fujidig.com/misc/js/canvas/safari-canvas-text.html <html lang="ja"> <head profile="http://purl.org/net/ns/metaprof"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </meta></head></html>

Firefox 3.1 beta 1 で display: none な iframe 内の canvas 2d context の font プロパティに代入するとエラーが出る

JS

デモ <meta charset=utf-8> <title>Firefox 3.1 beta 1 で display: none な iframe 内の canvas 2d context の font プロパティに代入するとエラーが出る</title> <script type="text/javascript"> window.addEventListener('load', function() { var iframe = document.createElement('iframe'); iframe.setAttribute('width',</meta>…

canvas で矢印キーを受け取るサンプル - フォーカスが当たっているときにキーの動作を奪ってページがスクロールしないように

JS

canvas で矢印キーを受け取るサンプルです。矢印キーに対応して四角が動きます。 http://www.fujidig.com/misc/js/canvas/keymove1.html window.addEventListener('load', function() { var canvas = document.getElementById('game-screen'); var x = 50, y…

V8 (Google Chrome) でのバグ(switch - caseで間違えてdefaultに飛ぶ)

JS

V8 version 0.4.2.1 (trunk rev.678)で以下のコードで「3!」が出力されるべきなのに、「default!」が出力されます。(Google Chrome 0.3.154.9 でも再現するバグです) var a = 3; a += 0x7fffffff; a -= 0x7fffffff; switch(a) { case 0: break; case 1: br…

with と function 文

JS

var Foo = {}; with(Foo) { Foo.Bar = 1; function f() { Bar; } } f(); は Firefox ではエラーが出ないけど、 IE, Safari, Opera, Google Chrome で ReferenceError が出る。 var Foo = {}; with(Foo) { Foo.Bar = 1; var f = function f() { Bar; } } f();…

文字列のn行目のインデックスを取得

JS

文字列のn行目の先頭が文字列先頭から何文字目かを取得する関数。 4 つ書いてみた。 function getLineIndex1(str, lineno) { var curline = 0; var len = str.length; for(var i = 0; i < len; i ++) { if(curline == lineno) return i; var c = str.charAt(…

JavaScript による HSP インタプリタ HSP on JS

http://www.fujidig.com/hsp-on-js/samples.html HSP on JS は JavaScript による HSP のインタプリタの実装です。 CodeRepos にリポジトリを置いて開発しています。 対応している機能 まず、 GUI 描画命令はありません。 mes 命令を実行したら textarea に…

仮引数に代入するとargumentsで得られる値も変動するんですね...

JS

(function(a){a=1;return arguments[0]})(9,8,7) // => 1知りませんでした><

配列の最後から n 個値を取得するときに arr.slice(-n) とすると n が 0 のとき期待しない値になる

JS

タイトルどおり。 スタックから n 個 pop するときに var args = stack.slice(-argc); stack.length -= argc; とかしてたんだけど、これだと argc が 0 のとき args が空の配列でなく stack 全体のコピーになってしまう。 これでハマった。 - はてさて、どう…

SleepVM に関数呼び出しを追加してみた

JS

るびま には宿題として関数呼び出しを実装してみろ、というのがあったのでやってみました。 http://www.fujidig.com/misc/js/sleepvm2.html サンプルのプログラムとしてユークリッドの互除法をやってみました。 # goto :main :gcd # ユークリッドの互除法 ge…

RubiMaVM の JS 移植版に sleep をつけてブラウザで固まらずに複数動作できるようにしてみた

JS

http://www.fujidig.com/misc/js/sleepvm.html

RubiMaVM を JavaScript に移植してみた

JS

VM に興味がわいたので るびま を読んだ。 そして、 RubiMaVM を Javascript に移植してみた。 var RubiMaVM = {}; RubiMaVM.Instruction = function Instruction(code, opts) { this.code = code; this.opts = opts; }; RubiMaVM.Instruction.prototype.toS…

赤黒木の画像化 canvas バージョン

JS

http://www.fujidig.com/misc/js/treemap.html 元ネタ : 二分木画像化レシピ - 日記を書く [・w・] はやみずさん 以前の Ruby のとき : 二分木の画像化 - fujidigの雑記 以前の Ruby のとき : 赤黒木アニメーション - fujidigの雑記 この前は Ruby で PostSc…

キャンバスで遊び中 - darker 。。。

JS

globalCompositeOperation = 'darker' が Firefox と Opera で使えなくて、 Safari でも自分の期待する動作と違う。 例えば、色180の上に色100でdarkerで描画したとき 期待する動作: 結果の色が 80 になる ( 80 = 180 - 100 ) Safari の動作: 結果の色が 25 …

キャンバスで遊び中 - ベジェ曲線で楕円を描画する関数

JS

function drawEllipse(ctx, x0, y0, x1, y1, fill_p) { var w = (x1 - x0) / 2; var h = (y1 - y0) / 2; var C = 0.5522847498307933; var c_x = C * w; var c_y = C * h; ctx.beginPath(); ctx.moveTo(x1, y0 + h); ctx.bezierCurveTo(x1, y0 + h - c_y, x0…

キャンバスで遊び中 - ベジェ曲線のメソッドで円描けた!

JS

var canvas = document.body.appendChild(document.createElement('canvas')); canvas.width = 400; canvas.height = 400; var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.moveTo(200, 100); ctx.bezierCurveTo(200, 45, 155, 0, 100, 0); ctx.be…

キャンバスで遊び中 - 線の幅を変えることなく楕円を描画したい

JS

楕円を描画したい。scale を使うと線の幅が変わっちゃうだろうなあと思ったら案の定そうだった。 var canvas = document.body.appendChild(document.createElement('canvas')); canvas.width = 400; canvas.height = 300; var ctx = canvas.getContext('2d')…

キャンバスで遊び中 - 任意の色を透明にしてコピー

JS

getImageData & putImageData ! http://www.fujidig.com/misc/js/canvas/transparent-color-copy.html var Color = function Color(r, g, b, a) { this.r = r & 255; this.g = g & 255; this.b = b & 255; this.a = a; if (typeof (this.a) == 'undefined') …

キャンバスで遊び中 - 描画されている範囲をえる

JS

getImageData!! http://www.fujidig.com/misc/js/canvas/trim.html var canvas = document.body.appendChild(document.createElement('canvas')); canvas.width = 200; canvas.height = 200; var ctx = canvas.getContext('2d'); for(var i = 0; i < 3; i++)…

キャンバスで遊び中 - マウスカーソル下の色を表示

JS

http://www.fujidig.com/misc/js/canvas/additive-color.html getImageData や opera-2dgame の getPixel で色を取得できると知ったのでやったみた。 キャンバスで遊び中 - 光の三原色 - fujidigの雑記を改造。 あと Color クラスとか作った。どうみても車輪…

キャンバスで遊び中 - 虹を表示

JS

http://www.fujidig.com/misc/js/canvas/rainbow.html var canvas = document.body.appendChild(document.createElement('canvas')); canvas.width = 200; canvas.height = 200; var ctx = canvas.getContext('2d'); var radgrad = ctx.createRadialGradient…

キャンバスで遊び中 - 簡易お絵描き

JS

http://www.fujidig.com/misc/js/canvas/oekaki.html mousemoveイベントの発行タイミングとドラッグ - 素人がプログラミングを勉強していたブログの改造。 たしか一番最初にCanvasをいじったプログラム。この記事がCanvasを触るきっかけでした(前からいつか…

キャンバスで遊び中 - ランダム模様

JS

HSP でもこういうのを作ったことを記憶してます。なつかしす。 http://www.fujidig.com/misc/js/canvas/get-image-data.html function rand256() { return Math.floor(Math.random()*256); } var canvas = document.body.appendChild(document.createElement…

キャンバスで遊び中 - 光の三原色

JS

var canvas = document.body.appendChild(document.createElement('canvas')); canvas.width = 480; canvas.height = 480; var ctx = canvas.getContext('2d'); ctx.fillStyle = 'black'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.translate(c…

HSPのrndを(ry

JS

var randomize; var rnd; (function(){ var x = 1; randomize = function(a) { x = (a||+new Date)|0; }; rnd = function(a) { x = (x*214013|0)+2531011|0; return ((x >> 16) & 32767) % a; }; })(); var pre = document.body.appendChild(document.create…

キャンバスで遊び中 - globalCompositeOperation 描画結果一覧

JS

http://www.fujidig.com/misc/js/canvas/composite.html 描画結果 Firefox 3.0 RC2 ( Ubuntu 8.04 ) Opera 9.5 ( Ubuntu 8.04 ) Safari 3.1.1 ( Windows XP Home SP2 ) Google Chrome 2.0.166.1 プログラム <body> <style> body { background-color: #ffc; } canvas { bor</style></body>…

キャンバスで遊び中 - テキスト表示

JS

http://www.fujidig.com/misc/js/canvas/chars.html キャンバスはテキストの表示ができませんが、ASCII文字テーブルの画像を用意して切り貼りすればそれっぽいことができます。 http://www.fujidig.com/2008/06/images/chars.png var run = function() { var…

キャンバスで遊び中 - 砂嵐

JS

キャンバス楽しい! function rand256() { return Math.floor(Math.random() * 256); } function rand_graycolor() { var c = rand256(); return "rgb(" + c + "," + c + "," + c + ")"; } var canvas = document.body.appendChild(document.createElement('…