aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--nuldoc-src/command.ts5
-rw-r--r--nuldoc-src/docbook/to_html.ts7
-rw-r--r--nuldoc-src/html.ts10
-rw-r--r--public/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html4
-rw-r--r--public/posts/2021-10-02/python-unbound-local-error/index.html6
-rw-r--r--public/posts/2021-10-02/ruby-detect-running-implementation/index.html4
-rw-r--r--public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html24
-rw-r--r--public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html12
-rw-r--r--public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html10
-rw-r--r--public/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html8
-rw-r--r--public/posts/2022-04-09/phperkaigi-2022-tokens/index.html30
-rw-r--r--public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html2
-rw-r--r--public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html4
-rw-r--r--public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html34
-rw-r--r--public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html18
-rw-r--r--public/posts/2022-10-28/setup-server-for-this-site/index.html40
-rw-r--r--public/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html14
-rw-r--r--public/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html14
18 files changed, 126 insertions, 120 deletions
diff --git a/nuldoc-src/command.ts b/nuldoc-src/command.ts
index 47b8ee0..dd15a77 100644
--- a/nuldoc-src/command.ts
+++ b/nuldoc-src/command.ts
@@ -146,7 +146,10 @@ async function copyStaticFiles(config: Config) {
const globPattern = joinGlobs([Deno.cwd(), config.locations.staticDir, "*"]);
for await (const entry of expandGlob(globPattern)) {
const src = entry.path;
- const dst = src.replace(config.locations.staticDir, config.locations.destDir);
+ const dst = src.replace(
+ config.locations.staticDir,
+ config.locations.destDir,
+ );
await Deno.copyFile(src, dst);
}
}
diff --git a/nuldoc-src/docbook/to_html.ts b/nuldoc-src/docbook/to_html.ts
index 6788158..64d3492 100644
--- a/nuldoc-src/docbook/to_html.ts
+++ b/nuldoc-src/docbook/to_html.ts
@@ -192,6 +192,8 @@ function transformProgramListingElement(doc: Document) {
}
n.name = "pre";
+ const preClass = n.attributes.get("class");
+ n.attributes.set("class", preClass ? preClass + " highlight" : "highlight");
const codeElement: Element = {
kind: "element",
name: "code",
@@ -209,12 +211,13 @@ function transformLiteralLayoutElement(doc: Document) {
}
n.name = "pre";
- const children = n.children;
+ const preClass = n.attributes.get("class");
+ n.attributes.set("class", preClass ? preClass + " highlight" : "highlight");
const codeElement: Element = {
kind: "element",
name: "code",
attributes: new Map(),
- children: children,
+ children: n.children,
};
n.children = [codeElement];
});
diff --git a/nuldoc-src/html.ts b/nuldoc-src/html.ts
index d127d29..2832490 100644
--- a/nuldoc-src/html.ts
+++ b/nuldoc-src/html.ts
@@ -132,11 +132,11 @@ function textNodeToHtmlText(t: Text, ctx: Context): string {
}
function encodeSpecialCharacters(s: string): string {
- return s.replaceAll(/&(?!\w+;)/g, '&')
- .replaceAll(/</g, '&lt;')
- .replaceAll(/>/g, '&gt;')
- .replaceAll(/'/g, '&apos;')
- .replaceAll(/"/g, '&quot;');
+ return s.replaceAll(/&(?!\w+;)/g, "&amp;")
+ .replaceAll(/</g, "&lt;")
+ .replaceAll(/>/g, "&gt;")
+ .replaceAll(/'/g, "&apos;")
+ .replaceAll(/"/g, "&quot;");
}
function elementNodeToHtmlText(e: Element, ctx: Context): string {
diff --git a/public/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html b/public/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html
index 479520e..ae44da9 100644
--- a/public/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html
+++ b/public/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html
@@ -56,7 +56,7 @@
タイトル落ち。まずはこのコードを見て欲しい。
</p>
- <pre language="cpp" linenumbering="unnumbered">
+ <pre class="highlight" language="cpp" linenumbering="unnumbered">
<code>#include &lt;iostream&gt;
[[alignas]] [[alignof]] [[and]] [[and_eq]] [[asm]] [[auto]] [[bitand]]
@@ -126,7 +126,7 @@ std::cout &lt;&lt; &quot;Hello, World!&quot; &lt;&lt; std::endl;
上のコードでは<code>[[using]]</code>をコメントアウトしているが、これは<code>using</code>キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。
</p>
- <pre language="cpp" linenumbering="unnumbered">
+ <pre class="highlight" language="cpp" linenumbering="unnumbered">
<code>// using の例
[[using foo: attr1, attr2]] int x; // [[foo::attr1, foo::attr2]] の糖衣構文</code>
</pre>
diff --git a/public/posts/2021-10-02/python-unbound-local-error/index.html b/public/posts/2021-10-02/python-unbound-local-error/index.html
index fa0b1db..27c2d05 100644
--- a/public/posts/2021-10-02/python-unbound-local-error/index.html
+++ b/public/posts/2021-10-02/python-unbound-local-error/index.html
@@ -60,7 +60,7 @@
Python でクロージャを作ろうと、次のようなコードを書いた。
</p>
- <pre language="python" linenumbering="unnumbered">
+ <pre class="highlight" language="python" linenumbering="unnumbered">
<code>def f():
x = 0
def g():
@@ -84,7 +84,7 @@ f()</code>
local変数<code>x</code>が代入前に参照された、とある。これは、<code>f</code>の<code>x</code>を参照するのではなく、新しく別の変数を<code>g</code>内に作ってしまっているため。 前述のコードを宣言と代入を便宜上分けて書き直すと次のようになる。<code>var</code>を変数宣言のための構文として擬似的に利用している。
</p>
- <pre language="python" linenumbering="unnumbered">
+ <pre class="highlight" language="python" linenumbering="unnumbered">
<code># 注: var は正しい Python の文法ではない。上記参照のこと
def f():
var x # f の local変数 &apos;x&apos; を宣言
@@ -101,7 +101,7 @@ g()</code>
当初の意図を表現するには、次のように書けばよい。
</p>
- <pre language="python" linenumbering="unnumbered">
+ <pre class="highlight" language="python" linenumbering="unnumbered">
<code>def f():
x = 0
def g():
diff --git a/public/posts/2021-10-02/ruby-detect-running-implementation/index.html b/public/posts/2021-10-02/ruby-detect-running-implementation/index.html
index 08700c4..ed7ccd5 100644
--- a/public/posts/2021-10-02/ruby-detect-running-implementation/index.html
+++ b/public/posts/2021-10-02/ruby-detect-running-implementation/index.html
@@ -65,7 +65,7 @@
上記ページの例から引用する:
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ ruby-1.9.1 -ve &apos;p RUBY_ENGINE&apos;
ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux]
&quot;ruby&quot;
@@ -192,7 +192,7 @@ jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java]
<a href="https://github.com/mruby/mruby/blob/ed29d74bfd95362eaeb946fcf7e865d80346b62b/include/mruby/version.h#L32-L35">mruby 該当部分のソース</a>より引用:
</p>
- <pre language="c" linenumbering="unnumbered">
+ <pre class="highlight" language="c" linenumbering="unnumbered">
<code>/*
* Ruby engine.
*/
diff --git a/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html b/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html
index 1def6b6..9b1df47 100644
--- a/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html
+++ b/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html
@@ -65,7 +65,7 @@
使われることは稀だが、Ruby では<code>then</code>がキーワードになっている。次のように使う:
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>if cond then
puts &quot;Y&quot;
else
@@ -77,7 +77,7 @@
このキーワードが現れうる場所はいくつかあり、<code>if</code>、<code>unless</code>、<code>rescue</code>、<code>case</code>構文がそれに当たる。 上記のように、何か条件を書いた後<code>then</code>を置き、式がそこで終了していることを示すマーカーとして機能する。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code># Example:
if x then
@@ -107,7 +107,7 @@ end</code>
普通 Ruby のコードで<code>then</code>を書くことはない。なぜか。次のコードを実行してみるとわかる。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>if true puts &apos;Hello, World!&apos; end</code>
</pre>
@@ -115,7 +115,7 @@ end</code>
次のような構文エラーが出力される。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>20:1: syntax error, unexpected local variable or method, expecting `then&apos; or &apos;;&apos; or &apos;\n&apos;
if true puts &apos;Hello, World!&apos; end
^~~~
@@ -131,7 +131,7 @@ end</code>
ポイントは改行が<code>then</code>(や<code>;</code>) の代わりとなることである。<code>true</code>の後に改行を入れてみる。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>if true
puts &apos;Hello, World!&apos; end</code>
</pre>
@@ -147,7 +147,7 @@ puts &apos;Hello, World!&apos; end</code>
なぜ<code>then</code>や<code>;</code>や改行 (以下 「<code>then</code>等」) が必要なのだろうか。次の例を見てほしい:
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>if a b end</code>
</pre>
@@ -155,14 +155,14 @@ puts &apos;Hello, World!&apos; end</code>
<code>then</code>も<code>;</code>も改行もないのでエラーになるが、これは条件式がどこまで続いているのかわからないためだ。 この例は二通りに解釈できる。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code># a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価
if a then
b
end</code>
</pre>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code># a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、
# その結果が truthy なら何もしない
if a(b) then
@@ -188,7 +188,7 @@ end</code>
<a href="https://github.com/ruby/ruby/blob/221ca0f8281d39f0dfdfe13b2448875384bbf735/parse.y#L3961-L3986">https://github.com/ruby/ruby/blob/221ca0f8281d39f0dfdfe13b2448875384bbf735/parse.y#L3961-L3986</a>
</p>
- <pre language="yacc" linenumbering="unnumbered">
+ <pre class="highlight" language="yacc" linenumbering="unnumbered">
<code>p_case_body : keyword_in
{
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
@@ -221,7 +221,7 @@ end</code>
簡略版:
</p>
- <pre language="yacc" linenumbering="unnumbered">
+ <pre class="highlight" language="yacc" linenumbering="unnumbered">
<code>p_case_body : keyword_in p_top_expr then compstmt p_cases
;</code>
</pre>
@@ -234,7 +234,7 @@ end</code>
これにより、<code>case</code>-<code>when</code>による従来の構文と同じように、<code>then</code>等をパターンの後ろに挿入すればよいことがわかった。つまり次の3通りのいずれかになる:
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>case x
in 1 then a
in 2 then b
@@ -261,7 +261,7 @@ end</code>
ところで、<code>p_top_expr</code>には<code>if</code>による guard clause が書けるので、その場合は<code>if</code>-<code>then</code>と似たような見た目になる。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>case x
in 0 then a
in n if n &lt; 0 then b
diff --git a/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html b/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html
index 8879a79..8bcb923 100644
--- a/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html
+++ b/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html
@@ -55,7 +55,7 @@
Rust において、プリミティブ型の名前は予約語でない。したがって、次のコードは合法である。
</p>
- <pre language="rust" linenumbering="unnumbered">
+ <pre class="highlight" language="rust" linenumbering="unnumbered">
<code>#![allow(non_camel_case_types)]
#![allow(dead_code)]
@@ -111,7 +111,7 @@ struct str;</code>
<code>rustc</code>はセルフホストされている (=<code>rustc</code>自身が Rust で書かれている) ので、<code>bool</code>や<code>char</code>などで適当に検索をかけてもノイズが多すぎて話にならない。 しかし、お誂え向きなことに<code>i128</code>/<code>u128</code>というコンパイラ自身が使うことがなさそうな型が存在するのでこれを使って<code>git grep</code>してみる。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>$ git grep &quot;\bi128\b&quot; | wc # i128
165 1069 15790
@@ -126,7 +126,7 @@ $ git grep &quot;\bbool\b&quot; | wc # cf. bool の結果
165 程度であれば探すことができそうだ。今回は、クレート名を見ておおよその当たりをつけた。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>$ git grep &quot;\bi128\b&quot;
...
rustc_resolve/src/lib.rs: table.insert(sym::i128, Int(IntTy::I128));
@@ -137,7 +137,7 @@ rustc_resolve/src/lib.rs: table.insert(sym::i128, Int(IntTy::I128));
<code>rustc_resolve</code>というのはいかにも名前解決を担いそうなクレート名である。該当箇所を見てみる。
</p>
- <pre language="rust" linenumbering="unnumbered">
+ <pre class="highlight" language="rust" linenumbering="unnumbered">
<code>/// Interns the names of the primitive types.
///
/// All other types are defined somewhere and possibly imported, but the primitive ones need
@@ -186,7 +186,7 @@ Self { primitive_types: table }
とある。次はこの struct の使用箇所を追う。追うと言っても使われている箇所は次の一箇所しかない。なお説明に不要な箇所は大きく削っている。
</p>
- <pre language="rust" linenumbering="unnumbered">
+ <pre class="highlight" language="rust" linenumbering="unnumbered">
<code> /// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.
/// (略)
fn resolve_ident_in_lexical_scope(
@@ -226,7 +226,7 @@ None
動作がわかったところで、例として次のコードを考える。
</p>
- <pre language="rust" linenumbering="unnumbered">
+ <pre class="highlight" language="rust" linenumbering="unnumbered">
<code>#![allow(non_camel_case_types)]
struct bool;
diff --git a/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html b/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html
index 5fc12fc..db28b1c 100644
--- a/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html
+++ b/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html
@@ -112,7 +112,7 @@
<a href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L85-L86">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L85-L86</a>
</p>
- <pre language="c" linenumbering="unnumbered">
+ <pre class="highlight" language="c" linenumbering="unnumbered">
<code> {&quot;BufAdd&quot;, EVENT_BUFADD},
{&quot;BufCreate&quot;, EVENT_BUFADD},</code>
</pre>
@@ -121,7 +121,7 @@
<a href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97</a>
</p>
- <pre language="c" linenumbering="unnumbered">
+ <pre class="highlight" language="c" linenumbering="unnumbered">
<code> {&quot;BufRead&quot;, EVENT_BUFREADPOST},
{&quot;BufReadCmd&quot;, EVENT_BUFREADCMD},
{&quot;BufReadPost&quot;, EVENT_BUFREADPOST},</code>
@@ -131,7 +131,7 @@
<a href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105</a>
</p>
- <pre language="c" linenumbering="unnumbered">
+ <pre class="highlight" language="c" linenumbering="unnumbered">
<code> {&quot;BufWrite&quot;, EVENT_BUFWRITEPRE},
{&quot;BufWritePost&quot;, EVENT_BUFWRITEPOST},
{&quot;BufWritePre&quot;, EVENT_BUFWRITEPRE},</code>
@@ -148,7 +148,7 @@
<a href="https://github.com/neovim/neovim/blob/71d4f5851f068eeb432af34850dddda8cc1c71e3/src/nvim/auevents.lua#L119-L124">https://github.com/neovim/neovim/blob/71d4f5851f068eeb432af34850dddda8cc1c71e3/src/nvim/auevents.lua#L119-L124</a>
</p>
- <pre language="lua" linenumbering="unnumbered">
+ <pre class="highlight" language="lua" linenumbering="unnumbered">
<code> aliases = {
BufCreate = &apos;BufAdd&apos;,
BufRead = &apos;BufReadPost&apos;,
@@ -161,7 +161,7 @@ FileEncoding = &apos;EncodingChanged&apos;,
ところで、上では取り上げなかった<code>FileEncoding</code>だが、これは<code>:help FileEncoding</code>にしっかりと書いてある。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code> *FileEncoding*
FileEncoding Obsolete. It still works and is equivalent
to |EncodingChanged|.</code>
diff --git a/public/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html b/public/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html
index afe6ba9..8a3b304 100644
--- a/public/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html
+++ b/public/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html
@@ -115,7 +115,7 @@
なお、<code>:g/^/m0</code>は全ての行を入れ替えるが、<code>:N,Mg/^/mN-1</code>とすることで N行目から M行目を処理範囲とするよう拡張できる。手でこれを入力するわけにはいかないので、次のようなコマンドを用意する。
</p>
- <pre language="vim" linenumbering="unnumbered">
+ <pre class="highlight" language="vim" linenumbering="unnumbered">
<code>command! -bar -range=%
\ Reverse
\ &lt;line1&gt;,&lt;line2&gt;g/^/m&lt;line1&gt;-1</code>
@@ -152,7 +152,7 @@
前述した<code>:Reverse</code>コマンドの定義を少し変えて、次のようにする:
</p>
- <pre language="vim" linenumbering="unnumbered">
+ <pre class="highlight" language="vim" linenumbering="unnumbered">
<code>function! s:reverse_lines(from, to) abort
execute printf(&quot;%d,%dg/^/m%d&quot;, a:from, a:to, a:from - 1)
endfunction
@@ -211,7 +211,7 @@
</p>
</blockquote>
- <pre language="vim" linenumbering="unnumbered">
+ <pre class="highlight" language="vim" linenumbering="unnumbered">
<code>command! -bar -range=%
\ Reverse
\ keeppatterns &lt;line1&gt;,&lt;line2&gt;g/^/m&lt;line1&gt;-1</code>
@@ -230,7 +230,7 @@
<section id="section--_コピペ用再掲">
<h2><a href="#section--_コピペ用再掲">コピペ用再掲</a></h2>
- <pre language="vim" linenumbering="unnumbered">
+ <pre class="highlight" language="vim" linenumbering="unnumbered">
<code>&quot; License: Public Domain
command! -bar -range=%
diff --git a/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html b/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html
index aee9c7c..d16739b 100644
--- a/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html
+++ b/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html
@@ -66,7 +66,7 @@
ソースコードはこちら。実行には PHP 8.1 以上が必要なので注意。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
declare(strict_types=0O1);
@@ -165,7 +165,7 @@
なお、brainf*ck プログラムを普通の書き方で書くと、次のようになる。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>+ + + + + + + + + +
[
&gt; + + +
@@ -271,7 +271,7 @@
ソースコードのライセンスを示したこの部分だが、
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>https://creativecommons.org/publicdomain/zero/1.0/</code>
</pre>
@@ -286,7 +286,7 @@
ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。 PHP では、型変換を利用することで任意の整数を作り出すことができる。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>assert(0 === +!![]);
assert(1 === +![]);
assert(2 === ![]+![]);
@@ -333,7 +333,7 @@ assert(10 === +(![].+!![]));</code>
ソースコードはこちら。実行には PHP 8.0 以上が必要なので注意。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
/*********************************************************
@@ -384,7 +384,7 @@ assert(10 === +(![].+!![]));</code>
まずはソースコードを読んでいく。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$token = [
// 略
];</code>
@@ -394,7 +394,7 @@ assert(10 === +(![].+!![]));</code>
数値からなる<code>$token</code>があり、各要素をループしている。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code> $x = $x ^ N;</code>
</pre>
@@ -402,7 +402,7 @@ assert(10 === +(![].+!![]));</code>
まずは排他的論理和 (xor) を取り、
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code> $x = sprintf(&apos;%025b&apos;, $x);</code>
</pre>
@@ -410,7 +410,7 @@ assert(10 === +(![].+!![]));</code>
二進数に変換して、
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code> $x = str_replace(search: [&apos;0&apos;, &apos;1&apos;], replace: [&apos; &apos;, &apos;#&apos;], subject: $x);</code>
</pre>
@@ -418,7 +418,7 @@ assert(10 === +(![].+!![]));</code>
0 を空白に、1 を<code>#</code>にし、
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code> $x = implode(&quot;\n&quot;, str_split($x, length: 5));</code>
</pre>
@@ -474,7 +474,7 @@ assert(10 === +(![].+!![]));</code>
<code>N</code>は高々
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>assert(0 &lt;= N &amp;&amp; N &lt;= 0b11111_11111_11111_11111_11111);</code>
</pre>
@@ -482,7 +482,7 @@ assert(10 === +(![].+!![]));</code>
なのでブルートフォースしてもよいが、ここではブルートフォースしない方法を紹介する。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
$x = 0x14B499C;
@@ -505,7 +505,7 @@ assert(10 === +(![].+!![]));</code>
この一連の変換に対する逆変換を考えると、次のようになる。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
$x =
@@ -536,7 +536,7 @@ echo &quot;N = $n\n&quot;;</code>
ソースコードはこちら。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
// License: https://creativecommons.org/publicdomain/zero/1.0/
@@ -572,7 +572,7 @@ echo &quot;N = $n\n&quot;;</code>
コメントにもあるとおり、次のようにして実行すれば答えがでてくる。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ php toquine.php | php | php | php | ...</code>
</pre>
diff --git a/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html b/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html
index 5acfb32..bf174b8 100644
--- a/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html
+++ b/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html
@@ -43,7 +43,7 @@
こんなものを作った。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>$ term-banner &apos;Hello, World!&apos; &apos;こんにちは、&apos; &apos;世界!&apos;</code>
</pre>
diff --git a/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html b/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html
index d8b8502..fbac1f0 100644
--- a/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html
+++ b/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html
@@ -111,7 +111,7 @@
書いたものがこちら:
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>[&lt;?php $n=$argv[1];foreach([1e4,5e3,2e3,1e3,500,100,50,10,5,1]as$x)for(;$n&gt;=$x;$n-=$x)$r[]=$x;echo implode(&apos;, &apos;,$r??[]);?&gt;]</code>
</pre>
@@ -123,7 +123,7 @@
こちらは改行とスペースを追加したバージョン:
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>[&lt;?php
$n = $argv[1];
diff --git a/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html b/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html
index b121725..abdb48e 100644
--- a/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html
+++ b/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html
@@ -125,7 +125,7 @@
特に、C言語でこのような試みをおこなったことがあるかたならそう思うだろう。事実、Cでのこの制約はほとんど無意味に等しい。
</p>
- <pre language="c" linenumbering="unnumbered">
+ <pre class="highlight" language="c" linenumbering="unnumbered">
<code>#\
i\
n\
@@ -260,7 +260,7 @@
また、2文字だと文字列がまともに書けないのも辛い。<code>&apos;&apos;</code>だけで 2文字使うので、「1文字の文字列リテラル」というものを書くことができない。PHP では文字列リテラル中に生の改行が書けるので
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$a
=&apos;
a&apos;
@@ -284,7 +284,7 @@ a&apos;
まずは普通に書くとしよう。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>&lt;?php
for ($i = 1; $i &lt; 100; $i++) {
@@ -303,7 +303,7 @@ a&apos;
<code>for</code>は、3文字もある長いキーワードである。こんなものは使えない。<code>array_</code>系の関数を使って、適当に置き換えるとしよう。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
$s = range(1, 100);
@@ -325,7 +325,7 @@ a&apos;
<code>range</code>、<code>array_walk</code>、<code>printf</code>は長すぎるのでどうにかせねばならない。ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
$r = &apos;range&apos;;
@@ -365,7 +365,7 @@ a&apos;
というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という PHP 7.x までの仕様が利用できる。例えば、<code>Fizz</code>という文字列が欲しければ、次のようにする。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$f
=F
.i
@@ -378,7 +378,7 @@ a&apos;
こうして簡単に文字列を作れる。なお、この仕様は 7.x 時点でも警告を受けるので、<code>@</code>演算子を使って抑制してやるとよい。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$f
=@
F.
@@ -405,7 +405,7 @@ F.
ずばり、文字列同士のビット演算を使う。PHP では、文字列同士でビット演算 (<code>&amp;</code>、<code>|</code>、<code>^</code>) をした場合、文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$a = &quot;12345&quot;;
$b = &quot;world&quot;;
@@ -423,7 +423,7 @@ echo $result;
これを踏まえ、次のコードを見てみよう。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$x = &quot;x\nOm\n&quot;;
$y = &quot;\nk!\no&quot;;
$r = $x ^ $y;
@@ -434,7 +434,7 @@ echo &quot;$r\n&quot;;</code>
実行すると、<code>range</code>が表示される。さて、PHP では文字列リテラル中に生の改行を直接書いてもよいのだった (「主な障害」の節を参照のこと)。書きかえてみよう。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$x
=&apos;x
Om
@@ -453,7 +453,7 @@ echo &quot;$r\n&quot;;</code>
さらに<code>#</code>を使って適当に調整すると、次のようになる。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$x
=#
&apos;x
@@ -490,7 +490,7 @@ echo &quot;$r\n&quot;;</code>
完成したものがこちら。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
$x
@@ -660,7 +660,7 @@ echo &quot;$r\n&quot;;</code>
PHP では、バッククォートを使ってシェルを呼び出せる。これは<code>shell_exec</code>関数と等価である。さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
printf(`
@@ -701,7 +701,7 @@ echo &quot;$r\n&quot;;</code>
もうこれ以上は不可能だと思っていたのだが、この記事の執筆中に解決する方法を思いついたので載せておく。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
$c = &apos;chr&apos;;
@@ -737,7 +737,7 @@ ${
先程と同じく、<code>chr</code>や<code>printf</code>を生成する部分は長くなるので省いた。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>${
&apos;_
&apos;}</code>
@@ -747,7 +747,7 @@ ${
は変数で、中にはスペースとエスケープが入っている (<code>chr(32) . chr(92)</code>)。シェルに渡されている文字列は次のようになる。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>e\
c\
h\
@@ -770,7 +770,7 @@ o\
ちなみに、PHP 8.2 からは、この記法で Warning が出るようになるようだ。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>${
&apos;_
&apos;}</code>
diff --git a/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html b/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html
index da4cfea..a2bf44c 100644
--- a/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html
+++ b/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html
@@ -68,7 +68,7 @@
注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
$π = $argv[1] ?? null;
@@ -99,7 +99,7 @@ echo &quot;Failed.\n&quot;;
ソースを見るとわかるとおり、<code>$argv[1]</code>を参照している。それを<code>$π</code>なる変数に代入しているので、円周率を渡してみる。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ php Q.php 3.14
Failed.</code>
</pre>
@@ -108,7 +108,7 @@ echo &quot;Failed.\n&quot;;
失敗してしまった。精度を上げてみる。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ php Q.php 3.1415
Failed.</code>
</pre>
@@ -121,7 +121,7 @@ Failed.</code>
最初にトークンが得られるのは、小数点以下 16 桁目まで入力したときで、こうなる。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ php Q.php 3.1415926535897932
Token: #YO</code>
</pre>
@@ -137,7 +137,7 @@ Token: #YO</code>
短いので頭から追っていく。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$π = $argv[1] ?? null;
if ($π === null) {
exit(&apos;No input.&apos;);
@@ -152,7 +152,7 @@ Token: #YO</code>
入力のバリデーション部分。数値のみ受け付ける。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$s = implode(array_map(chr(...), str_split($π, 2)));</code>
</pre>
@@ -164,14 +164,14 @@ Token: #YO</code>
例えば、<code>$π</code>が<code>&apos;656667&apos;</code>だったとすると、<code>65</code>、<code>66</code>、<code>67</code>に対応した<code>&apos;A&apos;</code>、<code>&apos;B&apos;</code>、<code>&apos;C&apos;</code>へと変換され、<code>&apos;ABC&apos;</code>になる。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$π = &apos;656667&apos;;
$s = implode(array_map(chr(...), str_split($π, 2)));
echo $s;
// =&gt; ABC</code>
</pre>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>preg_match(&apos;/(\x23.+?) /&apos;, $s, $m);
$t = $m[1] ?? &apos;&apos;;</code>
</pre>
@@ -184,7 +184,7 @@ $t = $m[1] ?? &apos;&apos;;</code>
なお、<code>#</code>を直接書いていないのは、<code>/#.+?) /</code>と書くと、<code>#.+?)</code>という意図せぬトークンが登録されてしまうからである。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>if (md5($t) === &apos;056e831a4146bf123e8ea16613303d2e&apos;) {
echo &quot;Token: {$t}\n&quot;;
} else {
diff --git a/public/posts/2022-10-28/setup-server-for-this-site/index.html b/public/posts/2022-10-28/setup-server-for-this-site/index.html
index 7f45478..6e002c3 100644
--- a/public/posts/2022-10-28/setup-server-for-this-site/index.html
+++ b/public/posts/2022-10-28/setup-server-for-this-site/index.html
@@ -73,7 +73,7 @@
ローカルマシンで鍵を生成する。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/teika.key
$ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/github2teika.key</code>
</pre>
@@ -89,7 +89,7 @@
<code>.ssh/config</code>に設定しておく。
</p>
- <pre language="ssh_config" linenumbering="unnumbered">
+ <pre class="highlight" language="ssh_config" linenumbering="unnumbered">
<code>Host teika
HostName **********
User **********
@@ -114,7 +114,7 @@
管理者ユーザで作業すると危ないので、メインで使うユーザを作成する。<code>sudo</code>グループに追加して<code>sudo</code>できるようにし、<code>su</code>で切り替え。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ sudo adduser **********
$ sudo adduser ********** sudo
$ su **********
@@ -124,14 +124,14 @@
<section id="section--_ホスト名を変える">
<h3><a href="#section--_ホスト名を変える">ホスト名を変える</a></h3>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ sudo hostname teika</code>
</pre>
</section>
<section id="section--_公開鍵を置く">
<h3><a href="#section--_公開鍵を置く">公開鍵を置く</a></h3>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ vi ~/.ssh/authorized_keys</code>
@@ -148,7 +148,7 @@
SSH の設定を変更し、少しでも安全にしておく。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
$ sudo vi /etc/ssh/sshd_config</code>
</pre>
@@ -177,7 +177,7 @@
そして設定を反映。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ sudo systemctl restart sshd
$ sudo systemctl status sshd</code>
</pre>
@@ -189,7 +189,7 @@ $ sudo systemctl status sshd</code>
今の SSH セッションは閉じずに、ターミナルを別途開いて疎通確認する。セッションを閉じてしまうと、SSH の設定に不備があった場合に締め出しをくらう。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ ssh teika</code>
</pre>
</section>
@@ -200,7 +200,7 @@ $ sudo systemctl status sshd</code>
デフォルトの 22 番を閉じ、設定したポートだけ空ける。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ sudo ufw deny ssh
$ sudo ufw allow *******
$ sudo ufw enable
@@ -219,7 +219,7 @@ $ sudo systemctl status sshd</code>
GitHub に置いてある private リポジトリをサーバから clone したいので、SSH 鍵を生成して置いておく。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/github.key
$ cat ~/.ssh/github.key.pub</code>
</pre>
@@ -228,7 +228,7 @@ $ cat ~/.ssh/github.key.pub</code>
<a href="https://github.com/settings/ssh">GitHub の設定画面</a>から、この公開鍵を追加する。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ vi ~/.ssh/config</code>
</pre>
@@ -236,7 +236,7 @@ $ cat ~/.ssh/github.key.pub</code>
設定はこう。
</p>
- <pre language="ssh_config" linenumbering="unnumbered">
+ <pre class="highlight" language="ssh_config" linenumbering="unnumbered">
<code>Host github.com
HostName github.com
User git
@@ -247,14 +247,14 @@ IdentityFile ~/.ssh/github.key</code>
最後に接続できるか確認しておく。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>ssh -T github.com</code>
</pre>
</section>
<section id="section--_パッケージの更新">
<h3><a href="#section--_パッケージの更新">パッケージの更新</a></h3>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ sudo apt update
$ sudo apt upgrade
$ sudo apt update
@@ -275,14 +275,14 @@ IdentityFile ~/.ssh/github.key</code>
<section id="section--_使うソフトウェアのインストール">
<h3><a href="#section--_使うソフトウェアのインストール">使うソフトウェアのインストール</a></h3>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ sudo apt install docker docker-compose git make</code>
</pre>
</section>
<section id="section--_メインユーザが_docker_を使えるように">
<h3><a href="#section--_メインユーザが_docker_を使えるように">メインユーザが Docker を使えるように</a></h3>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>sudo adduser ********** docker</code>
</pre>
</section>
@@ -293,7 +293,7 @@ IdentityFile ~/.ssh/github.key</code>
80 番と 443 番を空ける。
</p>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
$ sudo ufw reload
@@ -303,7 +303,7 @@ IdentityFile ~/.ssh/github.key</code>
<section id="section--_リポジトリのクローン">
<h3><a href="#section--_リポジトリのクローン">リポジトリのクローン</a></h3>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ cd
$ git clone git@github.com:nsfisis/nsfisis.dev.git
$ cd nsfisis.dev
@@ -313,7 +313,7 @@ IdentityFile ~/.ssh/github.key</code>
<section id="section--_certbot_で証明書取得">
<h3><a href="#section--_certbot_で証明書取得">certbot で証明書取得</a></h3>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ docker-compose up -d acme-challenge
$ make setup</code>
</pre>
@@ -321,7 +321,7 @@ IdentityFile ~/.ssh/github.key</code>
<section id="section--_サーバを稼動させる">
<h3><a href="#section--_サーバを稼動させる">サーバを稼動させる</a></h3>
- <pre language="shell-session" linenumbering="unnumbered">
+ <pre class="highlight" language="shell-session" linenumbering="unnumbered">
<code>$ make serve</code>
</pre>
</section>
diff --git a/public/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html b/public/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html
index f080c5e..7aa97a9 100644
--- a/public/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html
+++ b/public/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html
@@ -72,7 +72,7 @@
注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=&apos;​&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=%s).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;&apos;).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;
&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=&apos;​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=%s).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;&apos;).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;
&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=&apos;​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=%s).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;&apos;).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;
@@ -96,7 +96,7 @@
実行してみると、次のような出力が得られる。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>#
&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=&apos;​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=%s).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;&apos;).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;
&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=&apos;​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=%s).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;&apos;).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;
@@ -113,7 +113,7 @@
1 行目を除き、先ほどのコードとほぼ同じものが出てきた。もう一度実行してみる。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>#
W
&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=&apos;​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;​&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=%s).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;&apos;).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;
@@ -130,7 +130,7 @@ W
今度は 2 行目が書き換えられた。すべての行が変化するまで繰り返すと次のようになる。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>#
W
E
@@ -158,7 +158,7 @@ P</code>
Vim で開くと次のようになる (1 行目を抜粋)。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;&lt;200b&gt;&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=&apos;&lt;200b&gt;&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;&lt;200b&gt;&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=%s).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;&apos;).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;</code>
</pre>
@@ -185,7 +185,7 @@ P</code>
続いて、トークンへの変換ロジックを解析する。注目すべきはこの部分だ。以下、ゼロ幅スペースは Vim での表示に合わせて<code>&lt;200b&gt;</code>と記載する。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>fn($s)=&gt;chr(strlen($s)/3)</code>
</pre>
@@ -193,7 +193,7 @@ P</code>
PHP の<code>strlen()</code>は文字列のバイト数を返す。1 行目の<code>$s</code>は以下の内容となっており、
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>$s=&apos;&lt;200b&gt;&lt;?php printf((isset($s)?fn($s)=&gt;trim($s,&quot;&lt;200b&gt;&quot;):fn($s)=&gt;chr(strlen($s)/3))($s=%s).&quot;\n&quot;,&quot;\x27$s\x27&quot;);?&gt;&apos;</code>
</pre>
diff --git a/public/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html b/public/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html
index 6f9586a..3100b8e 100644
--- a/public/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html
+++ b/public/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html
@@ -82,7 +82,7 @@
注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
try {
f(g() / __LINE__);
@@ -239,7 +239,7 @@
このうち 1つ目のケースは、<code>finally</code>節の中でエラーを投げると PHP 処理系が勝手に<code>$previous</code>を設定してくれる。
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
try {
@@ -267,7 +267,7 @@
出力部をコメントや改行を追加して再掲する:
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
try {
f(g() / __LINE__);
@@ -287,7 +287,7 @@
フォーマット指定子<code>%c</code>は、整数を ASCII コード<span></span>と見做して印字する。トークン<code>#base64_decode(&apos;SGVsbG8sIFdvcmxkIQ==&apos;)</code>の<code>b</code>であれば、ASCII コード<code>98</code>なので、75 行目で発生したエラー、
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code> 1, 20 =&gt; 0 / 0,</code>
</pre>
@@ -306,7 +306,7 @@
<code>f()</code>の定義を再掲する (エラーオブジェクトの行数を利用しているので、一部分だけ抜き出すと値が変わることに注意):
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>function f(int $i) {
if ($i &lt; 0) f();
try {
@@ -333,13 +333,13 @@
前述のように、<code>finally</code>節でエラーを投げると PHP 処理系が<code>$previous</code>を設定する。ここでは、エラーを繋げるために<code>f()</code>を再帰呼び出ししている。最初に<code>f()</code>を呼び出している箇所を確認すると、
</p>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>&lt;?php
try {
f(g() / __LINE__); // 3 行目</code>
</pre>
- <pre language="php" linenumbering="unnumbered">
+ <pre class="highlight" language="php" linenumbering="unnumbered">
<code>function g() {
return __LINE__; // 111 行目
}</code>