JavaScript

JavaScriptのsetTimeoutをログに出す

setTimeoutは難しい。いつ呼ばれるかよく分からないし、ライブラリーを使うとそのライブラリーがsetTimeoutを使いすぎてしまう。よく分からなかったけどsetTimeoutすると動くからそうしていた、んだけど実はタイミングの関係で偶然うまく動いているように見…

sjsp 0.1.0 をリリースしました

先日作ったsjspですが、その挙動も安定し、最低限必要かと思われるオプションを作ったので、最初の安定版リリースとして0.1.0というタグを打ちました。 itchyny/sjspgithub.com 同時に、Hackageにもアップロードしました。 sjsp: Simple JavaScript Profiler…

シンプルでかつ最高のJavaScriptプロファイラ sjsp を作りました! ― Webアプリケーションが複雑化する中でプロファイラに求められるものとは何か

あらすじ Web技術が複雑になる中で、JavaScriptのプロファイリングをとる方法とは。 プロファイリングを取るためのコードを手で書いてみましょう。 とてもシンプルで、かつ最高のJavaScriptプロファイラ sjsp を作りました。 本当にあった怖い話 上司 「とに…

GitHubのヘッダーを改善する! Google Chrome用拡張 GitHub Better Headerを作りました

最近、GitHubのヘッダーのデザインに変更があり、いくつかのリンクの位置が移動しました。Pull requestやIssuesのリンクはなかなか便利で、これはいい改善なのですが、元々あったリンクでよくクリックしていたものがドロップダウンの中に入ってしまい、使い…

Google Chrome用Vimpのニューフェイス、cVim登場!

Vimium、Vichrome、Vromeと、Google ChromeをVimのキーバインドで扱える拡張は幾つかありましたが、 ここに来て新しい拡張が登場しました。 cVimです。 Chrome Web Store - cVim特徴としては Vimのようなフォーマットの設定ファイル ビジュアルモードでテキ…

JavaScriptとcanvasで画像処理

私は画像処理を避けてきました.画像処理ってなんだか難しそうだし, そもそも画像を簡単に扱ってデバッグしてみたいな環境をあまり知らなかったんです. もう画像処理は怖くない.我々にはcanvasがあります. ふと思い立って, canvasで画像処理するようなものを…

実装して理解する遅延評価の仕組み 〜 thunkを絵に描いて理解しよう・JavaScriptでHaskellを実装!?

この記事では, Haskellに用いられる「遅延評価」の仕組みを, 図に描いて説明します. 更に, 遅延評価版のフィボナッチ数の無限列を, JavaScriptで実装します. 遅延評価とはどのように動くのか, 考えて行きましょう. HaskellのコードとJavaScriptのコードの比…

chrome web storeのアプリの審査は以前より厳しくなった

私がまだchromeのpackaged appを作って頻繁に更新していた頃は, アプリケーションをzipで固めたものをアップロードしたら一時間もせずに公開されていた. 非常にGoogleらしい, 自由でいいな, と思った. 嫌な雰囲気が漂い始めたのは, manifest versionを上げろ…

いつの間にか同期と非同期の融合の時代になってた

JavaScriptについては, 自分はいっぱいのことを知ってると思ってた.だけど, ちょっと触らないうちに, 世界はダイナミックに動いているようだ.取り敢えず, どんな他の解説を見るより, 次の動画を見て欲しい. Deferreds - Putting Laziness to Work | Dan Hebe…

chrome.extension.sendRequestへの不満

どうも, 使いにくい.まず, いいところを先に言っておこう.chrome.extension.sendRequestの良いところ, それはコンテンツスクリプトへのマルチキャストができること.分かってる人ならこれ以上のことは説明しないでも分かってくれると思う. なにが不満かという…

createObjectURLの発行したURLが無効になった時

って仕様上は500番ですよね?Google Chromeは404(Not Found)を返すような 最近コイツのurlが殺されない方法を考えてるbackground_pageにcreateObjectURLが発行したURLを送ってやれば,セッションを閉じてもbg-pageが生きてるからURLも生き続けるよね的なまぁb…

Local Playerがビデオ対応しました!!!

Local Playerがビデオに対応しました!!! ローカルのディスクにある動画(mp4)を再生できるようになりました!!!createObjectURLを使えばいいということに昨日気がついて, これだけはアップしておこうと思ってリリースしました.もう再生ソフトなんていら…

createObjectURLがすごい件

最近またLocal Player (Chrome Player)を実装しなおしています.一応説明しておくと, Local Playerは, 完全にローカルで動作する音楽プレイヤーです.シンプルさを求め(実装がめんどくさいだけ), 操作しやすく(これは大事), 良い感じのプレイヤーです.半年前に…

Jison入門!!!

最近, Jisonを使おうとしている人をちらほら見るので, ちょっと入門的なやつを書いてみる. 定義(てけとー Jisonというのは, JavaScriptで書かれたパーサーを吐くことができる, パーサジェネレーターの一つ 現在Jisonは https://github.com/zaach/jison で入…

CoffeeScriptをやってみた

ずっと避けてきたCoffeeScriptを使ってみた HTMLはJade,CSSはLESS,JavaScriptはCoffeeScriptがいいんじゃないかな? インストールとかは公式に載ってるから割愛三つともVimのsyntaxが既に作られているのは嬉しい テキトーに書いたサンプルみたいな物Jade LESS…

1 > 2 > 1はfalse

1 2 > 1はfalse.トンチですか?いいえ, JavaScriptです. 優秀な奴はPython.エラーを吐くのはHaskell.嘘を付くのがJavaScript. なんでJavaScriptでこんなことになるのか.関係を表す演算子は左から評価されます.3 > 2 > 1 → (3 > 2) > 1 → true > 1両辺のToNumb…

SyntaxError: Unexpected token }とは何か

Google Chromeのコンソールで, 「(」と打ってEnterしてみましょう. > ( SyntaxError: Unexpected token } えっ...? 僕 } なんて打ってないよ... ワケがわからないよ...いろいろ実験してみましょう. > ( SyntaxError: Unexpected token } > - SyntaxError: Unex…

1..nが配列になるある一つの方法

> Number.prototype.n = function () { for(var i = +this, a = []; i <= n; a.push(i++)); return a; } [Function] > n = 15 15 > x = 1..n () [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] > x [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1…

if文の{}はどんな場合でも書くべきか?

JavaScriptでは, ifの{}は省略できます. if (a > 10) foo(); else bar(); hoge(); は if (a > 10) { foo(); } else { bar(); } hoge(); と同じ. ECMAScriptの定義では, 12 Statement Statement: Block ... 12.1 Block Block: { StatementList(optional) } St…

正規表現で数式パーサー書いたよ!

最近コンパイラーのお勉強をしてます.練習で数式のパーサーをSLR(1)で書いてみたり,単純に下降再帰で書いてみたり,演算子順位法で書こうとしたりしています...でも, 数式をパースするだけなら, スタックとか作らなくてもいいんじゃね?数式を手計算で変形して…

下降再帰/演算子順位で数式パーサー

前回の記事の続き的な何か.数式パーサーを下降!!!! じゃなくて書こう!!! 実は, id:ajalabox さんの http://d.hatena.ne.jp/ajalabox/20110328/1301319299 にかなり精神的に影響を受けた. うおおおおおおおおおおおおお俺も言語処理系作りてええええええええ…

JavaScriptで/.*/()とは何か.

最初に, 皆さんにブラウザーのコンソールで/.*/()を試していただきたい. そして, 他のタブとか色々試して欲しい.どんな文字が返ってきましたか?多分一意じゃないはず. バラバラ. ワケが分からないよ.そこで, このエントリーを思い出した. (前にも見たことあ…

JavaScriptの配列を結合したくなイカ?

配列を結合したいでゲソ! 堅実に定義するでゲソ! function concatenate (x, y) { for (var i = 0; i < y.length; i++) { x[x.length] = y[i]; } return x; } > concatenate(concatenate([1, 2, 3], [4, 5, 6]), ['foo', 'bar']) [ 1, 2, 3, 4, 5, 6, 'foo', …

JavaScriptで配列の結合を"+"で書きたい.

やりたいことはタイトルのとおり.要はオーバーロードしたいお...※※※※ こういう願いは既出であること間違いないっ, ※※※※ よってここに書いてること, あるいは ※※※※ さらにエレガントな事がどっかに書かれてるかもしれないっ!!!とりあえずECMA-262を読んでみる…

JavaScriptでQuine書いてみたよ!

前から, Quineというものがあることは知っていたのですが, 難しそうでずーっと避けていました.なんとなく気になって書いて見た.Quineと言うのは, ソースコードと全く同じ内容を出力するようなプログラムです.書いてる時には, 「あっちを編集したらこっちがう…

Closure CompilerのAPIをnode.jsで叩こう!

Closure Compiler使ってますか? JavaScriptのコードを圧縮してくれるGoogleのサービスです. 圧縮してくれるだけじゃなくて, ちゃんとErrorやWarningも吐いてくれるので, 私はJavaScriptのコードの検証にも使っています.さて, このClosure CompilerにはAPIが…

Chrome Player

Google Chromeで動くアプリケーション「Chrome Player」を公開しています. ローカルにある音楽ファイルをブラウザーで再生しよう! みたいなソフトです. 最初はひどい状態でしたが, 今はなんとか使い物になるレベルになってきて, ユーザー1000人超えました! …

JavaScriptのオブジェクトを見る

JavaScriptのオブジェクトを全部展開してみたいなぁという時に, var printobj = function(x){ (function(x, indent, output){ for(i in x){ output(indent + i + ': ' + x[i]); if(typeof x[i] == 'object'){ arguments.callee(x[i], ' ' + indent, output);…