ブックマーク / nmi.jp (5)

  • WebAssembly を動的生成した場合のパフォーマンスについて

    以下では、それぞれのプログラム実装について詳細を説明していきます。 1. JavaScript simple implementation(js-simple) ソースコード / 実行結果 このプログラムは、JavaScript で BF の文字を 1 文字ずつパースし実行していく、一番シンプルな実装です。対応する括弧のジャンプも、そのたびに愚直に計算して求めています。 一切最適化を施していないため、実行結果はその他のプログラムに比べて一番遅くなっており、各プラットフォームで最も速い結果に比べて 30 倍〜50 倍ほど遅くなっています。 2. JavaScript dynamic-code-creation implementation: single function (js-dcc) ソースコード / 実行結果 このプログラムは、BF の各記号に対応する JavaScript を直接文

  • 正規表現の脆弱性 (ReDoS) を JavaScript で学ぶ

    先日、このようなツイートを書いたところ、かなりの反響がありました。 JavaScript の正規表現の脆弱性の例でいうと、例えば /\s+$/ は脆弱性があると言える console.time(); /\s+$/.test(" ".repeat(65536) + "a"); console.timeEnd(); 結構時間がかかるのがわかる。でも /\s+$/ を見て「これは危険だな」と理解出来る人はそんなにいない。JavaScript に限らないけれど。 — Takuo Kihira (@tkihira) February 17, 2022 これは一般に ReDoS (Regular expression Denial of Service) と呼ばれる脆弱性です。正確に理解するのが難しい脆弱性なので、少し解説してみたいと思います。 結論 長い記事になるので、最初に「とりあえずこれだけ知っ

  • 都会の星の撮り方本を出版しました。WebAssembly を使っています

    先日、都会で撮る 星の軌跡の撮影術 〜はじめて撮る人から上級者まで比較明合成による撮影の完全ガイドというを出版しました。 このは、比較明合成という画像処理によって都会の星の軌跡の撮り方を紹介しているですが、それを WebAssembly を用いてブラウザ内で実現する Web アプリ を作りました(そしてその使い方をの中で解説しました)ので、この記事では WebAssembly による移植周りについて少し解説したいと思います。 なぜ WebAssembly が必要だったか 今回 WebAssembly を、LibRaw というオープンソースソフトウェアをブラウザ上で利用するために使いまいた。 比較明合成をわかりやすく説明すると、複数の画像を比較して、最も明るい点を選択する合成方法です。星は日周運動により地上からは動いているように見えますが、カメラを固定して連写で何百枚と写真を撮り、そ

  • 事業計画書の作り方、新規ビジネスの考え方

    最近、起業を目指している方などから相談を受ける時に、「事業計画書ありますか?」と雑に聞き返すことが多くなってきました。一般的には「事業計画書に何を書けばいいのか?」をわからない人の方が多いでしょう。今回の記事で、事業計画書で重要な事項について解説します。 事業計画書は一般的に起業家が投資家に見せるために用意するものですが、誰に見せてもすぐにビジネスを理解してもらえることを目的に書くのが良いと思います。株の持ち分や個人情報などの機密情報もあるので公開されることはないですが、業界外の人がみても理解出来るように、かつ途中で飽きないように簡潔に書かれていると素晴らしいでしょう。 事業計画書で重要なことは、そのまま起業において大切なことに繋がります。わかりやすいように、なるべく具体的な例を出しながら解説したいと思います。 事業計画書に書かれているべきリスト まずは早速、事業計画書に書かれているべき項

  • JavaScript イディオム集

    JavaScriptでは、初見の人にはさっぱりわからないけれども、ある程度慣れた人は当たり前に使うイディオムが結構たくさんあります。知ってしまえば何てことはないので、私の知っている限りのイディオムとその意味を解説します。 (7/3追記: twitter等で教えていただいた内容を追加しました) +v (数値化) var v = "123"; console.log(+v + 100) // 223 console.log(v + 100) // 123100 vを数値化する方法では最もメジャーです。parseFloat(v) に比べて高速なのに加えて、parseFloatとは細かい挙動が異なります(例えば空文字列の場合、parseFloatならば NaN になりますが、 +v の場合はゼロになります)。必ず数値になることが保証されており、文字列などで数値化出来ない場合はNaNが返ります。 v

  • 1