diff options
| -rw-r--r-- | vhosts/blog/content/posts/2023-10-02/compile-php-runtime-to-wasm.dj | 30 | ||||
| -rw-r--r-- | vhosts/blog/nuldoc.md | 104 | ||||
| -rw-r--r-- | vhosts/blog/public/atom.xml | 4 | ||||
| -rw-r--r-- | vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html | 36 | ||||
| -rw-r--r-- | vhosts/blog/public/posts/atom.xml | 4 | ||||
| -rw-r--r-- | vhosts/blog/public/posts/index.html | 2 | ||||
| -rw-r--r-- | vhosts/blog/public/tags/php/atom.xml | 4 | ||||
| -rw-r--r-- | vhosts/blog/public/tags/php/index.html | 2 | ||||
| -rw-r--r-- | vhosts/blog/public/tags/wasm/atom.xml | 4 | ||||
| -rw-r--r-- | vhosts/blog/public/tags/wasm/index.html | 2 |
10 files changed, 77 insertions, 115 deletions
diff --git a/vhosts/blog/content/posts/2023-10-02/compile-php-runtime-to-wasm.dj b/vhosts/blog/content/posts/2023-10-02/compile-php-runtime-to-wasm.dj index da7438ab..0f74de70 100644 --- a/vhosts/blog/content/posts/2023-10-02/compile-php-runtime-to-wasm.dj +++ b/vhosts/blog/content/posts/2023-10-02/compile-php-runtime-to-wasm.dj @@ -11,6 +11,10 @@ tags = [ [[article.revisions]] date = "2023-10-02" remark = "公開" + +[[article.revisions]] +date = "2025-04-23" +remark = "fflush() の前に改行の出力が必要だった理由と正しい実装について追記" --- {#intro} # はじめに @@ -102,6 +106,32 @@ int EMSCRIPTEN_KEEPALIVE php_wasm_run(const char* code) { これにより、PHP コードの出力の後ろに余分な改行が追加されてしまう。 改行を出力せずともバッファを消費させる手段をご存知のかたはご教示願いたい。 +::: note +**2025-04-23 追記**: + +`fflush()` の前に改行の出力が必要だった理由が判明したので追記する。 +これは、`index.mjs` で標準出力・標準エラー出力へ出力する方法を指定せず、デフォルトの実装に任せているため。 +Emscripten のデフォルト実装では、改行コードを出力するまで出力内容がバッファリングされ、`fflush()` が機能しない。 + +デフォルトの出力方法は `index.mjs` の中で `PHPWasm()` を呼ぶとき、`stdout`・`stderr` というオプションを渡せば変更できる。 + +```javascript +const { ccall } = await PHPWasm({ + stdout: (c) => { + if (c === null) { + // flush the standard output. + } else { + // output c to the standard output. + } + }, +}); +``` + +`c` は `null` か 1バイト符号つき整数を取り、`null` が flush 要求を意味する。 + +記事末尾のリポジトリはすでにこの変更を適用済み。`stdout` や `stderr` の完全なサンプルはそちらを参照のこと。 +::: + {#compile-to-wasm} ## WebAssembly にコンパイルする diff --git a/vhosts/blog/nuldoc.md b/vhosts/blog/nuldoc.md deleted file mode 100644 index 9133ff88..00000000 --- a/vhosts/blog/nuldoc.md +++ /dev/null @@ -1,104 +0,0 @@ -# Posts - -## Meta Information - -``` -struct Revision { - date: string - remark: string -} - -struct PostMeta { - title: string - description: string - tags: string[] - revisions: Revision[] -} -``` - -## Elements - -table -tbody -td -tfoot -th -thead -tr -col -colgroup -caption - -blockquote -cite -q - -figure -img - -section -h -p - -ul -ol -li - -a -email - -time -kbd - -sub -sup - -dl -dt -dd - -summary -details - -del -ins - -br -hr - -ruby -rt - -note - -mark -s -strong - -code -filename -codeblock - -footnote -footnoteref - - -# Slides - -## Meta Information - -``` -struct Revision { - date: string - remark: string -} - -struct Slide { - title: string - event: string - talkType: string - link: string - tags: string[] - revisions: Revision[] -} -``` diff --git a/vhosts/blog/public/atom.xml b/vhosts/blog/public/atom.xml index c1c128f2..9711df67 100644 --- a/vhosts/blog/public/atom.xml +++ b/vhosts/blog/public/atom.xml @@ -7,7 +7,7 @@ <author> <name>nsfisis</name> </author> - <updated>2025-04-20T00:00:00+09:00</updated> + <updated>2025-04-23T00:00:00+09:00</updated> <entry> <id>urn:uuid:039b3dff-3b75-46b7-a731-9a3a0ff8e21f</id> <link rel="alternate" href="https://blog.nsfisis.dev/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/"></link> @@ -310,7 +310,7 @@ <title>PHP の処理系を Emscripten で WebAssembly にコンパイルする</title> <summary>PHP の処理系 (php/php-src) を Emscripten で WebAssembly にコンパイルし、任意のコードを隔離された環境で評価できるようにした。</summary> <published>2023-10-02T00:00:00+09:00</published> - <updated>2023-10-02T00:00:00+09:00</updated> + <updated>2025-04-23T00:00:00+09:00</updated> </entry> <entry> <id>urn:uuid:d6118e00-5fb1-4230-9d94-854260beae04</id> diff --git a/vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html b/vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html index 61ed2092..933253a3 100644 --- a/vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html +++ b/vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html @@ -58,6 +58,9 @@ <li class="revision"> <time datetime="2023-10-02">2023-10-02</time>: 公開 </li> + <li class="revision"> + <time datetime="2025-04-23">2025-04-23</time>: fflush() の前に改行の出力が必要だった理由と正しい実装について追記 + </li> </ol> </section> <section id="section--intro"> @@ -160,6 +163,39 @@ <p> 次に、コードを評価したあとに呼んでいる標準出力と標準エラー出力に対する改行の出力について。 出力バッファから出力させるためだけなら改行を出力させなくとも <code>fflush()</code> だけで事足りると考えたのだが、ないと動かなかったので追加した。 これにより、PHP コードの出力の後ろに余分な改行が追加されてしまう。 改行を出力せずともバッファを消費させる手段をご存知のかたはご教示願いたい。 </p> + <div class="admonition"> + <div class="admonition-label"> + NOTE + </div> + <div class="admonition-content"> + <p> + <strong><strong>2025-04-23 追記</strong></strong>: + </p> + <p> + <code>fflush()</code> の前に改行の出力が必要だった理由が判明したので追記する。 これは、<code>index.mjs</code> で標準出力・標準エラー出力へ出力する方法を指定せず、デフォルトの実装に任せているため。 Emscripten のデフォルト実装では、改行コードを出力するまで出力内容がバッファリングされ、<code>fflush()</code> が機能しない。 + </p> + <p> + デフォルトの出力方法は <code>index.mjs</code> の中で <code>PHPWasm()</code> を呼ぶとき、<code>stdout</code>・<code>stderr</code> というオプションを渡せば変更できる。 + </p> + <div class="codeblock" language="javascript"> + <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">const</span><span style="color:#24292E"> { </span><span style="color:#005CC5">ccall</span><span style="color:#24292E"> } </span><span style="color:#D73A49">=</span><span style="color:#D73A49"> await</span><span style="color:#6F42C1"> PHPWasm</span><span style="color:#24292E">({</span></span> +<span class="line"><span style="color:#6F42C1"> stdout</span><span style="color:#24292E">: (</span><span style="color:#E36209">c</span><span style="color:#24292E">) </span><span style="color:#D73A49">=></span><span style="color:#24292E"> {</span></span> +<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> (c </span><span style="color:#D73A49">===</span><span style="color:#005CC5"> null</span><span style="color:#24292E">) {</span></span> +<span class="line"><span style="color:#6A737D"> // flush the standard output.</span></span> +<span class="line"><span style="color:#24292E"> } </span><span style="color:#D73A49">else</span><span style="color:#24292E"> {</span></span> +<span class="line"><span style="color:#6A737D"> // output c to the standard output.</span></span> +<span class="line"><span style="color:#24292E"> }</span></span> +<span class="line"><span style="color:#24292E"> },</span></span> +<span class="line"><span style="color:#24292E">});</span></span></code></pre> + </div> + <p> + <code>c</code> は <code>null</code> か 1バイト符号つき整数を取り、<code>null</code> が flush 要求を意味する。 + </p> + <p> + 記事末尾のリポジトリはすでにこの変更を適用済み。<code>stdout</code> や <code>stderr</code> の完全なサンプルはそちらを参照のこと。 + </p> + </div> + </div> </section> <section id="section--build--compile-to-wasm"> <h3><a href="#section--build--compile-to-wasm">WebAssembly にコンパイルする</a></h3> diff --git a/vhosts/blog/public/posts/atom.xml b/vhosts/blog/public/posts/atom.xml index db060626..376821f4 100644 --- a/vhosts/blog/public/posts/atom.xml +++ b/vhosts/blog/public/posts/atom.xml @@ -7,7 +7,7 @@ <author> <name>nsfisis</name> </author> - <updated>2025-04-20T00:00:00+09:00</updated> + <updated>2025-04-23T00:00:00+09:00</updated> <entry> <id>urn:uuid:039b3dff-3b75-46b7-a731-9a3a0ff8e21f</id> <link rel="alternate" href="https://blog.nsfisis.dev/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/"></link> @@ -214,7 +214,7 @@ <title>PHP の処理系を Emscripten で WebAssembly にコンパイルする</title> <summary>PHP の処理系 (php/php-src) を Emscripten で WebAssembly にコンパイルし、任意のコードを隔離された環境で評価できるようにした。</summary> <published>2023-10-02T00:00:00+09:00</published> - <updated>2023-10-02T00:00:00+09:00</updated> + <updated>2025-04-23T00:00:00+09:00</updated> </entry> <entry> <id>urn:uuid:e1568c4c-9bdd-47b9-8b39-939ade4f3ba0</id> diff --git a/vhosts/blog/public/posts/index.html b/vhosts/blog/public/posts/index.html index 79305084..9eb39417 100644 --- a/vhosts/blog/public/posts/index.html +++ b/vhosts/blog/public/posts/index.html @@ -428,7 +428,7 @@ </p> </section> <footer class="entry-footer"> - <time datetime="2023-10-02">2023-10-02</time> 投稿 + <time datetime="2023-10-02">2023-10-02</time> 投稿、<time datetime="2025-04-23">2025-04-23</time> 更新 </footer> </a> </article> diff --git a/vhosts/blog/public/tags/php/atom.xml b/vhosts/blog/public/tags/php/atom.xml index 8c0841fc..08de6822 100644 --- a/vhosts/blog/public/tags/php/atom.xml +++ b/vhosts/blog/public/tags/php/atom.xml @@ -7,7 +7,7 @@ <author> <name>nsfisis</name> </author> - <updated>2025-04-12T00:00:00+09:00</updated> + <updated>2025-04-23T00:00:00+09:00</updated> <entry> <id>urn:uuid:c6c7c241-46c1-44b5-95b2-c30c3a500df3</id> <link rel="alternate" href="https://blog.nsfisis.dev/slides/2025-04-12/phpcon-odawara-2025/"></link> @@ -174,7 +174,7 @@ <title>PHP の処理系を Emscripten で WebAssembly にコンパイルする</title> <summary>PHP の処理系 (php/php-src) を Emscripten で WebAssembly にコンパイルし、任意のコードを隔離された環境で評価できるようにした。</summary> <published>2023-10-02T00:00:00+09:00</published> - <updated>2023-10-02T00:00:00+09:00</updated> + <updated>2025-04-23T00:00:00+09:00</updated> </entry> <entry> <id>urn:uuid:d6118e00-5fb1-4230-9d94-854260beae04</id> diff --git a/vhosts/blog/public/tags/php/index.html b/vhosts/blog/public/tags/php/index.html index 7c025ace..320f5583 100644 --- a/vhosts/blog/public/tags/php/index.html +++ b/vhosts/blog/public/tags/php/index.html @@ -354,7 +354,7 @@ </p> </section> <footer class="entry-footer"> - <time datetime="2023-10-02">2023-10-02</time> 投稿 + <time datetime="2023-10-02">2023-10-02</time> 投稿、<time datetime="2025-04-23">2025-04-23</time> 更新 </footer> </a> </article> diff --git a/vhosts/blog/public/tags/wasm/atom.xml b/vhosts/blog/public/tags/wasm/atom.xml index 4901b4ef..c0051ba4 100644 --- a/vhosts/blog/public/tags/wasm/atom.xml +++ b/vhosts/blog/public/tags/wasm/atom.xml @@ -7,7 +7,7 @@ <author> <name>nsfisis</name> </author> - <updated>2024-03-15T00:00:00+09:00</updated> + <updated>2025-04-23T00:00:00+09:00</updated> <entry> <id>urn:uuid:da7b1d5a-70df-4c4a-936c-1b49ca1a7c37</id> <link rel="alternate" href="https://blog.nsfisis.dev/slides/2024-03-15/ya8-2024/"></link> @@ -30,6 +30,6 @@ <title>PHP の処理系を Emscripten で WebAssembly にコンパイルする</title> <summary>PHP の処理系 (php/php-src) を Emscripten で WebAssembly にコンパイルし、任意のコードを隔離された環境で評価できるようにした。</summary> <published>2023-10-02T00:00:00+09:00</published> - <updated>2023-10-02T00:00:00+09:00</updated> + <updated>2025-04-23T00:00:00+09:00</updated> </entry> </feed> diff --git a/vhosts/blog/public/tags/wasm/index.html b/vhosts/blog/public/tags/wasm/index.html index 3b3c9acd..2f42b09f 100644 --- a/vhosts/blog/public/tags/wasm/index.html +++ b/vhosts/blog/public/tags/wasm/index.html @@ -84,7 +84,7 @@ </p> </section> <footer class="entry-footer"> - <time datetime="2023-10-02">2023-10-02</time> 投稿 + <time datetime="2023-10-02">2023-10-02</time> 投稿、<time datetime="2025-04-23">2025-04-23</time> 更新 </footer> </a> </article> |
