読者です 読者をやめる 読者になる 読者になる

Unicode と JavaScript の文字列について

パーサコンビネータ を作っていたとき, 最近流行りの (?) 絵文字が変数名として使えるような言語を作る場合に, 正しくコード中の扱うにはどうしたら良いかなどを考えていたら, Unicode と JavaScript の文字列に関する理解が得られたので, ここに共有します.…

String.fromCodePoint が遅かった

発端 ある日, 私は文字列の先頭を切り出すために次のような関数を書いていました. https://github.com/susisu/loquat-core/blob/dcd37f885b5f5b1b0dfdc0e15680375a16239318/lib/utils.js#L97-L113 function unconsString(str, unicode) { if (unicode) { con…

Node.js でコンソールアプリを作る

この記事は OUCC Advent Calendar 2016 の 21 日目の記事です. www.adventar.org こんにちは, @susisu2413 です. みなさんは JavaScript でコンソールアプリを作りたくありませんか? 私は作りたいです. この記事では Node.js (+ NPM) を使って JavaScript で…

npm view をいい感じに整形してくれるやつを作った

ググってもいい感じのが無さそうだったので作りました (既にあったら教えてください). npm i -g npm-sum github.com なにこれ npm にはパッケージの情報を取得する npm view (あるいは show, info, v) というコマンドがありますが, これは全ての情報を含む巨…

tailRecM とパーサコンビネータ

TL; DR tailRecM は, Alternative あるいは MonadPlus でもあるパーサ (ParsecT) において, 再帰的なパーサの定義をする際にも有効. パーサコンビネータは便利 例として文字列リテラルのパーサを書いてみます. BNF で書くと (character はいい感じにやるとし…

パーサコンビネータライブラリを式年遷宮した

パーサコンビネータライブラリ loquat の v2 をとりあえず prerelease しました. フルスクラッチで式年遷宮したのでリポジトリも以前のものとは別になっています. github.com そもそも何をするライブラリなのかみたいな説明は上のリポジトリを見てください. …

ジェネレータを有効活用し隊

こいつ LT ばっかりやってんな. Kyoto.js 11 というイベントで JavaScript のジェネレータについて LT をしました. JS 界隈の色々な話が聞けてよかった(小学生並みの感想). kyotojs.connpass.com 補足説明など スライド中では .next() メソッドをいかにも単…

遅延評価と健康

というタイトル詐欺で, 遅延評価でパーサコンビネータを高速化した話をしました. 健康になるのはプログラムです. パーサコンビネータを題材にしていますが, 要するに今回の話は, 遅延評価といえば無限リストなどが挙げられがちだが, 単に効率化のためにも使…

Node.js で V8 のプロファイラを使う

余談 どうでもいいようなことを投稿するための「小ネタ」カテゴリを作った. 誰もお前に聞いてないとか, そういう感想歓迎です. 本編 node foobar.js の代わりに, node --prof foobar.js みたいにすると isolate-0x***-v8.log みたいなファイルができる. これ…

式年遷宮メモ

ES6 以降で書きなおしたい 読みやすさ モジュールごとに package 分けたい 各モジュール (ファイル) が肥大化しすぎて扱いにくい テストのファイル分割したい 関数ごとにファイルわけないとひどい (現状) エラーメッセージの localization 機能追加 正規表現…

DOM オブジェクトを canvas に描画する方法について

方法1: SVG の foreignObject を使って HTML を埋め込む 参考: Drawing DOM objects into a canvas - Web APIs | MDN SVG の <foreignObject> という要素内に描画したい HTML 要素を埋め込み, それを ctx.drawImage() とかで canvas に描画するという流れ. 利点は, 描画する</foreignobject>…

任意サイズテトリスを JS / HTML Canvas に移植した

こちらから遊べます → dotris 昔Flash で作ったもの (なんと最初のバージョンは 5 年も前らしい) を JS / HTML Canvas に移植しました. 最新の Firefox か Chrome ならとりあえず動くと思います. 2016年7月31日追記: たぶん flag 変更しなくても大丈夫になり…

HTML canvas のビットマップ操作のメモ

未だに Flash 脳の私は canvas の操作をする時に「BitmapData のあのメソッドと同じことをしたい」と考えるのですが, canvas の API はパッと見では必要最低限以下なんじゃないかというくらいの機能しか提供していないので, どうしたら実現できるのかすぐに…

コールバック地獄から async/await に至るまでと, 非同期処理以外への応用

継続渡しスタイル (CPS: Continuation-assing style) 例えば以下は引数として与えられた数に 1 を加えるだけの関数と, それを呼び出すプログラム. function succ(x) { return x + 1; } console.log(succ(2)); // -> 3 CPS では関数がその継続 (callback) を…

2016年エイプリルフール反省会

こういうのを作りました. Lazy Jiro - 神域プログラミング言語 毎年思ってるけどこれ別に嘘じゃないし馬鹿なの私だよね— すしす (@susisu2413) March 31, 2016 なんでこうなったのか 当初やろうと思っていたものが, 急がずに時間をかけてやればそこそこ面白…

ジェネレータを使ってパーサを綺麗に書けるようにした

ライブラリ側の実装は ES2015 の構文を使わずに ES5 互換のままできることに気がついたので, ちゃっちゃーとやりました. github.com 今までは, var lq = require("loquat"); // 愚直に >>= (bind) と >> (then) を使う // do 構文なんてなかった var parser …

間違えて al とタイプするとアリスが歌うコマンドを作った

私は ls -la のエイリアスとして la を使っているのですが, 万が一 al とミスタイプしても問題ないように, アリスが歌ってくれるだけのコマンドを作りました. github.com インストール Node.js (最新版なら確実) と npm のある環境で npm install -g @susisu…

How to 言語実装

この記事は OUCC Advent Calendar 2015 の 13 日目の記事です. 昨日は @yuntan_t 氏による 量子力学 matplotlibで図を描く,保存する,アニメーションさせる でした. さて, 今年 (というか去年の後半から) は何かと言語実装に縁があり, まとめると大体以下の…

Node.js で異なるオブジェクトを親にして Object.create すると速度が死ぬ話

なんですぐ死んでしまうん. 以下の 2 つをご覧ください. 前者 (A) は毎回同じオブジェクトを親にして Object.create() でオブジェクトを作成, 後者 (B) は違うオブジェクトを親にしています. console.time("A"); var parent = {}; var dummy; for (var i = 0…

Node.js (V8) で長い prototype chain を作ったら速度が死ぬ話

Object.create() 大好き人間の私としては, 京都銀行のように長〜〜〜い prototype chain を日常的に作りたくなるわけですが, そんなことをしていたらまた死んでしまいました. 以下は具体的な例で, 浅いケース (shallow) では, ひとつの同じオブジェクトを親…

JavaScript で Lazy K インタプリタを実装した

github.com Emscriptenを使って変換したもの? は見つかったのですが, 生の JavaScript で書かれたものが見つからなかったので書きました. たぶん上手く動いてるんじゃないかしら. Lazy K ってなんですか 詳しくは Lazy K - Wikipedia とか The Lazy K Progra…

Wikipedia から偶然回文になっている文章を見つける その2

前回の記事の続きです. 変更点 辞書を ipadic から mecab-ipadic-NEologd に変更した. github.com 叫び声のようなものなどノイズが多かったので, 適当に弾くようにした. ついでに重複したものが多すぎて結果が見辛かったので, まとめて出力するようにした. …

Wikipedia から偶然回文になっている文章を見つける

Wikipedia 日本語版の記事から見つかった偶然 5・7・5・7・7 になっている文章をツイートする, 偶然短歌botというものがあります. twitter.com inaniwa3.hatenablog.com これと同じように, Wikipedia 日本語版の記事から偶然できている回文を見つけてみたと…

音ゲーを作っていたと思ったらいつのまにか言語を作っていた

というタイトルで LT をした のでスライドを置いておきます.

アボカドbot を Node.js で書きなおした

2011年9月からずっとサーバー上の PHP (EasyBotter) で動かしていたアボカドbot (@Avocado_bot) ですが, この度サーバーがサービスを終了する *1 とのことで, 自宅の Windows PC *2 上で動かすことにしました. ただ, 以前一時的に自宅で動かした時, Windows …

Node.js (v0.12.2) 上で Object.freeze と Object.create を併用すると速度が死ぬ話

Node.js (v0.12.2) でスクリプトが異常に遅かったから色々試したら原因がわかったのでメモ. 次のようなスクリプトで, Object.freeze (あるいは Object.seal や Object.preventExtensions) を行ったオブジェクトと行わなかったオブジェクトをObject.create に…

Object.create(null)

任意の入力文字列に対して値を管理したいとき, Object.create(null) が使える. var obj = Object.create(null); console.log(obj["toString"]); // => undefined こうすると Object.prototype に存在するプロパティ/メソッドを継承しない真に空のオブジェク…