diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-07 23:06:23 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-07 23:06:23 +0900 |
| commit | 9d5ec5e3bc01c6174dea048e118edee579c36565 (patch) | |
| tree | 8bdb98836728e14f61bad56043f67bb352590963 | |
| parent | 479747454273abdbe9b5cc3f5c3dd18bbda7741a (diff) | |
| download | nsfisis.dev-9d5ec5e3bc01c6174dea048e118edee579c36565.tar.gz nsfisis.dev-9d5ec5e3bc01c6174dea048e118edee579c36565.tar.zst nsfisis.dev-9d5ec5e3bc01c6174dea048e118edee579c36565.zip | |
fix(style): fix codeblock style for rouge
161 files changed, 2667 insertions, 2882 deletions
diff --git a/services/nuldoc/lib/nuldoc/markdown/transform.rb b/services/nuldoc/lib/nuldoc/markdown/transform.rb index c11eb541..89bdcbff 100644 --- a/services/nuldoc/lib/nuldoc/markdown/transform.rb +++ b/services/nuldoc/lib/nuldoc/markdown/transform.rb @@ -312,9 +312,10 @@ module Nuldoc lexer = Rouge::Lexer.find(language) || Rouge::Lexers::PlainText.new lexer = lexer.new if lexer.is_a?(Class) formatter = Rouge::Formatters::HTMLInline.new('github.light') + line_formatter = Rouge::Formatters::HTMLLinewise.new(formatter, class: 'codeblock-line') tokens = lexer.lex(source) - inner_html = formatter.format(tokens) - "<pre class=\"highlight\" style=\"background-color:#f5f5f5\"><code>#{inner_html}\n</code></pre>" + inner_html = line_formatter.format(tokens) + "<pre class=\"highlight\" style=\"background-color:#f5f5f5\"><code>#{inner_html.chomp.sub(/\n<\/div>\z/, '</div>')}</code></pre>" end def generate_table_of_contents diff --git a/services/nuldoc/public/about/404.html b/services/nuldoc/public/about/404.html index 466c34d4..0cc57490 100644 --- a/services/nuldoc/public/about/404.html +++ b/services/nuldoc/public/about/404.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Page Not Found|nsfisis.dev</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/about/index.html b/services/nuldoc/public/about/index.html index fa6942a0..65b83d9d 100644 --- a/services/nuldoc/public/about/index.html +++ b/services/nuldoc/public/about/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>About|nsfisis.dev</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/about/style.css b/services/nuldoc/public/about/style.css index eba86a34..4090151a 100644 --- a/services/nuldoc/public/about/style.css +++ b/services/nuldoc/public/about/style.css @@ -181,18 +181,18 @@ code { font-size: 0.9rem; } -.shiki code { +.codeblock code { background-color: unset; padding: 0; } /* https://github.com/shikijs/shiki/issues/3 */ -.shiki code { +.codeblock.numbered code { counter-reset: codeblock-line-number; counter-increment: codeblock-line-number 0; } -.numbered .shiki code .line::before { +.codeblock.numbered code .codeblock-line::before { content: counter(codeblock-line-number); counter-increment: codeblock-line-number; width: 2rem; @@ -280,7 +280,7 @@ h1 { .admonition { background-color: #f5f5f5; - border: 1px solid #d1d1d1; + border: 1px solid #ddd; padding: 1rem 1.5rem; margin: 1rem 0; } @@ -335,8 +335,8 @@ img { gap: 1rem; margin: 2rem 0; padding: 1rem 0; - border-top: 1px solid #d1d1d1; - border-bottom: 1px solid #d1d1d1; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; } .pagination-page { @@ -368,7 +368,7 @@ img { color: #fff; } -.pagination-elipsis { +.pagination-ellipsis { color: #999; } diff --git a/services/nuldoc/public/blog/404.html b/services/nuldoc/public/blog/404.html index 4fe3c882..054f6a29 100644 --- a/services/nuldoc/public/blog/404.html +++ b/services/nuldoc/public/blog/404.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Page Not Found|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2/index.html b/services/nuldoc/public/blog/posts/2/index.html index 986ad21c..2c32f9bf 100644 --- a/services/nuldoc/public/blog/posts/2/index.html +++ b/services/nuldoc/public/blog/posts/2/index.html @@ -15,7 +15,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/posts/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>投稿一覧 (2ページ目)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> @@ -56,7 +56,7 @@ <div class="pagination-page"> <a href="/posts/3/">3</a> </div> - <div class="pagination-elipsis"> + <div class="pagination-ellipsis"> … </div> <div class="pagination-page"> @@ -310,7 +310,7 @@ <div class="pagination-page"> <a href="/posts/3/">3</a> </div> - <div class="pagination-elipsis"> + <div class="pagination-ellipsis"> … </div> <div class="pagination-page"> diff --git a/services/nuldoc/public/blog/posts/2021-03-05/my-first-post/index.html b/services/nuldoc/public/blog/posts/2021-03-05/my-first-post/index.html index 8687faeb..a64233b8 100644 --- a/services/nuldoc/public/blog/posts/2021-03-05/my-first-post/index.html +++ b/services/nuldoc/public/blog/posts/2021-03-05/my-first-post/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>My First Post|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -175,8 +175,7 @@ </blockquote> <hr> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #953800">puts</span> <span style="color: #0a3069">"Hello, World!"</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #953800">puts</span> <span style="color: #0a3069">"Hello, World!"</span></div></code></pre> </div> <p> <strong>emph</strong> <em>strong</em> diff --git a/services/nuldoc/public/blog/posts/2021-03-30/phperkaigi-2021/index.html b/services/nuldoc/public/blog/posts/2021-03-30/phperkaigi-2021/index.html index a9dc22a6..f9dd00a4 100644 --- a/services/nuldoc/public/blog/posts/2021-03-30/phperkaigi-2021/index.html +++ b/services/nuldoc/public/blog/posts/2021-03-30/phperkaigi-2021/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2021|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html b/services/nuldoc/public/blog/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html index 03eef3a9..01221534 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【C++】 属性構文の属性名にはキーワードが使える|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -72,43 +72,40 @@ タイトル落ち。まずはこのコードを見て欲しい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">#include</span> <span style="color: #6e7781"><iostream></span><span style="color: #6e7781"> -</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">alignas</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">alignof</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">and</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">and_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">asm</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">auto</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">bitand</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">bitor</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">bool</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">case</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">catch</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char16_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char32_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">class</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">compl</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">const</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">const_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">constexpr</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">decltype</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">default</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">delete</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">do</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">double</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">dynamic_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">else</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">enum</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">explicit</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">export</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">extern</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">false</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">final</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">float</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">for</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">friend</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">goto</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">if</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">inline</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">long</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">mutable</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">namespace</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">new</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">noexcept</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">not</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">not_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">nullptr</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">operator</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">or</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">or_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">override</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">private</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">protected</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">public</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">register</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">reinterpret_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">return</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">short</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">signed</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">sizeof</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static_assert</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">struct</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">switch</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">template</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">this</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">thread_local</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">throw</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">true</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">try</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typedef</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typeid</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typename</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">union</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">unsigned</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">virtual</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">void</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">volatile</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">wchar_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">while</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">xor</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">xor_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -<span style="color: #6e7781">// [[using]]</span> -<span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">std</span><span style="color: #0550ae">::</span><span style="color: #24292f;background-color: #f6f8fa">cout</span> <span style="color: #0550ae"><<</span> <span style="color: #0a3069">"Hello, World!"</span> <span style="color: #0550ae"><<</span> <span style="color: #24292f;background-color: #f6f8fa">std</span><span style="color: #0550ae">::</span><span style="color: #24292f;background-color: #f6f8fa">endl</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">#include</span> <span style="color: #6e7781"><iostream></span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">alignas</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">alignof</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">and</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">and_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">asm</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">auto</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">bitand</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">bitor</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">bool</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">case</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">catch</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char16_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char32_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">class</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">compl</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">const</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">const_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">constexpr</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">decltype</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">default</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">delete</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">do</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">double</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">dynamic_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">else</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">enum</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">explicit</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">export</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">extern</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">false</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">final</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">float</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">for</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">friend</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">goto</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">if</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">inline</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">long</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">mutable</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">namespace</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">new</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">noexcept</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">not</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">not_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">nullptr</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">operator</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">or</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">or_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">override</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">private</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">protected</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">public</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">register</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">reinterpret_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">return</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">short</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">signed</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">sizeof</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static_assert</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">struct</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">switch</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">template</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">this</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">thread_local</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">throw</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">true</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">try</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typedef</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typeid</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typename</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">union</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">unsigned</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">virtual</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">void</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">volatile</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">wchar_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">while</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">xor</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">xor_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// [[using]]</span> +</div><div class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">std</span><span style="color: #0550ae">::</span><span style="color: #24292f;background-color: #f6f8fa">cout</span> <span style="color: #0550ae"><<</span> <span style="color: #0a3069">"Hello, World!"</span> <span style="color: #0550ae"><<</span> <span style="color: #24292f;background-color: #f6f8fa">std</span><span style="color: #0550ae">::</span><span style="color: #24292f;background-color: #f6f8fa">endl</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> コンパイラのバージョン </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ clang++ –version Apple clang version 11.0.0 -(clang-1100.0.33.8) Target: x86_64-apple-darwin19.6.0 Thread model: -posix InstalledDir: -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ clang++ –version Apple clang version 11.0.0 +</div><div class="codeblock-line">(clang-1100.0.33.8) Target: x86_64-apple-darwin19.6.0 Thread model: +</div><div class="codeblock-line">posix InstalledDir: +</div><div class="codeblock-line">/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin</div></code></pre> </div> <p> コンパイルコマンド (C++17 指定) </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ clang –std=c++17 hoge.cpp -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ clang –std=c++17 hoge.cpp</div></code></pre> </div> <p> この記事から得られるものはこれ以上ないので以下は蛇足になる。 @@ -138,9 +135,8 @@ posix InstalledDir: 上のコードでは <code>[[using]]</code> をコメントアウトしているが、これは <code>using</code> キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">// using の例</span> -<span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">using</span> <span style="color: #24292f;background-color: #f6f8fa">foo</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">attr1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">attr2</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #6e7781">// [[foo::attr1, foo::attr2]] の糖衣構文</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">// using の例</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">using</span> <span style="color: #24292f;background-color: #f6f8fa">foo</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">attr1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">attr2</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #6e7781">// [[foo::attr1, foo::attr2]] の糖衣構文</span></div></code></pre> </div> <p> C++17 の仕様も見てみる (正確には標準化前のドラフト)。 diff --git a/services/nuldoc/public/blog/posts/2021-10-02/python-unbound-local-error/index.html b/services/nuldoc/public/blog/posts/2021-10-02/python-unbound-local-error/index.html index 22d4740b..b712c378 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/python-unbound-local-error/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/python-unbound-local-error/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Python】 クロージャとUnboundLocalError: local variable 'x' referenced before assignment|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -75,14 +75,13 @@ Python でクロージャを作ろうと、次のようなコードを書いた。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> - <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> - <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> - <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> - <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - -<span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">()</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> +</div><div class="codeblock-line"> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">()</span></div></code></pre> </div> <p> 関数 <code>g</code> から 関数 <code>f</code> のスコープ内で定義された変数 <code>x</code> を参照し、それに 1 を足そうとしている。 これを実行すると <code>x += 1</code> の箇所でエラーが発生する。 @@ -96,29 +95,27 @@ local変数 <code>x</code> が代入前に参照された、とある。これは、<code>f</code> の <code>x</code> を参照するのではなく、新しく別の変数を <code>g</code> 内に作ってしまっているため。前述のコードを宣言と代入を便宜上分けて書き直すと次のようになる。<code>var</code> を変数宣言のための構文として擬似的に利用している。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># 注: var は正しい Python の文法ではない。上記参照のこと -</span><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> - <span style="color: #24292f;background-color: #f6f8fa">var</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781"># f の local変数 'x' を宣言 -</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781"># x に 0 を代入 -</span> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> <span style="color: #6e7781"># f の内部関数 g を定義 -</span> <span style="color: #24292f;background-color: #f6f8fa">var</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781"># g の local変数 'x' を宣言 -</span> <span style="color: #6e7781"># たまたま f にも同じ名前の変数があるが、それとは別の変数 -</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> <span style="color: #6e7781"># x に 1 を加算 (x = x + 1 の糖衣構文) -</span> <span style="color: #6e7781"># 加算する前の値を参照しようとするが、まだ代入されていないためエラー -</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># 注: var は正しい Python の文法ではない。上記参照のこと</span> +</div><div class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">var</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781"># f の local変数 'x' を宣言</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781"># x に 0 を代入</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> <span style="color: #6e7781"># f の内部関数 g を定義</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">var</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781"># g の local変数 'x' を宣言</span> +</div><div class="codeblock-line"> <span style="color: #6e7781"># たまたま f にも同じ名前の変数があるが、それとは別の変数</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> <span style="color: #6e7781"># x に 1 を加算 (x = x + 1 の糖衣構文)</span> +</div><div class="codeblock-line"> <span style="color: #6e7781"># 加算する前の値を参照しようとするが、まだ代入されていないためエラー</span> +</div><div class="codeblock-line"> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span></div></code></pre> </div> <p> 当初の意図を表現するには、次のように書けばよい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> - <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> - <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> - <span style="color: #cf222e">nonlocal</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781">## (*) -</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> - <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">nonlocal</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781">## (*)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> +</div><div class="codeblock-line"> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span></div></code></pre> </div> <p> <code>(*)</code> のように、<code>nonlocal</code> を追加する。これにより一つ外側のスコープ (<code>g</code> の一つ外側 = <code>f</code>) で定義されている <code>x</code> を探しに行くようになる。 diff --git a/services/nuldoc/public/blog/posts/2021-10-02/ruby-detect-running-implementation/index.html b/services/nuldoc/public/blog/posts/2021-10-02/ruby-detect-running-implementation/index.html index 45327155..4d9d8dee 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/ruby-detect-running-implementation/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/ruby-detect-running-implementation/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Ruby】 自身を実行している処理系の種類を判定する|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -81,13 +81,12 @@ 上記ページの例から引用する: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ruby-1.9.1 <span style="color: #116329">-ve</span> <span style="color: #0a3069">'p RUBY_ENGINE'</span> -<span style="color: #24292f;background-color: #f6f8fa">ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux] -"ruby" -</span><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>jruby <span style="color: #116329">-ve</span> <span style="color: #0a3069">'p RUBY_ENGINE'</span> -<span style="color: #24292f;background-color: #f6f8fa">jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java] -"jruby"</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ruby-1.9.1 <span style="color: #116329">-ve</span> <span style="color: #0a3069">'p RUBY_ENGINE'</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">"ruby"</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>jruby <span style="color: #116329">-ve</span> <span style="color: #0a3069">'p RUBY_ENGINE'</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">"jruby"</span></div></code></pre> </div> <p> それぞれの処理系がどのような値を返すかだが、stack overflow に良い質問と回答があった。 @@ -97,17 +96,16 @@ </p> <blockquote> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>| RUBY_ENGINE | Implementation | -|:-----------:|:------------------| -| <undefined> | MRI < 1.9 | -| 'ruby' | MRI >= 1.9 or REE | -| 'jruby' | JRuby | -| 'macruby' | MacRuby | -| 'rbx' | Rubinius | -| 'maglev' | MagLev | -| 'ironruby' | IronRuby | -| 'cardinal' | Cardinal | -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">| RUBY_ENGINE | Implementation | +</div><div class="codeblock-line">|:-----------:|:------------------| +</div><div class="codeblock-line">| <undefined> | MRI < 1.9 | +</div><div class="codeblock-line">| 'ruby' | MRI >= 1.9 or REE | +</div><div class="codeblock-line">| 'jruby' | JRuby | +</div><div class="codeblock-line">| 'macruby' | MacRuby | +</div><div class="codeblock-line">| 'rbx' | Rubinius | +</div><div class="codeblock-line">| 'maglev' | MagLev | +</div><div class="codeblock-line">| 'ironruby' | IronRuby | +</div><div class="codeblock-line">| 'cardinal' | Cardinal |</div></code></pre> </div> </blockquote> <p> @@ -123,11 +121,10 @@ <div class="filename"> version.h </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">/* - * Ruby engine. - */</span> -<span style="color: #6e7781">#define MRUBY_RUBY_ENGINE "mruby"</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">/*</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * Ruby engine.</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> */</span> +</div><div class="codeblock-line"><span style="color: #6e7781">#define MRUBY_RUBY_ENGINE "mruby"</span></div></code></pre> </div> </div> </article> diff --git a/services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html b/services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html index d4a3070b..fcda0ecc 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Ruby】 then キーワードと case in|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -103,38 +103,36 @@ 使われることは稀だが、Ruby では <code>then</code> がキーワードになっている。次のように使う: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">cond</span> <span style="color: #cf222e">then</span> - <span style="color: #953800">puts</span> <span style="color: #0a3069">"Y"</span> -<span style="color: #cf222e">else</span> - <span style="color: #953800">puts</span> <span style="color: #0a3069">"N"</span> -<span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">cond</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #953800">puts</span> <span style="color: #0a3069">"Y"</span> +</div><div class="codeblock-line"><span style="color: #cf222e">else</span> +</div><div class="codeblock-line"> <span style="color: #953800">puts</span> <span style="color: #0a3069">"N"</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> </div> <p> このキーワードが現れうる場所はいくつかあり、<code>if</code>、<code>unless</code>、<code>rescue</code>、<code>case</code> 構文がそれに当たる。 上記のように、何か条件を書いた後 <code>then</code> を置き、式がそこで終了していることを示すマーカーとして機能する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># Example:</span> - -<span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #cf222e">then</span> - <span style="color: #24292f;background-color: #f6f8fa">a</span> -<span style="color: #cf222e">end</span> - -<span style="color: #cf222e">unless</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #cf222e">then</span> - <span style="color: #24292f;background-color: #f6f8fa">a</span> -<span style="color: #cf222e">end</span> - -<span style="color: #cf222e">begin</span> - <span style="color: #24292f;background-color: #f6f8fa">a</span> -<span style="color: #cf222e">rescue</span> <span style="color: #cf222e">then</span> - <span style="color: #24292f;background-color: #f6f8fa">b</span> -<span style="color: #cf222e">end</span> - -<span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -<span style="color: #cf222e">when</span> <span style="color: #953800">p</span> <span style="color: #cf222e">then</span> - <span style="color: #24292f;background-color: #f6f8fa">a</span> -<span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># Example:</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">unless</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">begin</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</div><div class="codeblock-line"><span style="color: #cf222e">rescue</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</div><div class="codeblock-line"><span style="color: #cf222e">when</span> <span style="color: #953800">p</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> </div> </section> <section id="section--why-then-is-usually-unnecessary"> @@ -143,19 +141,17 @@ 普通 Ruby のコードで <code>then</code> を書くことはない。なぜか。次のコードを実行してみるとわかる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">if</span> <span style="color: #cf222e">true</span> <span style="color: #953800">puts</span> <span style="color: #0a3069">'Hello, World!'</span> <span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #cf222e">true</span> <span style="color: #953800">puts</span> <span style="color: #0a3069">'Hello, World!'</span> <span style="color: #cf222e">end</span></div></code></pre> </div> <p> 次のような構文エラーが出力される。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n' -if true puts 'Hello, World!' end - ^~~~ -20:1: syntax error, unexpected `end', expecting end-of-input -...f true puts 'Hello, World!' end -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n' +</div><div class="codeblock-line">if true puts 'Hello, World!' end +</div><div class="codeblock-line"> ^~~~ +</div><div class="codeblock-line">20:1: syntax error, unexpected `end', expecting end-of-input +</div><div class="codeblock-line">...f true puts 'Hello, World!' end</div></code></pre> </div> <p> 二つ目のメッセージは無視して一つ目を読むと、<code>then</code> か <code>;</code> か改行が来るはずのところ変数だかメソッドだかが現れたことによりエラーとなっているようだ。 @@ -164,9 +160,8 @@ if true puts 'Hello, World!' end ポイントは改行が <code>then</code> (や <code>;</code>) の代わりとなることである。<code>true</code> の後に改行を入れてみる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">if</span> <span style="color: #cf222e">true</span> -<span style="color: #953800">puts</span> <span style="color: #0a3069">'Hello, World!'</span> <span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #cf222e">true</span> +</div><div class="codeblock-line"><span style="color: #953800">puts</span> <span style="color: #0a3069">'Hello, World!'</span> <span style="color: #cf222e">end</span></div></code></pre> </div> <p> 無事 Hello, World! と出力されるようになった。 @@ -178,25 +173,22 @@ if true puts 'Hello, World!' end なぜ <code>then</code> や <code>;</code> や改行 (以下 「<code>then</code> 等」) が必要なのだろうか。次の例を見てほしい: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> <span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> <span style="color: #cf222e">end</span></div></code></pre> </div> <p> <code>then</code> も <code>;</code> も改行もないのでエラーになるが、これは条件式がどこまで続いているのかわからないためだ。この例は二通りに解釈できる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価</span> -<span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> <span style="color: #cf222e">then</span> -<span style="color: #24292f;background-color: #f6f8fa">b</span> -<span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価</span> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">b</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> </div> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、</span> -<span style="color: #6e7781"># その結果が truthy なら何もしない</span> -<span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">then</span> -<span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># その結果が truthy なら何もしない</span> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> </div> <p> <code>then</code> 等はこの曖昧性を排除するためにあり、条件式は <code>if</code> から <code>then</code> 等までの間にある、ということを明確にする。 C系の <code>if</code> 後に来る <code>(</code>/<code>)</code> や、Python の <code>:</code>、Rust/Go/Swift などの <code>{</code> も同じ役割を持つ。 @@ -217,41 +209,39 @@ if true puts 'Hello, World!' end <div class="filename"> parse.y </div> - <pre class="highlight" style="background-color:#f5f5f5"><code>p_case_body : keyword_in -{ - SET_LEX_STATE(EXPR_BEG|EXPR_LABEL); - p->command_start = FALSE; - $<ctxt>1 = p->ctxt; - p->ctxt.in_kwarg = 1; - $<tbl>$ = push_pvtbl(p); -} -{ - $<tbl>$ = push_pktbl(p); -} -p_top_expr then -{ - pop_pktbl(p, $<tbl>3); - pop_pvtbl(p, $<tbl>2); - p->ctxt.in_kwarg = $<ctxt>1.in_kwarg; -} -compstmt -p_cases -{ - /*%%%*/ - $$ = NEW_IN($4, $7, $8, &@$); - /*% %*/ - /*% ripper: in!($4, $7, escape_Qundef($8)) %*/ -} -; -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">p_case_body : keyword_in +</div><div class="codeblock-line">{ +</div><div class="codeblock-line"> SET_LEX_STATE(EXPR_BEG|EXPR_LABEL); +</div><div class="codeblock-line"> p->command_start = FALSE; +</div><div class="codeblock-line"> $<ctxt>1 = p->ctxt; +</div><div class="codeblock-line"> p->ctxt.in_kwarg = 1; +</div><div class="codeblock-line"> $<tbl>$ = push_pvtbl(p); +</div><div class="codeblock-line">} +</div><div class="codeblock-line">{ +</div><div class="codeblock-line"> $<tbl>$ = push_pktbl(p); +</div><div class="codeblock-line">} +</div><div class="codeblock-line">p_top_expr then +</div><div class="codeblock-line">{ +</div><div class="codeblock-line"> pop_pktbl(p, $<tbl>3); +</div><div class="codeblock-line"> pop_pvtbl(p, $<tbl>2); +</div><div class="codeblock-line"> p->ctxt.in_kwarg = $<ctxt>1.in_kwarg; +</div><div class="codeblock-line">} +</div><div class="codeblock-line">compstmt +</div><div class="codeblock-line">p_cases +</div><div class="codeblock-line">{ +</div><div class="codeblock-line"> /*%%%*/ +</div><div class="codeblock-line"> $$ = NEW_IN($4, $7, $8, &@$); +</div><div class="codeblock-line"> /*% %*/ +</div><div class="codeblock-line"> /*% ripper: in!($4, $7, escape_Qundef($8)) %*/ +</div><div class="codeblock-line">} +</div><div class="codeblock-line">;</div></code></pre> </div> <p> 簡略版: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>p_case_body : keyword_in p_top_expr then compstmt p_cases -; -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">p_case_body : keyword_in p_top_expr then compstmt p_cases +</div><div class="codeblock-line">;</div></code></pre> </div> <p> ここで、<code>keyword_in</code> は文字通り <code>in</code>、<code>p_top_expr</code> はいわゆるパターン、<code>then</code> は <code>then</code> キーワードのことではなく、この記事で <code>then</code> 等と呼んでいるもの、つまり <code>then</code> キーワード、<code>;</code>、改行のいずれかである。 @@ -260,38 +250,36 @@ p_cases これにより、<code>case</code> - <code>when</code> による従来の構文と同じように、<code>then</code> 等をパターンの後ろに挿入すればよいことがわかった。つまり次の3通りのいずれかになる: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> -<span style="color: #cf222e">end</span> - -<span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span> - <span style="color: #24292f;background-color: #f6f8fa">a</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span> - <span style="color: #24292f;background-color: #f6f8fa">b</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> -<span style="color: #cf222e">end</span> - -<span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> -<span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> </div> <p> ところで、<code>p_top_expr</code> には <code>if</code> による guard clause が書けるので、その場合は <code>if</code> - <code>then</code> と似たような見た目になる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -<span style="color: #cf222e">in</span> <span style="color: #0550ae">0</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> -<span style="color: #cf222e">in</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> -<span style="color: #cf222e">in</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> -<span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">0</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> </div> </section> <section id="section--outro"> diff --git a/services/nuldoc/public/blog/posts/2021-10-02/rust-where-are-primitive-types-from/index.html b/services/nuldoc/public/blog/posts/2021-10-02/rust-where-are-primitive-types-from/index.html index 3b9f71fa..3978c8eb 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/rust-where-are-primitive-types-from/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/rust-where-are-primitive-types-from/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Rust のプリミティブ型はどこからやって来るか|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -88,27 +88,26 @@ Rust において、プリミティブ型の名前は予約語でない。したがって、次のコードは合法である。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #8250df">#![allow(non_camel_case_types)]</span> -<span style="color: #8250df">#![allow(dead_code)]</span> - -<span style="color: #cf222e">struct</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">char</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">i8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">i16</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">i32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">i64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">i128</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">isize</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">u8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">u16</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">u32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">u64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">u128</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">usize</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">f32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">f64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">struct</span> <span style="color: #953800">str</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #8250df">#![allow(non_camel_case_types)]</span> +</div><div class="codeblock-line"><span style="color: #8250df">#![allow(dead_code)]</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">char</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i16</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i128</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">isize</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u16</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u128</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">usize</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">f32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">f64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">str</span><span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> </div> <p> では、普段単に <code>bool</code> と書いたとき、この <code>bool</code> は一体どこから来ているのか。rustc のソースを追ってみた。 @@ -135,25 +134,23 @@ <code>rustc</code> はセルフホストされている (= <code>rustc</code> 自身が Rust で書かれている) ので、<code>bool</code> や <code>char</code> などで適当に検索をかけてもノイズが多すぎて話にならない。しかし、お誂え向きなことに <code>i128</code>/<code>u128</code> というコンパイラ自身が使うことがなさそうな型が存在するのでこれを使って <code>git grep</code> してみる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ git grep "\bi128\b" | wc # i128 -165 1069 15790 - -$ git grep "\bu128\b" | wc # u128 -293 2127 26667 - -$ git grep "\bbool\b" | wc # cf. bool の結果 -3563 23577 294659 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ git grep "\bi128\b" | wc # i128 +</div><div class="codeblock-line">165 1069 15790 +</div><div class="codeblock-line"> +</div><div class="codeblock-line">$ git grep "\bu128\b" | wc # u128 +</div><div class="codeblock-line">293 2127 26667 +</div><div class="codeblock-line"> +</div><div class="codeblock-line">$ git grep "\bbool\b" | wc # cf. bool の結果 +</div><div class="codeblock-line">3563 23577 294659</div></code></pre> </div> <p> 165 程度であれば探すことができそうだ。今回は、クレート名を見ておおよその当たりをつけた。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ git grep "\bi128\b" -... -rustc_resolve/src/lib.rs: table.insert(sym::i128, Int(IntTy::I128)); -... -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ git grep "\bi128\b" +</div><div class="codeblock-line">... +</div><div class="codeblock-line">rustc_resolve/src/lib.rs: table.insert(sym::i128, Int(IntTy::I128)); +</div><div class="codeblock-line">...</div></code></pre> </div> <p> <code>rustc_resolve</code> というのはいかにも名前解決を担いそうなクレート名である。該当箇所を見てみる。 @@ -162,75 +159,72 @@ rustc_resolve/src/lib.rs: table.insert(sym::i128, Int(IntTy::I128)); <div class="filename"> rustc_resolve/src/lib.rs </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">/// Interns the names of the primitive types.</span> -<span style="color: #6e7781">///</span> -<span style="color: #6e7781">/// All other types are defined somewhere and possibly imported, but the primitive ones need</span> -<span style="color: #6e7781">/// special handling, since they have no place of origin.</span> -<span style="color: #cf222e">struct</span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">primitive_types</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">FxHashMap</span><span style="color: #0550ae"><</span><span style="color: #24292f;background-color: #f6f8fa">Symbol</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">PrimTy</span><span style="color: #0550ae">></span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">impl</span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">fn</span> <span style="color: #8250df">new</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #cf222e">-></span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">let</span> <span style="color: #cf222e">mut</span> <span style="color: #24292f;background-color: #f6f8fa">table</span> <span style="color: #0550ae">=</span> <span style="color: #953800">FxHashMap</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">default</span><span style="color: #24292f;background-color: #f6f8fa">();</span> - - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Bool</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">char</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Char</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">f32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Float</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">FloatTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">F32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">f64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Float</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">FloatTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">F64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">isize</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Isize</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I8</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i16</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I16</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i128</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I128</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">str</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Str</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">usize</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Usize</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U8</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u16</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U16</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u128</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U128</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #cf222e">Self</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">primitive_types</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">table</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">/// Interns the names of the primitive types.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">///</span> +</div><div class="codeblock-line"><span style="color: #6e7781">/// All other types are defined somewhere and possibly imported, but the primitive ones need</span> +</div><div class="codeblock-line"><span style="color: #6e7781">/// special handling, since they have no place of origin.</span> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">primitive_types</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">FxHashMap</span><span style="color: #0550ae"><</span><span style="color: #24292f;background-color: #f6f8fa">Symbol</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">PrimTy</span><span style="color: #0550ae">></span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">impl</span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">fn</span> <span style="color: #8250df">new</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #cf222e">-></span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">let</span> <span style="color: #cf222e">mut</span> <span style="color: #24292f;background-color: #f6f8fa">table</span> <span style="color: #0550ae">=</span> <span style="color: #953800">FxHashMap</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">default</span><span style="color: #24292f;background-color: #f6f8fa">();</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Bool</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">char</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Char</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">f32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Float</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">FloatTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">F32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">f64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Float</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">FloatTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">F64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">isize</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Isize</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I8</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i16</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I16</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i128</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I128</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">str</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Str</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">usize</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Usize</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U8</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u16</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U16</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u128</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U128</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">Self</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">primitive_types</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">table</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> これは初めに列挙したプリミティブ型の一覧と一致している。doc comment にも、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>All other types are defined somewhere and possibly imported, but the -primitive ones need special handling, since they have no place of -origin. -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">All other types are defined somewhere and possibly imported, but the +</div><div class="codeblock-line">primitive ones need special handling, since they have no place of +</div><div class="codeblock-line">origin.</div></code></pre> </div> <p> とある。次はこの struct の使用箇所を追う。追うと言っても使われている箇所は次の一箇所しかない。なお説明に不要な箇所は大きく削っている。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">/// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.</span> -<span style="color: #6e7781">/// (略)</span> -<span style="color: #cf222e">fn</span> <span style="color: #8250df">resolve_ident_in_lexical_scope</span><span style="color: #24292f;background-color: #f6f8fa">(</span> - <span style="color: #0550ae">&</span><span style="color: #cf222e">mut</span> <span style="color: #cf222e">self</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #cf222e">mut</span> <span style="color: #24292f;background-color: #f6f8fa">ident</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">Ident</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">ns</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">Namespace</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #6e7781">// (略)</span> -<span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">-></span> <span style="color: #953800">Option</span><span style="color: #0550ae"><</span><span style="color: #24292f;background-color: #f6f8fa">LexicalScopeBinding</span><span style="color: #0550ae"><</span><span style="color: #0550ae">'a</span><span style="color: #0550ae">>></span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #6e7781">// (略)</span> - - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">ns</span> <span style="color: #0550ae">==</span> <span style="color: #24292f;background-color: #f6f8fa">TypeNS</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #cf222e">let</span> <span style="color: #8250df">Some</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">prim_ty</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">.primitive_type_table.primitive_types</span><span style="color: #8250df">.get</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">ident</span><span style="color: #0550ae">.name</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">let</span> <span style="color: #24292f;background-color: #f6f8fa">binding</span> <span style="color: #0550ae">=</span> - <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Res</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">PrimTy</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">prim_ty</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">ty</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">Visibility</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Public</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">DUMMY_SP</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">ExpnId</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">root</span><span style="color: #24292f;background-color: #f6f8fa">())</span> - <span style="color: #8250df">.to_name_binding</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">self</span><span style="color: #0550ae">.arenas</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #cf222e">return</span> <span style="color: #8250df">Some</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">LexicalScopeBinding</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">Item</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">binding</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - - <span style="color: #953800">None</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">/// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">/// (略)</span> +</div><div class="codeblock-line"><span style="color: #cf222e">fn</span> <span style="color: #8250df">resolve_ident_in_lexical_scope</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&</span><span style="color: #cf222e">mut</span> <span style="color: #cf222e">self</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">mut</span> <span style="color: #24292f;background-color: #f6f8fa">ident</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">Ident</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">ns</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">Namespace</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// (略)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">-></span> <span style="color: #953800">Option</span><span style="color: #0550ae"><</span><span style="color: #24292f;background-color: #f6f8fa">LexicalScopeBinding</span><span style="color: #0550ae"><</span><span style="color: #0550ae">'a</span><span style="color: #0550ae">>></span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// (略)</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">ns</span> <span style="color: #0550ae">==</span> <span style="color: #24292f;background-color: #f6f8fa">TypeNS</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #cf222e">let</span> <span style="color: #8250df">Some</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">prim_ty</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">.primitive_type_table.primitive_types</span><span style="color: #8250df">.get</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">ident</span><span style="color: #0550ae">.name</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">let</span> <span style="color: #24292f;background-color: #f6f8fa">binding</span> <span style="color: #0550ae">=</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Res</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">PrimTy</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">prim_ty</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">ty</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">Visibility</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Public</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">DUMMY_SP</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">ExpnId</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">root</span><span style="color: #24292f;background-color: #f6f8fa">())</span> +</div><div class="codeblock-line"> <span style="color: #8250df">.to_name_binding</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">self</span><span style="color: #0550ae">.arenas</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #8250df">Some</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">LexicalScopeBinding</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">Item</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">binding</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #953800">None</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 関数名や doc comment が示している通り、この関数は識別子 (identifier, ident) を現在のレキシカルスコープ内で解決 (resolve) する。<code>if ns == TypeNS</code> のブロック内では、<code>primitive_type_table</code> (上記の <code>PrimitiveTypeTable::new()</code> で作られた変数) に含まれている識別子 (<code>bool</code>、<code>i32</code> など) かどうか判定し、そうであればそれに紐づけられたプリミティブ型を返している。 @@ -245,14 +239,13 @@ origin. 動作がわかったところで、例として次のコードを考える。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #8250df">#![allow(non_camel_case_types)]</span> - -<span style="color: #cf222e">struct</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #cf222e">fn</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">let</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #953800">bool</span> <span style="color: #0550ae">=</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #8250df">#![allow(non_camel_case_types)]</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">fn</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">let</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #953800">bool</span> <span style="color: #0550ae">=</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> ここで <code>main()</code> の <code>bool</code> は <code>struct bool</code> として解決される。なぜなら、プリミティブ型の判定をする前に <code>bool</code> という名前の別の型が見つかるからだ。 diff --git a/services/nuldoc/public/blog/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html b/services/nuldoc/public/blog/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html index b620d8ab..c13d2535 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Vim】 autocmd events の BufWrite/BufWritePre の違い|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -146,9 +146,8 @@ <div class="filename"> src/autocmd.c </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufAdd"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFADD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -<span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufCreate"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFADD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufAdd"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFADD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufCreate"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFADD</span><span style="color: #24292f;background-color: #f6f8fa">},</span></div></code></pre> </div> <p> <a class="url" href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97" rel="noreferrer" target="_blank">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97</a> @@ -157,10 +156,9 @@ <div class="filename"> src/autocmd.c </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufRead"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -<span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufReadCmd"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADCMD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -<span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufReadPost"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufRead"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufReadCmd"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADCMD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufReadPost"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span></div></code></pre> </div> <p> <a class="url" href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105" rel="noreferrer" target="_blank">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105</a> @@ -169,10 +167,9 @@ <div class="filename"> src/autocmd.c </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWrite"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPRE</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -<span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWritePost"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -<span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWritePre"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPRE</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWrite"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPRE</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWritePost"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWritePre"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPRE</span><span style="color: #24292f;background-color: #f6f8fa">},</span></div></code></pre> </div> </section> <section id="section--code-reading--neovim"> @@ -187,13 +184,12 @@ <div class="filename"> src/nvim/auevents.lua </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">aliases</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">BufCreate</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufAdd'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">BufRead</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufReadPost'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">BufWrite</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufWritePre'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">FileEncoding</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'EncodingChanged'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #24292f;background-color: #f6f8fa">},</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">aliases</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">BufCreate</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufAdd'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">BufRead</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufReadPost'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">BufWrite</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufWritePre'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">FileEncoding</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'EncodingChanged'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">},</span></div></code></pre> </div> <p> ところで、上では取り上げなかった <code>FileEncoding</code> だが、これは <code>:help FileEncoding</code> にしっかりと書いてある。 @@ -202,10 +198,9 @@ <div class="filename"> :help FileEncoding </div> - <pre class="highlight" style="background-color:#f5f5f5"><code> *FileEncoding* -FileEncoding Obsolete. It still works and is equivalent - to |EncodingChanged|. -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> *FileEncoding* +</div><div class="codeblock-line">FileEncoding Obsolete. It still works and is equivalent +</div><div class="codeblock-line"> to |EncodingChanged|.</div></code></pre> </div> </section> </section> diff --git a/services/nuldoc/public/blog/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html b/services/nuldoc/public/blog/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html index 58e78a70..8c00497d 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Vimで選択した行の順番を入れ替える|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -102,12 +102,11 @@ <section id="section--tl-dr"> <h2><a href="#section--tl-dr">TL; DR</a></h2> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">" License: Public Domain</span> - -command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% -<span style="color: #0a3069"> \</span> Reverse -<span style="color: #0a3069"> \</span> <span style="color: #cf222e">keeppatterns</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">" License: Public Domain</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% +</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse +</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #cf222e">keeppatterns</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span></div></code></pre> </div> </section> <section id="section--version"> @@ -165,10 +164,9 @@ command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span sty なお、<code>:g/^/m0</code> は全ての行を入れ替えるが、<code>:N,Mg/^/mN-1</code> とすることで N行目から M行目を処理範囲とするよう拡張できる。手でこれを入力するわけにはいかないので、次のようなコマンドを用意する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% -<span style="color: #0a3069"> \</span> Reverse -<span style="color: #0a3069"> \</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% +</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse +</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span></div></code></pre> </div> <p> これは望みの動作をするが、実際に実行してみると全行がハイライトされてしまう。次節で詳細を述べる。 @@ -202,14 +200,13 @@ command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span sty 前述した <code>:Reverse</code> コマンドの定義を少し変えて、次のようにする: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">function</span><span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #0550ae">s:reverse_lines</span><span style="color: #24292f;background-color: #f6f8fa">(</span>from<span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">to</span><span style="color: #24292f;background-color: #f6f8fa">)</span> abort - <span style="color: #953800">execute</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"%d,%dg/^/m%d"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:from</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:to</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:from</span> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #cf222e">endfunction</span> - -command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% -<span style="color: #0a3069"> \</span> Reverse -<span style="color: #0a3069"> \</span> <span style="color: #cf222e">call</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>SID<span style="color: #24292f;background-color: #f6f8fa">></span>reverse_lines<span style="color: #24292f;background-color: #f6f8fa">(<</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line2<span style="color: #24292f;background-color: #f6f8fa">>)</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">function</span><span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #0550ae">s:reverse_lines</span><span style="color: #24292f;background-color: #f6f8fa">(</span>from<span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">to</span><span style="color: #24292f;background-color: #f6f8fa">)</span> abort +</div><div class="codeblock-line"> <span style="color: #953800">execute</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"%d,%dg/^/m%d"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:from</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:to</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:from</span> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #cf222e">endfunction</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% +</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse +</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #cf222e">call</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>SID<span style="color: #24292f;background-color: #f6f8fa">></span>reverse_lines<span style="color: #24292f;background-color: #f6f8fa">(<</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line2<span style="color: #24292f;background-color: #f6f8fa">>)</span></div></code></pre> </div> <p> 実行しているコマンドが変わったわけではないが、関数呼び出しを経由するようにした。これだけで前述の問題が解決する。 @@ -256,10 +253,9 @@ command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span sty </div> </div> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% -<span style="color: #0a3069"> \</span> Reverse -<span style="color: #0a3069"> \</span> <span style="color: #cf222e">keeppatterns</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% +</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse +</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #cf222e">keeppatterns</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span></div></code></pre> </div> <p> まさにこのための Exコマンド、<code>:keeppatterns</code> が存在する。<code>:keeppatterns {command}</code> のように使い、読んで字の如く、後ろに続く Exコマンドを「現在の検索パターンを保ったまま」実行する。はるかに分かりやすく意図を表現できる。 diff --git a/services/nuldoc/public/blog/posts/2022-04-09/phperkaigi-2022-tokens/index.html b/services/nuldoc/public/blog/posts/2022-04-09/phperkaigi-2022-tokens/index.html index c9e83d70..3a8e0490 100644 --- a/services/nuldoc/public/blog/posts/2022-04-09/phperkaigi-2022-tokens/index.html +++ b/services/nuldoc/public/blog/posts/2022-04-09/phperkaigi-2022-tokens/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2022 トークン問題の解説|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -166,76 +166,75 @@ <div class="filename"> brainf_ck.php </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #cf222e">declare</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">strict_types</span><span style="color: #0550ae">=</span><span style="color: #0550ae">0O1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - -<span style="color: #cf222e">namespace</span> <span style="color: #953800">Dgcircus\PHPerKaigi\Y2022</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #6e7781">/** - * @todo - * Run this program to acquire a PHPer token. - */</span> - -<span style="color: #24292f;background-color: #f6f8fa">https</span><span style="color: #0550ae">://</span><span style="color: #24292f;background-color: #f6f8fa">creativecommons</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">org</span><span style="color: #0550ae">/</span><span style="color: #24292f;background-color: #f6f8fa">publicdomain</span><span style="color: #0550ae">/</span><span style="color: #24292f;background-color: #f6f8fa">zero</span><span style="color: #0550ae">/</span><span style="color: #0550ae">1.0</span><span style="color: #0550ae">/</span> - -<span style="color: #8250df">\error_reporting</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">~+!</span><span style="color: #0a3069">'We are hiring!'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - -<span style="color: #0550ae">$z</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$f</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(...</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #0550ae">...</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">)))(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(...</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #0550ae">...</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">)));</span> -<span style="color: #0550ae">$id</span> <span style="color: #0550ae">=</span> <span style="color: #8250df">\spl_object_id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$put</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #8250df">\printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$c</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$mm</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">new</span> <span style="color: #953800">\ArrayObject</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">\array_fill</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[],</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - -<span style="color: #f6f8fa;background-color: #82071e">$👉</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">++</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> -<span style="color: #f6f8fa;background-color: #82071e">$👈</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">--</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> -<span style="color: #f6f8fa;background-color: #82071e">$👍</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">]];</span> -<span style="color: #f6f8fa;background-color: #82071e">$👎</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">--</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">]];</span> -<span style="color: #f6f8fa;background-color: #82071e">$📝</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$put</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">])];</span> -<span style="color: #f6f8fa;background-color: #82071e">$🤡</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">])</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$n</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">--</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #24292f;background-color: #f6f8fa">})(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-!</span><span style="color: #24292f;background-color: #f6f8fa">[])],</span> - <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">],</span> -<span style="color: #24292f;background-color: #f6f8fa">};</span> -<span style="color: #f6f8fa;background-color: #82071e">$🎪</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">])</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">],</span> - <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">--</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$n</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">$pc</span><span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">--</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">--</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">--</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #24292f;background-color: #f6f8fa">})(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-!</span><span style="color: #24292f;background-color: #f6f8fa">[])],</span> -<span style="color: #24292f;background-color: #f6f8fa">};</span> -<span style="color: #f6f8fa;background-color: #82071e">$🐘</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> - <span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">])</span> <span style="color: #0550ae">&&</span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">](</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> -<span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #0550ae">$mm</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[],</span> <span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">.</span><span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[])),</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">$🤡</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">$🎪</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[],</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> - -<span style="color: #f6f8fa;background-color: #82071e">$🐘</span><span style="color: #24292f;background-color: #f6f8fa">([</span> - <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$🤡</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$🎪</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #24292f;background-color: #f6f8fa">]);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">declare</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">strict_types</span><span style="color: #0550ae">=</span><span style="color: #0550ae">0O1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">namespace</span> <span style="color: #953800">Dgcircus\PHPerKaigi\Y2022</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">/**</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * @todo</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * Run this program to acquire a PHPer token.</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> */</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">https</span><span style="color: #0550ae">://</span><span style="color: #24292f;background-color: #f6f8fa">creativecommons</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">org</span><span style="color: #0550ae">/</span><span style="color: #24292f;background-color: #f6f8fa">publicdomain</span><span style="color: #0550ae">/</span><span style="color: #24292f;background-color: #f6f8fa">zero</span><span style="color: #0550ae">/</span><span style="color: #0550ae">1.0</span><span style="color: #0550ae">/</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #8250df">\error_reporting</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">~+!</span><span style="color: #0a3069">'We are hiring!'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$z</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$f</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(...</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #0550ae">...</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">)))(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(...</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #0550ae">...</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">)));</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$id</span> <span style="color: #0550ae">=</span> <span style="color: #8250df">\spl_object_id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$put</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #8250df">\printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$c</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$mm</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">new</span> <span style="color: #953800">\ArrayObject</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">\array_fill</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[],</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$👉</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">++</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$👈</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">--</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$👍</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">]];</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$👎</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">--</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">]];</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$📝</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$put</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">])];</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$🤡</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">])</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$n</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">--</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">})(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-!</span><span style="color: #24292f;background-color: #f6f8fa">[])],</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">],</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">};</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$🎪</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">])</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">],</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">--</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$n</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">$pc</span><span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">--</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">--</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">--</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">})(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-!</span><span style="color: #24292f;background-color: #f6f8fa">[])],</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">};</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$🐘</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> +</div><div class="codeblock-line"> <span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">])</span> <span style="color: #0550ae">&&</span> <span style="color: #0550ae">$loop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">](</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$mp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #0550ae">$mm</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[],</span> <span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">.</span><span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[])),</span> <span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">$🤡</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$id</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">$🎪</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[],</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$🐘</span><span style="color: #24292f;background-color: #f6f8fa">([</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$🤡</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$🎪</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👍</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👉</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$👎</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #f6f8fa;background-color: #82071e">$👈</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #f6f8fa;background-color: #82071e">$📝</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">]);</span></div></code></pre> </div> <p> この問題は、単に適切なバージョンの PHP で動かせばトークンが得られる。 @@ -260,29 +259,28 @@ なお、brainf*ck プログラムを普通の書き方で書くと、次のようになる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>+ + + + + + + + + + -[ - > + + + - > + + + + + - > + + + + + + + + + + + + - > + + + + + + + + + + - < < < < - -] -> + + + + + . -- - . -> - - - . -> - - - . -- - . -- . -< . -> > - - . -+ + + + + + + . -< - - - - . -< . -> + + . -> - . -< . -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">+ + + + + + + + + + +</div><div class="codeblock-line">[ +</div><div class="codeblock-line"> > + + + +</div><div class="codeblock-line"> > + + + + + +</div><div class="codeblock-line"> > + + + + + + + + + + + + +</div><div class="codeblock-line"> > + + + + + + + + + + +</div><div class="codeblock-line"> < < < < - +</div><div class="codeblock-line">] +</div><div class="codeblock-line">> + + + + + . +</div><div class="codeblock-line">- - . +</div><div class="codeblock-line">> - - - . +</div><div class="codeblock-line">> - - - . +</div><div class="codeblock-line">- - . +</div><div class="codeblock-line">- . +</div><div class="codeblock-line">< . +</div><div class="codeblock-line">> > - - . +</div><div class="codeblock-line">+ + + + + + + . +</div><div class="codeblock-line">< - - - - . +</div><div class="codeblock-line">< . +</div><div class="codeblock-line">> + + . +</div><div class="codeblock-line">> - . +</div><div class="codeblock-line">< .</div></code></pre> </div> <p> 実行結果はこちら: <a class="url" href="https://ideone.com/22VWmb" rel="noreferrer" target="_blank">https://ideone.com/22VWmb</a> @@ -338,8 +336,7 @@ ソースコードのライセンスを示したこの部分だが、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">https</span><span style="color: #0550ae">://</span><span style="color: #24292f;background-color: #f6f8fa">creativecommons</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">org</span><span style="color: #0550ae">/</span><span style="color: #24292f;background-color: #f6f8fa">publicdomain</span><span style="color: #0550ae">/</span><span style="color: #24292f;background-color: #f6f8fa">zero</span><span style="color: #0550ae">/</span><span style="color: #0550ae">1.0</span><span style="color: #0550ae">/</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">https</span><span style="color: #0550ae">://</span><span style="color: #24292f;background-color: #f6f8fa">creativecommons</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">org</span><span style="color: #0550ae">/</span><span style="color: #24292f;background-color: #f6f8fa">publicdomain</span><span style="color: #0550ae">/</span><span style="color: #24292f;background-color: #f6f8fa">zero</span><span style="color: #0550ae">/</span><span style="color: #0550ae">1.0</span><span style="color: #0550ae">/</span></div></code></pre> </div> <p> 完全に合法な PHP のコードである。 <code>https:</code> 部分はラベル、<code>//</code> 以降は行コメントになっている。 @@ -351,12 +348,11 @@ ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。PHP では、型変換を利用することで任意の整数を作り出すことができる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> -<span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> -<span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> -<span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> -<span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">10</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">.</span><span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> +</div><div class="codeblock-line"><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> +</div><div class="codeblock-line"><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> +</div><div class="codeblock-line"><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">+!</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span> +</div><div class="codeblock-line"><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">10</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">.</span><span style="color: #0550ae">+!!</span><span style="color: #24292f;background-color: #f6f8fa">[]));</span></div></code></pre> </div> <p> <code>[]</code> に <code>!</code> を適用すると <code>true</code> が返ってくる。それに <code>+</code> を適用すると、<code>bool</code> から <code>int</code> ヘの型変換が走り、<code>1</code> が生成される。<code>10</code> はさらにトリッキーだ。まず <code>1</code> と <code>0</code> を作り、<code>.</code> で文字列として結合する (<code>'10'</code>)。これに <code>+</code> を適用すると、<code>string</code> から <code>int</code> への型変換が走り、<code>10</code> が生まれる (コード量に頓着しないなら、<code>1</code> を 10 個足し合わせてももちろん 10 が作れる)。 @@ -394,41 +390,40 @@ <div class="filename"> riddle.php </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #6e7781">/********************************************************* - * This program displays a PHPer token. * - * Guess 'N'. * - * * - * Hints: * - * - N itself has no special meaning, e.g., 42, 8128, * - * it is selected at random. * - * - Each element of $token represents a single letter. * - * - One letter consists of 5x5 cells. * - * - Remember, the output is a complete PHPer token. * - * * - * License: * - * https://creativecommons.org/publicdomain/zero/1.0/ * - *********************************************************/</span> -<span style="color: #cf222e">const</span> <span style="color: #953800">N</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781">/* Change it to your answer. */</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span> <span style="color: #0550ae"><=</span> <span style="color: #953800">N</span> <span style="color: #0550ae">&&</span> <span style="color: #953800">N</span> <span style="color: #0550ae"><=</span> <span style="color: #0550ae">0b11111_11111_11111_11111_11111</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - -<span style="color: #0550ae">$token</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span> - <span style="color: #0550ae">0x14B499C</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">0x0BE34CC</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x01C9C69</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">0x0ECA069</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x01C2449</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x0FDB166</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x01C9C69</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">0x01C1C66</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x0FC1C47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x01C1C66</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">0x10C5858</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1E4E3B8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1A2F2F8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #24292f;background-color: #f6f8fa">];</span> -<span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$token</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #953800">N</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%025b'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">search</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">replace</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'#'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">subject</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">length</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #24292f">{</span><span style="color: #0550ae">$x</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">/*********************************************************</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * This program displays a PHPer token. *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * Guess 'N'. *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * Hints: *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * - N itself has no special meaning, e.g., 42, 8128, *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * it is selected at random. *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * - Each element of $token represents a single letter. *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * - One letter consists of 5x5 cells. *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * - Remember, the output is a complete PHPer token. *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * License: *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> * https://creativecommons.org/publicdomain/zero/1.0/ *</span> +</div><div class="codeblock-line"><span style="color: #6e7781"> *********************************************************/</span> +</div><div class="codeblock-line"><span style="color: #cf222e">const</span> <span style="color: #953800">N</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781">/* Change it to your answer. */</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span> <span style="color: #0550ae"><=</span> <span style="color: #953800">N</span> <span style="color: #0550ae">&&</span> <span style="color: #953800">N</span> <span style="color: #0550ae"><=</span> <span style="color: #0550ae">0b11111_11111_11111_11111_11111</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$token</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x14B499C</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x0BE34CC</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x01C9C69</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x0ECA069</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x01C2449</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x0FDB166</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x01C9C69</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x01C1C66</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x0FC1C47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x01C1C66</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x10C5858</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1E4E3B8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1A2F2F8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"><span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$token</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #953800">N</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%025b'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">search</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">replace</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'#'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">subject</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">length</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #24292f">{</span><span style="color: #0550ae">$x</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> さて、この問題はさきほどのように単純に実行しただけでは、謎のブロックが表示されるだけでトークンは得られない。トークンを得るためには、ソースコードを読み、定数 <code>N</code> を特定する必要がある。 @@ -442,38 +437,33 @@ まずはソースコードを読んでいく。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$token</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span> - <span style="color: #6e7781">// 略</span> -<span style="color: #24292f;background-color: #f6f8fa">];</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$token</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// 略</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">];</span></div></code></pre> </div> <p> 数値からなる <code>$token</code> があり、各要素をループしている。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #953800">N</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #953800">N</span><span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> </div> <p> まずは排他的論理和 (xor) を取り、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%025b'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%025b'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> <p> 二進数に変換して、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">search</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">replace</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'#'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">subject</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">search</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">replace</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'#'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">subject</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> <p> 0 を空白に、1 を <code>#</code> にし、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">length</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">length</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre> </div> <p> 5文字ごとに区切ったあと、改行で結合している。 @@ -511,52 +501,49 @@ <code>N</code> は高々 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span> <span style="color: #0550ae"><=</span> <span style="color: #953800">N</span> <span style="color: #0550ae">&&</span> <span style="color: #953800">N</span> <span style="color: #0550ae"><=</span> <span style="color: #0550ae">0b11111_11111_11111_11111_11111</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span> <span style="color: #0550ae"><=</span> <span style="color: #953800">N</span> <span style="color: #0550ae">&&</span> <span style="color: #953800">N</span> <span style="color: #0550ae"><=</span> <span style="color: #0550ae">0b11111_11111_11111_11111_11111</span><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> <p> なのでブルートフォースしてもよいが、ここではブルートフォースしない方法を紹介する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0x14B499C</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #953800">N</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%025b'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">search</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">replace</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'#'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">subject</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">length</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - -<span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> -<span style="color: #0a3069">" # # </span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> -<span style="color: #0a3069">"#####</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> -<span style="color: #0a3069">" # # </span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> -<span style="color: #0a3069">"#####</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> -<span style="color: #0a3069">" # # "</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0x14B499C</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #953800">N</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%025b'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">search</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">replace</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'#'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">subject</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">length</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #953800">assert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> +</div><div class="codeblock-line"><span style="color: #0a3069">" # # </span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0a3069">"#####</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0a3069">" # # </span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0a3069">"#####</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0a3069">" # # "</span><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> <p> この一連の変換に対する逆変換を考えると、次のようになる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> -<span style="color: #0a3069">" # # </span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> -<span style="color: #0a3069">"#####</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> -<span style="color: #0a3069">" # # </span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> -<span style="color: #0a3069">"#####</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> -<span style="color: #0a3069">" # # "</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">explode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -<span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">search</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'#'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">replace</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">subject</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">bindec</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - -<span style="color: #0550ae">$n</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">0x14B499C</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #cf222e">echo</span> <span style="color: #0a3069">"N = </span><span style="color: #0550ae">$n</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> +</div><div class="codeblock-line"><span style="color: #0a3069">" # # </span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0a3069">"#####</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0a3069">" # # </span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0a3069">"#####</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0a3069">" # # "</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">explode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">search</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'#'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">replace</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">subject</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #953800">bindec</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$n</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">0x14B499C</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">echo</span> <span style="color: #0a3069">"N = </span><span style="color: #0550ae">$n</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> </div> <p> これを実行すると、<code>N</code> が得られる。 @@ -572,43 +559,41 @@ <div class="filename"> toquine.php </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #6e7781">// License: https://creativecommons.org/publicdomain/zero/1.0/</span> -<span style="color: #6e7781">// This is a quine-like program to generate a PHPer token.</span> -<span style="color: #6e7781">// Execute it like this: php toquine.php | php | php | php | ...</span> - -<span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069"><<<'Q' -<?cuc -// Yvprafr: uggcf://perngvirpbzzbaf.bet/choyvpqbznva/mreb/1.0/ -// Guvf vf n dhvar-yvxr cebtenz gb trarengr n CUCre gbxra. -// Rkrphgr vg yvxr guvf: cuc gbdhvar.cuc | cuc | cuc | cuc | ... -%f$f = %f; -$f = fge_ebg13($f); $kf = [ -%f, -]; -$g = ahyy.snyfr; sbe ($v = 0; $v <= vagqvi(__YVAR__-035,6); ++$v) vs (!vffrg($kf[$v])) oernx; ryfr -$g .= vzcybqr("\a", fge_fcyvg(fge_ercynpr(['0','1'], [' ','##'], fcevags(pue(37) . '025o', $kf[$v])), 012)) . "\a\a"; -$jf = neenl_znc(sa($j) => vzcybqr(', ', $j), neenl_puhax(neenl_znc(sa($k) => fcevags('0k' . pue(37) . '07K', $k), $kf), 10)); -cevags($f, $g, fge_ebg13("<<<'Q'\a{$f}\aQ"), vzcybqr(",\a", $jf)); -Q;</span> -<span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_rot13</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #0550ae">$xs</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span> -<span style="color: #0550ae">0x0AFABEA</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F2109F</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x0002800</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F2109F</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x0117041</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1FAD6B5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F295B7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0550ae">0x010FC21</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1FAD6B5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1151151</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x010FC21</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F295B7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1FAD6B5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F295B7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F8C63F</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0550ae">0x1F8C631</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1FAD6B5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x17AD6BD</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x17AD6BD</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F8C63F</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F295B7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #24292f;background-color: #f6f8fa">];</span> -<span style="color: #0550ae">$t</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">null</span><span style="color: #0550ae">.</span><span style="color: #0550ae">false</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span> <span style="color: #0550ae"><=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__LINE__</span><span style="color: #0550ae">-</span><span style="color: #0550ae">035</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">6</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #cf222e">else</span> -<span style="color: #0550ae">$t</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">'##'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">37</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">'025b'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">])),</span> <span style="color: #0550ae">012</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$ws</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">', '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_chunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'0x'</span> <span style="color: #0550ae">.</span> <span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">37</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">'07X'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">10</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -<span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$t</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_rot13</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"<<<'D'</span><span style="color: #0a3069">\n</span><span style="color: #24292f">{</span><span style="color: #0550ae">$s</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">D"</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">",</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$ws</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">// License: https://creativecommons.org/publicdomain/zero/1.0/</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// This is a quine-like program to generate a PHPer token.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// Execute it like this: php toquine.php | php | php | php | ...</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069"><<<'Q'</span> +</div><div class="codeblock-line"><span style="color: #0a3069"><?cuc</span> +</div><div class="codeblock-line"><span style="color: #0a3069">// Yvprafr: uggcf://perngvirpbzzbaf.bet/choyvpqbznva/mreb/1.0/</span> +</div><div class="codeblock-line"><span style="color: #0a3069">// Guvf vf n dhvar-yvxr cebtenz gb trarengr n CUCre gbxra.</span> +</div><div class="codeblock-line"><span style="color: #0a3069">// Rkrphgr vg yvxr guvf: cuc gbdhvar.cuc | cuc | cuc | cuc | ...</span> +</div><div class="codeblock-line"><span style="color: #0a3069">%f$f = %f;</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$f = fge_ebg13($f); $kf = [</span> +</div><div class="codeblock-line"><span style="color: #0a3069">%f,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">];</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$g = ahyy.snyfr; sbe ($v = 0; $v <= vagqvi(__YVAR__-035,6); ++$v) vs (!vffrg($kf[$v])) oernx; ryfr</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$g .= vzcybqr("\a", fge_fcyvg(fge_ercynpr(['0','1'], [' ','##'], fcevags(pue(37) . '025o', $kf[$v])), 012)) . "\a\a";</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$jf = neenl_znc(sa($j) => vzcybqr(', ', $j), neenl_puhax(neenl_znc(sa($k) => fcevags('0k' . pue(37) . '07K', $k), $kf), 10));</span> +</div><div class="codeblock-line"><span style="color: #0a3069">cevags($f, $g, fge_ebg13("<<<'Q'\a{$f}\aQ"), vzcybqr(",\a", $jf));</span> +</div><div class="codeblock-line"><span style="color: #0a3069">Q;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">str_rot13</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #0550ae">$xs</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span> +</div><div class="codeblock-line"><span style="color: #0550ae">0x0AFABEA</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F2109F</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x0002800</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F2109F</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x0117041</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1FAD6B5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F295B7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0550ae">0x010FC21</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1FAD6B5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1151151</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x010FC21</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F295B7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1FAD6B5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F294A7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F295B7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F8C63F</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0550ae">0x1F8C631</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1FAD6B5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x17AD6BD</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x17AD6BD</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F8C63F</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0x1F295B7</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$t</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">null</span><span style="color: #0550ae">.</span><span style="color: #0550ae">false</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span> <span style="color: #0550ae"><=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__LINE__</span><span style="color: #0550ae">-</span><span style="color: #0550ae">035</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">6</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #0550ae">++</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #cf222e">else</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$t</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0a3069">'0'</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">'1'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">' '</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">'##'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">37</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">'025b'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">])),</span> <span style="color: #0550ae">012</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$ws</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">', '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_chunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'0x'</span> <span style="color: #0550ae">.</span> <span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">37</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">'07X'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$xs</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">10</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"><span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$t</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_rot13</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"<<<'D'</span><span style="color: #0a3069">\n</span><span style="color: #24292f">{</span><span style="color: #0550ae">$s</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">D"</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">",</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$ws</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre> </div> <p> コメントにもあるとおり、次のようにして実行すれば答えがでてくる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>php toquine.php | php | php | php | ... -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>php toquine.php | php | php | php | ...</div></code></pre> </div> <p> 実際にはもう少しパイプで繋げなければならない。 diff --git a/services/nuldoc/public/blog/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html b/services/nuldoc/public/blog/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html index e99f28c2..305b6c1c 100644 --- a/services/nuldoc/public/blog/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html +++ b/services/nuldoc/public/blog/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>term-banner: ターミナルにバナーを表示するツールを書いた|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -81,8 +81,7 @@ こんなものを作った。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ term-banner 'Hello, World!' 'こんにちは、' '世界!' -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ term-banner 'Hello, World!' 'こんにちは、' '世界!'</div></code></pre> </div> <p> <img alt="term-banner が動作している様子のスクリーンショット" src="/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/screenshot.png"> diff --git a/services/nuldoc/public/blog/posts/2022-05-01/phperkaigi-2022/index.html b/services/nuldoc/public/blog/posts/2022-05-01/phperkaigi-2022/index.html index bef17e01..21d3c29a 100644 --- a/services/nuldoc/public/blog/posts/2022-05-01/phperkaigi-2022/index.html +++ b/services/nuldoc/public/blog/posts/2022-05-01/phperkaigi-2022/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2022|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2022-08-27/php-conference-okinawa-code-golf/index.html b/services/nuldoc/public/blog/posts/2022-08-27/php-conference-okinawa-code-golf/index.html index 848739b4..08f16b61 100644 --- a/services/nuldoc/public/blog/posts/2022-08-27/php-conference-okinawa-code-golf/index.html +++ b/services/nuldoc/public/blog/posts/2022-08-27/php-conference-okinawa-code-golf/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP カンファレンス沖縄で出題されたコードゴルフの問題を解いてみた|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -144,8 +144,7 @@ 書いたものがこちら: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>[<span style="color: #6e7781"><?php</span> <span style="color: #0550ae">$n</span><span style="color: #0550ae">=</span><span style="color: #0550ae">$argv</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span><span style="color: #cf222e">foreach</span><span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e4</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">500</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">50</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">10</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">as</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #cf222e">for</span><span style="color: #24292f;background-color: #f6f8fa">(;</span><span style="color: #0550ae">$n</span><span style="color: #0550ae">>=</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #0550ae">$n</span><span style="color: #0550ae">-=</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">$r</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">=</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">echo</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">', '</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">$r</span><span style="color: #0550ae">??</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span><span style="color: #6e7781">?></span>] -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">[<span style="color: #6e7781"><?php</span> <span style="color: #0550ae">$n</span><span style="color: #0550ae">=</span><span style="color: #0550ae">$argv</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span><span style="color: #cf222e">foreach</span><span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e4</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">500</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">50</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">10</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">as</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #cf222e">for</span><span style="color: #24292f;background-color: #f6f8fa">(;</span><span style="color: #0550ae">$n</span><span style="color: #0550ae">>=</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #0550ae">$n</span><span style="color: #0550ae">-=</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">$r</span><span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #0550ae">=</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">echo</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">', '</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">$r</span><span style="color: #0550ae">??</span><span style="color: #24292f;background-color: #f6f8fa">[]);</span><span style="color: #6e7781">?></span>]</div></code></pre> </div> <p> しめて 123 バイトとなった (末尾改行を含めずにカウント)。 @@ -154,16 +153,15 @@ こちらは改行とスペースを追加したバージョン: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>[<span style="color: #6e7781"><?php</span> - -<span style="color: #0550ae">$n</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$argv</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span> -<span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e4</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">500</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">10</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(;</span> <span style="color: #0550ae">$n</span> <span style="color: #0550ae">>=</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$n</span> <span style="color: #0550ae">-=</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">$r</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">echo</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">', '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$r</span> <span style="color: #0550ae">??</span> <span style="color: #24292f;background-color: #f6f8fa">[]);</span> - -<span style="color: #6e7781">?></span>] -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">[<span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$n</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$argv</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"><span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e4</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e3</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">500</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">10</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">5</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(;</span> <span style="color: #0550ae">$n</span> <span style="color: #0550ae">>=</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$n</span> <span style="color: #0550ae">-=</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$r</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">echo</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">', '</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$r</span> <span style="color: #0550ae">??</span> <span style="color: #24292f;background-color: #f6f8fa">[]);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">?></span>]</div></code></pre> </div> </section> <section id="section--techniques"> diff --git a/services/nuldoc/public/blog/posts/2022-08-31/support-for-communty-is-employee-benefits/index.html b/services/nuldoc/public/blog/posts/2022-08-31/support-for-communty-is-employee-benefits/index.html index eb7bc81d..534eab4c 100644 --- a/services/nuldoc/public/blog/posts/2022-08-31/support-for-communty-is-employee-benefits/index.html +++ b/services/nuldoc/public/blog/posts/2022-08-31/support-for-communty-is-employee-benefits/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>弊社の PHP Foundation への寄付に寄せて|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html b/services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html index f55ad018..3eceaa68 100644 --- a/services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html +++ b/services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【PHP】 fizzbuzz を書く。1行あたり2文字で。|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -158,81 +158,80 @@ 特に、C言語でこのような試みをおこなったことがあるかたならそう思うだろう。事実、Cでのこの制約はほとんど無意味に等しい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">#\ -i\ -n\ -c\ -l\ -u\ -d\ -e\ -<\ -s\ -t\ -d\ -i\ -o\ -.\ -h\ ->\ -</span><span style="color: #6e7781">/* -*/</span><span style="color: #6e7781"> -</span><span style="color: #24292f;background-color: #f6f8fa">i</span>\ -<span style="color: #24292f;background-color: #f6f8fa">n</span>\ -<span style="color: #24292f;background-color: #f6f8fa">t</span>\ -<span style="color: #6e7781">/* -*/</span> -<span style="color: #24292f;background-color: #f6f8fa">m</span>\ -<span style="color: #24292f;background-color: #f6f8fa">a</span>\ -<span style="color: #24292f;background-color: #f6f8fa">i</span>\ -<span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">(</span> -<span style="color: #24292f;background-color: #f6f8fa">){</span> -<span style="color: #24292f;background-color: #f6f8fa">f</span>\ -<span style="color: #24292f;background-color: #f6f8fa">o</span>\ -<span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">(</span> -<span style="color: #24292f;background-color: #f6f8fa">i</span>\ -<span style="color: #24292f;background-color: #f6f8fa">n</span>\ -<span style="color: #24292f;background-color: #f6f8fa">t</span>\ -<span style="color: #6e7781">/* -*/</span> -<span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">=</span> -<span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae"><</span> -<span style="color: #0550ae">1</span>\ -<span style="color: #0550ae">0</span>\ -<span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">i</span>\ -<span style="color: #0550ae">+</span>\ -<span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #cf222e">if</span> -<span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> -<span style="color: #0550ae">%</span>\ -<span style="color: #0550ae">15</span> -<span style="color: #0550ae">==</span> -<span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">p</span>\ -<span style="color: #24292f;background-color: #f6f8fa">r</span>\ -<span style="color: #24292f;background-color: #f6f8fa">i</span>\ -<span style="color: #24292f;background-color: #f6f8fa">n</span>\ -<span style="color: #24292f;background-color: #f6f8fa">t</span>\ -<span style="color: #24292f;background-color: #f6f8fa">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span> -<span style="color: #0a3069">"\ -F\ -i\ -z\ -z\ -B\ -u\ -z\ -z\ -%\ -c\ -"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0550ae">10</span> -<span style="color: #24292f;background-color: #f6f8fa">);</span> - -<span style="color: #6e7781">/* あとは同じように普通のプログラムを変形するだけなので省略 */</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">#\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">i\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">n\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">c\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">l\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">u\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">d\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">e\</span> +</div><div class="codeblock-line"><span style="color: #6e7781"><\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">s\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">t\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">d\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">i\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">o\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">.\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">h\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">>\</span> +</div><div class="codeblock-line"><span style="color: #6e7781">/*</span> +</div><div class="codeblock-line"><span style="color: #6e7781">*/</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">i</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">n</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">t</span>\ +</div><div class="codeblock-line"><span style="color: #6e7781">/*</span> +</div><div class="codeblock-line"><span style="color: #6e7781">*/</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">m</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">a</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">i</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">){</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">f</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">o</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">i</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">n</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">t</span>\ +</div><div class="codeblock-line"><span style="color: #6e7781">/*</span> +</div><div class="codeblock-line"><span style="color: #6e7781">*/</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">=</span> +</div><div class="codeblock-line"><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae"><</span> +</div><div class="codeblock-line"><span style="color: #0550ae">1</span>\ +</div><div class="codeblock-line"><span style="color: #0550ae">0</span>\ +</div><div class="codeblock-line"><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">i</span>\ +</div><div class="codeblock-line"><span style="color: #0550ae">+</span>\ +</div><div class="codeblock-line"><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> +</div><div class="codeblock-line"><span style="color: #0550ae">%</span>\ +</div><div class="codeblock-line"><span style="color: #0550ae">15</span> +</div><div class="codeblock-line"><span style="color: #0550ae">==</span> +</div><div class="codeblock-line"><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">p</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">r</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">i</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">n</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">t</span>\ +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"><span style="color: #0a3069">"\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">F\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">i\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">z\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">z\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">B\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">u\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">z\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">z\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">%\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">c\</span> +</div><div class="codeblock-line"><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0550ae">10</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">/* あとは同じように普通のプログラムを変形するだけなので省略 */</span></div></code></pre> </div> <p> バックスラッシュを使った行継続がトークンを区切らない、というのがポイントだ。 @@ -274,11 +273,10 @@ c\ また、2文字だと文字列がまともに書けないのも辛い。<code>''</code> だけで2文字使うので、「1文字の文字列リテラル」というものを書くことができない。PHP では文字列リテラル中に生の改行が書けるので </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$a</span> -<span style="color: #0550ae">=</span><span style="color: #0a3069">' -a'</span> -<span style="color: #24292f;background-color: #f6f8fa">;;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$a</span> +</div><div class="codeblock-line"><span style="color: #0550ae">=</span><span style="color: #0a3069">'</span> +</div><div class="codeblock-line"><span style="color: #0a3069">a'</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">;;</span></div></code></pre> </div> <p> とすると <code>$a</code> は <code>"\na"</code> になるのだが、余計な改行が入ってしまう。 @@ -295,12 +293,11 @@ a'</span> まずは普通に書くとしよう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">echo</span> <span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Fizz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Buzz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">?:</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Fizz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Buzz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">?:</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 素直に書いた fizzbuzz とは言い難いが、このくらいは普通だということにしておかないと、この先がやっていられないので許してほしい。 @@ -312,15 +309,14 @@ a'</span> <code>for</code> は、3文字もある長いキーワードである。こんなものは使えない。<code>array_</code> 系の関数を使って、適当に置き換えるとしよう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #953800">array_walk</span><span style="color: #24292f;background-color: #f6f8fa">(</span> -<span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> -<span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(((</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Fizz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Buzz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">?:</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">),</span> -<span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #953800">array_walk</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> +</div><div class="codeblock-line"><span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(((</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Fizz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Buzz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">?:</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> <p> <code>array_walk</code> や <code>range</code>、<code>printf</code> といった <code>for</code> よりも長いトークンが現れてしまったが、これは次節で直すことにする。なお、<code>echo</code> は文 (statement) であり式 (expression) ではないので、式である <code>printf</code> に置き換えた。 @@ -332,19 +328,18 @@ a'</span> <code>range</code>、<code>array_walk</code>、<code>printf</code> は長すぎるのでどうにかせねばならない。ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #0550ae">$r</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'range'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$w</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'array_walk'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$p</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'printf'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$r</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">(</span> -<span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> -<span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">(((</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Fizz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Buzz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">?:</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">),</span> -<span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$r</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'range'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$w</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'array_walk'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$p</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'printf'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$r</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> +</div><div class="codeblock-line"><span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">(((</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Fizz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Buzz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">?:</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> <p> これで関数を呼び出している所は短くなった。では、<code>$r</code> や <code>$w</code> や <code>$p</code>、また <code>'Fizz'</code> や <code>'Buzz'</code> はどうやって 1 行 2 文字に収めるのか。次のテクニックへ移ろう。 @@ -366,28 +361,26 @@ a'</span> というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という PHP 7.x までの仕様が利用できる。例えば、 <code>Fizz</code> という文字列が欲しければ、次のようにする。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$f</span> -<span style="color: #0550ae">=</span><span style="color: #953800">F</span> -<span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">i</span> -<span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">z</span> -<span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">z</span> -<span style="color: #24292f;background-color: #f6f8fa">;;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$f</span> +</div><div class="codeblock-line"><span style="color: #0550ae">=</span><span style="color: #953800">F</span> +</div><div class="codeblock-line"><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">i</span> +</div><div class="codeblock-line"><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">z</span> +</div><div class="codeblock-line"><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">z</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">;;</span></div></code></pre> </div> <p> こうして簡単に文字列を作れる。なお、この仕様は 7.x 時点でも警告を受けるので、<code>@</code> 演算子を使って抑制してやるとよい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$f</span> -<span style="color: #0550ae">=@</span> -<span style="color: #953800">F</span><span style="color: #0550ae">.</span> -<span style="color: #0550ae">@</span><span style="color: #24292f;background-color: #f6f8fa">i</span> -<span style="color: #0550ae">.</span><span style="color: #6e7781"># -@z</span> -<span style="color: #0550ae">.</span><span style="color: #6e7781"># -@z</span> -<span style="color: #24292f;background-color: #f6f8fa">;;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$f</span> +</div><div class="codeblock-line"><span style="color: #0550ae">=@</span> +</div><div class="codeblock-line"><span style="color: #953800">F</span><span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0550ae">@</span><span style="color: #24292f;background-color: #f6f8fa">i</span> +</div><div class="codeblock-line"><span style="color: #0550ae">.</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">@z</span> +</div><div class="codeblock-line"><span style="color: #0550ae">.</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">@z</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">;;</span></div></code></pre> </div> <p> むしろ、このことがわかっていたからこそ PHP 8.x での動作を要件に課したところがある。 @@ -402,70 +395,66 @@ a'</span> ずばり、文字列同士のビット演算を使う。PHP では、文字列同士でビット演算 (<code>&</code>、<code>|</code>、<code>^</code>) をした場合、文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$a</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"12345"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"world"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #6e7781">// $a ^ $b は次のコードと同じ</span> -<span style="color: #0550ae">$result</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #953800">min</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$a</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">));</span> <span style="color: #0550ae">$i</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -<span style="color: #0550ae">$result</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #0550ae">$a</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">];</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">echo</span> <span style="color: #0550ae">$result</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #6e7781">// => F]AXQ</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$a</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"12345"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"world"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">// $a ^ $b は次のコードと同じ</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$result</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #953800">min</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$a</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">));</span> <span style="color: #0550ae">$i</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$result</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #0550ae">$a</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">echo</span> <span style="color: #0550ae">$result</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// => F]AXQ</span></div></code></pre> </div> <p> これを踏まえ、次のコードを見てみよう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"x</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">Om</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">k!</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">o"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$r</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0550ae">$r</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"x</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">Om</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">k!</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">o"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$r</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0550ae">$r</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> </div> <p> 実行すると、<code>range</code> が表示される。さて、PHP では文字列リテラル中に生の改行を直接書いてもよいのだった (「主な障害」の節を参照のこと)。書きかえてみよう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> -<span style="color: #0550ae">=</span><span style="color: #0a3069">'x -Om -'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$y</span> -<span style="color: #0550ae">=</span><span style="color: #0a3069">' -k! -o'</span> -<span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #0550ae">$r</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0550ae">$r</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$x</span> +</div><div class="codeblock-line"><span style="color: #0550ae">=</span><span style="color: #0a3069">'x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">Om</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$y</span> +</div><div class="codeblock-line"><span style="color: #0550ae">=</span><span style="color: #0a3069">'</span> +</div><div class="codeblock-line"><span style="color: #0a3069">k!</span> +</div><div class="codeblock-line"><span style="color: #0a3069">o'</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$r</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0550ae">$r</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> </div> <p> さらに <code>#</code> を使って適当に調整すると、次のようになる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> -<span style="color: #0550ae">=</span><span style="color: #6e7781"># -'x</span> -<span style="color: #953800">Om</span> -<span style="color: #0a3069">'; -$y -='</span> -<span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">!</span> -<span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #f6f8fa;background-color: #82071e">'</span> -<span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #6e7781"># -$r</span> -<span style="color: #0550ae">=</span><span style="color: #6e7781"># -$x</span> -<span style="color: #0550ae">^</span><span style="color: #6e7781"># -$y</span> -<span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #6e7781"># -</span> -<span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0550ae">$r</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$x</span> +</div><div class="codeblock-line"><span style="color: #0550ae">=</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">'x</span> +</div><div class="codeblock-line"><span style="color: #953800">Om</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">='</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">!</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #f6f8fa;background-color: #82071e">'</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">$r</span> +</div><div class="codeblock-line"><span style="color: #0550ae">=</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">$x</span> +</div><div class="codeblock-line"><span style="color: #0550ae">^</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">$y</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0550ae">$r</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> </div> <p> 1行あたり2文字で、<code>range</code> という文字列を生成することに成功した。他の必要な文字列にも、同様の処理をほどこす。 @@ -481,156 +470,155 @@ $y</span> 完成したものがこちら。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #0550ae">$x</span> -<span style="color: #0550ae">=</span><span style="color: #6e7781"># -'i</span> -<span style="color: #953800">S</span><span style="color: #0a3069">' -;; -$y -='</span> -<span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #0550ae">!</span> -<span style="color: #0a3069">'; -$c -=# -$x -^# -$y -;# -$x -=# -'</span><span style="color: #24292f;background-color: #f6f8fa">x</span> -<span style="color: #953800">Om</span> -<span style="color: #0a3069">'; -$y -='</span> -<span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">!</span> -<span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #0a3069">' -;# -$r -=# -$x -^# -$y -;# -$x -=# -'</span><span style="color: #24292f;background-color: #f6f8fa">k</span> -<span style="color: #953800">Sk</span> -<span style="color: #0550ae">~</span><span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #953800">Ma</span> -<span style="color: #0a3069">'; -$y -='</span> -<span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">!</span> -<span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">!</span> -<span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">!</span> -<span style="color: #0a3069">'; -$w -=# -$x -^# -$y -;# -$x -=# -'</span><span style="color: #24292f;background-color: #f6f8fa">z</span> -<span style="color: #953800">Hd</span> -<span style="color: #953800">G</span><span style="color: #0a3069">' -;# -$y -='</span> -<span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">!</span> -<span style="color: #0550ae">~!</span> -<span style="color: #0a3069">'; -$p -=# -$x -^# -$y -;# -$x -=# -'</span><span style="color: #953800">L</span> -<span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">p</span> -<span style="color: #0a3069">'; -$y -='</span> -<span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">!</span> -<span style="color: #0a3069">'; -$f -=# -$x -^# -$y -;# -$x -=# -'</span><span style="color: #953800">H</span> -<span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">p</span> -<span style="color: #0a3069">'; -$y -='</span> -<span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #0550ae">!</span> -<span style="color: #0a3069">'; -$b -=# -$x -^# -$y -;# -$b -[1 -]= -$c -(# -13 -*9 -); -$s -=# -$r -(1 -,( -10 -** -2) -); -$w -(# -$s -,# -fn -(# -$i -)# -=> -$p -(( -(# -$i -%3 -?# -'' -:# -$f -). -(# -$i -%5 -?# -'' -:# -$b -)? -:# -$i -)# -.'</span> -<span style="color: #f6f8fa;background-color: #82071e">'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$x</span> +</div><div class="codeblock-line"><span style="color: #0550ae">=</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">'i</span> +</div><div class="codeblock-line"><span style="color: #953800">S</span><span style="color: #0a3069">'</span> +</div><div class="codeblock-line"><span style="color: #0a3069">;;</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">='</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #0550ae">!</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$c</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">^#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">;#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">x</span> +</div><div class="codeblock-line"><span style="color: #953800">Om</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">='</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">!</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #0a3069">'</span> +</div><div class="codeblock-line"><span style="color: #0a3069">;#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$r</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">^#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">;#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">k</span> +</div><div class="codeblock-line"><span style="color: #953800">Sk</span> +</div><div class="codeblock-line"><span style="color: #0550ae">~</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #953800">Ma</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">='</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">!</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">!</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">!</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$w</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">^#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">;#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">z</span> +</div><div class="codeblock-line"><span style="color: #953800">Hd</span> +</div><div class="codeblock-line"><span style="color: #953800">G</span><span style="color: #0a3069">'</span> +</div><div class="codeblock-line"><span style="color: #0a3069">;#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">='</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">!</span> +</div><div class="codeblock-line"><span style="color: #0550ae">~!</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$p</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">^#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">;#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'</span><span style="color: #953800">L</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">p</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">='</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">!</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$f</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">^#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">;#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'</span><span style="color: #953800">H</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">p</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">='</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #0550ae">!</span> +</div><div class="codeblock-line"><span style="color: #0a3069">';</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$b</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$x</span> +</div><div class="codeblock-line"><span style="color: #0a3069">^#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$y</span> +</div><div class="codeblock-line"><span style="color: #0a3069">;#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$b</span> +</div><div class="codeblock-line"><span style="color: #0a3069">[1</span> +</div><div class="codeblock-line"><span style="color: #0a3069">]=</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$c</span> +</div><div class="codeblock-line"><span style="color: #0a3069">(#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">13</span> +</div><div class="codeblock-line"><span style="color: #0a3069">*9</span> +</div><div class="codeblock-line"><span style="color: #0a3069">);</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$s</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$r</span> +</div><div class="codeblock-line"><span style="color: #0a3069">(1</span> +</div><div class="codeblock-line"><span style="color: #0a3069">,(</span> +</div><div class="codeblock-line"><span style="color: #0a3069">10</span> +</div><div class="codeblock-line"><span style="color: #0a3069">**</span> +</div><div class="codeblock-line"><span style="color: #0a3069">2)</span> +</div><div class="codeblock-line"><span style="color: #0a3069">);</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$w</span> +</div><div class="codeblock-line"><span style="color: #0a3069">(#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$s</span> +</div><div class="codeblock-line"><span style="color: #0a3069">,#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">fn</span> +</div><div class="codeblock-line"><span style="color: #0a3069">(#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$i</span> +</div><div class="codeblock-line"><span style="color: #0a3069">)#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">=></span> +</div><div class="codeblock-line"><span style="color: #0a3069">$p</span> +</div><div class="codeblock-line"><span style="color: #0a3069">((</span> +</div><div class="codeblock-line"><span style="color: #0a3069">(#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$i</span> +</div><div class="codeblock-line"><span style="color: #0a3069">%3</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">''</span> +</div><div class="codeblock-line"><span style="color: #0a3069">:#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$f</span> +</div><div class="codeblock-line"><span style="color: #0a3069">).</span> +</div><div class="codeblock-line"><span style="color: #0a3069">(#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$i</span> +</div><div class="codeblock-line"><span style="color: #0a3069">%5</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">''</span> +</div><div class="codeblock-line"><span style="color: #0a3069">:#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$b</span> +</div><div class="codeblock-line"><span style="color: #0a3069">)?</span> +</div><div class="codeblock-line"><span style="color: #0a3069">:#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$i</span> +</div><div class="codeblock-line"><span style="color: #0a3069">)#</span> +</div><div class="codeblock-line"><span style="color: #0a3069">.'</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> </section> <section id="section--outro"> @@ -648,19 +636,18 @@ $i PHP では、バッククォートを使ってシェルを呼び出せる。これは <code>shell_exec</code> 関数と等価である。さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">`</span> -<span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #24292f;background-color: #f6f8fa">h</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #0550ae">1</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #0550ae">2</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #0550ae">3</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #f6f8fa;background-color: #82071e">`</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">`</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">h</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #0550ae">1</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #0550ae">2</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #0550ae">3</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">`</span><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> <p> なお、ここでは簡単のため出力に <code>printf</code> をそのまま使っているが、実際には <code>printf</code> という文字列を合成して可変関数で呼び出す。 @@ -682,59 +669,56 @@ $i もうこれ以上は不可能だと思っていたのだが、この記事の執筆中に解決する方法を思いついたので載せておく。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #0550ae">$c</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'chr'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #f6f8fa;background-color: #82071e">$</span><span style="color: #24292f;background-color: #f6f8fa">{</span> -<span style="color: #0a3069">'_ -'</span><span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #0550ae">=</span><span style="color: #6e7781"># -$c</span> -<span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #6e7781"># -32</span> -<span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span> -<span style="color: #0550ae">$c</span> -<span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #6e7781"># -92</span> -<span style="color: #24292f;background-color: #f6f8fa">);</span> - -<span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">`</span> -<span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #24292f;background-color: #f6f8fa">h</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #f6f8fa;background-color: #82071e">$</span><span style="color: #24292f;background-color: #f6f8fa">{</span> -<span style="color: #0a3069">'_ -'</span><span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #0550ae">1</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #0550ae">2</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #0550ae">3</span><span style="color: #f6f8fa;background-color: #82071e">\</span> -<span style="color: #f6f8fa;background-color: #82071e">`</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$c</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'chr'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$</span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'_</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #0550ae">=</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">$c</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">32</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$c</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">92</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">`</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">h</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">$</span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'_</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #0550ae">1</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #0550ae">2</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #0550ae">3</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +</div><div class="codeblock-line"><span style="color: #f6f8fa;background-color: #82071e">`</span><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> <p> 先程と同じく、<code>chr</code> や <code>printf</code> を生成する部分は長くなるので省いた。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>${ -'_ -'} -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">${ +</div><div class="codeblock-line">'_ +</div><div class="codeblock-line">'}</div></code></pre> </div> <p> は変数で、中にはスペースとエスケープが入っている (<code>chr(32) . chr(92)</code>)。シェルに渡されている文字列は次のようになる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>e\ -c\ -h\ -o\ -\ -1\ -2\ -3\ -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">e\ +</div><div class="codeblock-line">c\ +</div><div class="codeblock-line">h\ +</div><div class="codeblock-line">o\ +</div><div class="codeblock-line">\ +</div><div class="codeblock-line">1\ +</div><div class="codeblock-line">2\ +</div><div class="codeblock-line">3\</div></code></pre> </div> <p> これは、前掲したコマンドと同じだ。かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。Fizzbuzz のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう (試してないけど)。 @@ -746,10 +730,9 @@ o\ ちなみに、PHP 8.2 からは、この記法で Warning が出るようになるようだ。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>${ -'_ -'} -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">${ +</div><div class="codeblock-line">'_ +</div><div class="codeblock-line">'}</div></code></pre> </div> <p> 最新版で警告が出るというのも美しくないので、私としては本編の解法を推す。 diff --git a/services/nuldoc/public/blog/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html b/services/nuldoc/public/blog/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html index 62a903dd..e57d15ce 100644 --- a/services/nuldoc/public/blog/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html +++ b/services/nuldoc/public/blog/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2023: ボツになったトークン問題 その 1|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -102,28 +102,27 @@ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$argv</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">??</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">exit</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'No input.'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #953800">is_numeric</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">exit</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'Invalid input.'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)));</span> - -<span style="color: #953800">preg_match</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'/(\x23.+?) /'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$t</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">??</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - -<span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">md5</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$t</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0a3069">'056e831a4146bf123e8ea16613303d2e'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"Token: </span><span style="color: #24292f">{</span><span style="color: #0550ae">$t</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"Failed.</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$argv</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">??</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">exit</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'No input.'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #953800">is_numeric</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">exit</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'Invalid input.'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)));</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #953800">preg_match</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'/(\x23.+?) /'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$t</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">??</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">md5</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$t</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0a3069">'056e831a4146bf123e8ea16613303d2e'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"Token: </span><span style="color: #24292f">{</span><span style="color: #0550ae">$t</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"Failed.</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> </section> <section id="section--how-to-obtain-token"> @@ -132,17 +131,15 @@ ソースを見るとわかるとおり、<code>$argv[1]</code> を参照している。それを <code>$π</code> なる変数に代入しているので、円周率を渡してみる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>php Q.php 3.14 -<span style="color: #24292f;background-color: #f6f8fa">Failed.</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>php Q.php 3.14 +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">Failed.</span></div></code></pre> </div> <p> 失敗してしまった。精度を上げてみる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>php Q.php 3.1415 -<span style="color: #24292f;background-color: #f6f8fa">Failed.</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>php Q.php 3.1415 +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">Failed.</span></div></code></pre> </div> <p> だめだった。これを成功するまで繰り返す。 @@ -151,9 +148,8 @@ 最初にトークンが得られるのは、小数点以下 16 桁目まで入力したときで、こうなる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>php Q.php 3.1415926535897932 -<span style="color: #24292f;background-color: #f6f8fa">Token: #</span>YO -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>php Q.php 3.1415926535897932 +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">Token: #</span>YO</div></code></pre> </div> <p> めでたくトークン「<code>#YO</code>」が手に入った。 @@ -165,22 +161,20 @@ 短いので頭から追っていく。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$argv</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">??</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">exit</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'No input.'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #953800">is_numeric</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">exit</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'Invalid input.'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$argv</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">??</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">exit</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'No input.'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #953800">is_numeric</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">exit</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'Invalid input.'</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 入力のバリデーション部分。数値のみ受け付ける。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)));</span></div></code></pre> </div> <p> <code>$π</code> を 2 文字ごとに区切り (<code>str_split</code>)、数値を ASCII コードと見做して文字に変換 (<code>chr</code>) して結合 (<code>implode</code>) している。 @@ -189,16 +183,14 @@ 例えば、<code>$π</code> が <code>'656667'</code> だったとすると、<code>65</code>、<code>66</code>、<code>67</code> に対応した <code>'A'</code>、<code>'B'</code>、<code>'C'</code> へと変換され、<code>'ABC'</code> になる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'656667'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)));</span> -<span style="color: #cf222e">echo</span> <span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #6e7781">// => ABC</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$π</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'656667'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$π</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)));</span> +</div><div class="codeblock-line"><span style="color: #cf222e">echo</span> <span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// => ABC</span></div></code></pre> </div> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #953800">preg_match</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'/(\x23.+?) /'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$t</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">??</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #953800">preg_match</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'/(\x23.+?) /'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$t</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">??</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> </div> <p> 正規表現でマッチングしている。<code>\x23</code> は <code>#</code> と同じであることに留意すると、この正規表現は「<code>#</code> から始まる 2 以上の長さ (含 <code>#</code>) の文字列で、最初に現れるスペースまで」にマッチする。つまりこれは、PHPerKaigi におけるトークンである。 @@ -207,12 +199,11 @@ なお、<code>#</code> を直接書いていないのは、<code>/#.+?) /</code> と書くと、<code>#.+?)</code> という意図せぬトークンが登録されてしまうからである。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">md5</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$t</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0a3069">'056e831a4146bf123e8ea16613303d2e'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"Token: </span><span style="color: #24292f">{</span><span style="color: #0550ae">$t</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"Failed.</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">md5</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$t</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0a3069">'056e831a4146bf123e8ea16613303d2e'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"Token: </span><span style="color: #24292f">{</span><span style="color: #0550ae">$t</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"Failed.</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 最後にトークンのハッシュ値を見て、想定解かどうかを確認する。 diff --git a/services/nuldoc/public/blog/posts/2022-10-28/setup-server-for-this-site/index.html b/services/nuldoc/public/blog/posts/2022-10-28/setup-server-for-this-site/index.html index 0b079332..9c50825d 100644 --- a/services/nuldoc/public/blog/posts/2022-10-28/setup-server-for-this-site/index.html +++ b/services/nuldoc/public/blog/posts/2022-10-28/setup-server-for-this-site/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【備忘録】 このサイト用の VPS をセットアップしたときのメモ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -176,9 +176,8 @@ ローカルマシンで鍵を生成する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh-keygen <span style="color: #116329">-t</span> ed25519 <span style="color: #116329">-b</span> 521 <span style="color: #116329">-f</span> ~/.ssh/teika.key -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh-keygen <span style="color: #116329">-t</span> ed25519 <span style="color: #116329">-b</span> 521 <span style="color: #116329">-f</span> ~/.ssh/github2teika.key -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh-keygen <span style="color: #116329">-t</span> ed25519 <span style="color: #116329">-b</span> 521 <span style="color: #116329">-f</span> ~/.ssh/teika.key +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh-keygen <span style="color: #116329">-t</span> ed25519 <span style="color: #116329">-b</span> 521 <span style="color: #116329">-f</span> ~/.ssh/github2teika.key</div></code></pre> </div> <p> <code>teika.key</code> はローカルからサーバへの接続用、<code>github2teika.key</code> は、GitHub Actions からサーバへのデプロイ用。 @@ -190,13 +189,12 @@ <code>.ssh/config</code> に設定しておく。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>Host teika - HostName ********** - User ********** - Port ********** - IdentityFile ~/.ssh/teika.key - IdentitiesOnly yes -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">Host teika +</div><div class="codeblock-line"> HostName ********** +</div><div class="codeblock-line"> User ********** +</div><div class="codeblock-line"> Port ********** +</div><div class="codeblock-line"> IdentityFile ~/.ssh/teika.key +</div><div class="codeblock-line"> IdentitiesOnly yes</div></code></pre> </div> </section> </section> @@ -214,27 +212,24 @@ 管理者ユーザで作業すると危ないので、メインで使うユーザを作成する。<code>sudo</code> グループに追加して <code>sudo</code> できるようにし、<code>su</code> で切り替え。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>adduser <span style="color: #cf222e">**********</span> -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>adduser <span style="color: #cf222e">**********</span> <span style="color: #953800">sudo</span> -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>su <span style="color: #cf222e">**********</span> -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">cd</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>adduser <span style="color: #cf222e">**********</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>adduser <span style="color: #cf222e">**********</span> <span style="color: #953800">sudo</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>su <span style="color: #cf222e">**********</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">cd</span></div></code></pre> </div> </section> <section id="section--basic-setup--hostname"> <h3><a href="#section--basic-setup--hostname">ホスト名を変える</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo hostname </span>teika -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo hostname </span>teika</div></code></pre> </div> </section> <section id="section--basic-setup--public-key"> <h3><a href="#section--basic-setup--public-key">公開鍵を置く</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">mkdir</span> ~/.ssh -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">chmod </span>700 ~/.ssh -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>vi ~/.ssh/authorized_keys -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">mkdir</span> ~/.ssh +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">chmod </span>700 ~/.ssh +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>vi ~/.ssh/authorized_keys</div></code></pre> </div> <p> <code>authorized_keys</code> には、ローカルで生成した <code>~/.ssh/teika.key.pub</code> と <code>~/.ssh/github2teika.key.pub</code> の内容をコピーする。 @@ -246,9 +241,8 @@ SSH の設定を変更し、少しでも安全にしておく。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo cp</span> /etc/ssh/sshd_config /etc/ssh/sshd_config.bak -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>vi /etc/ssh/sshd_config -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo cp</span> /etc/ssh/sshd_config /etc/ssh/sshd_config.bak +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>vi /etc/ssh/sshd_config</div></code></pre> </div> <ul> <li> @@ -265,9 +259,8 @@ そして設定を反映。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>systemctl restart sshd -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>systemctl status sshd -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>systemctl restart sshd +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>systemctl status sshd</div></code></pre> </div> </section> <section id="section--basic-setup--ssh-connect"> @@ -276,8 +269,7 @@ 今の SSH セッションは閉じずに、ターミナルを別途開いて疎通確認する。セッションを閉じてしまうと、SSH の設定に不備があった場合に締め出しをくらう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh teika -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh teika</div></code></pre> </div> </section> <section id="section--basic-setup--close-ports"> @@ -286,12 +278,11 @@ デフォルトの 22 番を閉じ、設定したポートだけ空ける。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw deny ssh -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw allow <span style="color: #cf222e">*******</span> -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw <span style="color: #953800">enable</span> -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw reload -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw status -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw deny ssh +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw allow <span style="color: #cf222e">*******</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw <span style="color: #953800">enable</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw reload +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw status</div></code></pre> </div> <p> ここでもう一度 SSH の接続確認を挟む。 @@ -303,46 +294,41 @@ GitHub に置いてある private リポジトリをサーバから clone したいので、SSH 鍵を生成して置いておく。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh-keygen <span style="color: #116329">-t</span> ed25519 <span style="color: #116329">-b</span> 521 <span style="color: #116329">-f</span> ~/.ssh/github.key -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">cat</span> ~/.ssh/github.key.pub -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh-keygen <span style="color: #116329">-t</span> ed25519 <span style="color: #116329">-b</span> 521 <span style="color: #116329">-f</span> ~/.ssh/github.key +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">cat</span> ~/.ssh/github.key.pub</div></code></pre> </div> <p> <a href="https://github.com/settings/ssh" rel="noreferrer" target="_blank">GitHub の設定画面</a> から、この公開鍵を追加する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>vi ~/.ssh/config -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>vi ~/.ssh/config</div></code></pre> </div> <p> 設定はこう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>Host github.com - HostName github.com - User git - Port 22 - IdentityFile ~/.ssh/github.key - IdentitiesOnly yes -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">Host github.com +</div><div class="codeblock-line"> HostName github.com +</div><div class="codeblock-line"> User git +</div><div class="codeblock-line"> Port 22 +</div><div class="codeblock-line"> IdentityFile ~/.ssh/github.key +</div><div class="codeblock-line"> IdentitiesOnly yes</div></code></pre> </div> <p> 最後に接続できるか確認しておく。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh <span style="color: #116329">-T</span> github.com -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ssh <span style="color: #116329">-T</span> github.com</div></code></pre> </div> </section> <section id="section--basic-setup--upgrade-packages"> <h3><a href="#section--basic-setup--upgrade-packages">パッケージの更新</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt update -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt upgrade -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt update -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt upgrade -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt autoremove -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt update +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt upgrade +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt update +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt upgrade +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt autoremove</div></code></pre> </div> </section> </section> @@ -357,15 +343,13 @@ <section id="section--site-hosting-setup--install-softwares"> <h3><a href="#section--site-hosting-setup--install-softwares">使うソフトウェアのインストール</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt <span style="color: #953800">install </span>docker docker-compose git make -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>apt <span style="color: #953800">install </span>docker docker-compose git make</div></code></pre> </div> </section> <section id="section--site-hosting-setup--docker"> <h3><a href="#section--site-hosting-setup--docker">メインユーザが Docker を使えるように</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>adduser <span style="color: #cf222e">**********</span> docker -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>adduser <span style="color: #cf222e">**********</span> docker</div></code></pre> </div> </section> <section id="section--site-hosting-setup--open-http-ports"> @@ -374,36 +358,32 @@ 80 番と 443 番を空ける。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw allow 80/tcp -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw allow 443/tcp -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw reload -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw status -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw allow 80/tcp +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw allow 443/tcp +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw reload +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">sudo </span>ufw status</div></code></pre> </div> </section> <section id="section--site-hosting-setup--clone-repositories"> <h3><a href="#section--site-hosting-setup--clone-repositories">リポジトリのクローン</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">cd</span> -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>git clone git@github.com:nsfisis/nsfisis.dev.git -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">cd </span>nsfisis.dev -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>git submodule update <span style="color: #116329">--init</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">cd</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>git clone git@github.com:nsfisis/nsfisis.dev.git +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #953800">cd </span>nsfisis.dev +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>git submodule update <span style="color: #116329">--init</span></div></code></pre> </div> </section> <section id="section--site-hosting-setup--certbot"> <h3><a href="#section--site-hosting-setup--certbot">certbot で証明書取得</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>docker-compose up <span style="color: #116329">-d</span> acme-challenge -<span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>make setup -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>docker-compose up <span style="color: #116329">-d</span> acme-challenge +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>make setup</div></code></pre> </div> </section> <section id="section--site-hosting-setup--run-server"> <h3><a href="#section--site-hosting-setup--run-server">サーバを稼動させる</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>make serve -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>make serve</div></code></pre> </div> </section> </section> diff --git a/services/nuldoc/public/blog/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html b/services/nuldoc/public/blog/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html index 72ae576b..c8a6ef29 100644 --- a/services/nuldoc/public/blog/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html +++ b/services/nuldoc/public/blog/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2023: ボツになったトークン問題 その 2|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -105,17 +105,16 @@ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span></div></code></pre> </div> <p> “And Then There Were None” (そして誰もいなくなった) と名付けた作品。変則 quine (自分自身と同じソースコードを出力するプログラム) になっている。 @@ -127,49 +126,46 @@ 実行してみると、次のような出力が得られる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code># -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"># +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span></div></code></pre> </div> <p> 1 行目を除き、先ほどのコードとほぼ同じものが出てきた。もう一度実行してみる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code># -W -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -<span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"># +</div><div class="codeblock-line">W +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> +</div><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<?php printf((isset($s)?fn($s)=>trim($s,""):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span></div></code></pre> </div> <p> 今度は 2 行目が書き換えられた。すべての行が変化するまで繰り返すと次のようになる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># -W</span> -<span style="color: #953800">E</span> -<span style="color: #953800">L</span> -<span style="color: #953800">O</span> -<span style="color: #953800">V</span> -<span style="color: #953800">E</span> -<span style="color: #953800">P</span> -<span style="color: #953800">H</span> -<span style="color: #953800">P</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781">W</span> +</div><div class="codeblock-line"><span style="color: #953800">E</span> +</div><div class="codeblock-line"><span style="color: #953800">L</span> +</div><div class="codeblock-line"><span style="color: #953800">O</span> +</div><div class="codeblock-line"><span style="color: #953800">V</span> +</div><div class="codeblock-line"><span style="color: #953800">E</span> +</div><div class="codeblock-line"><span style="color: #953800">P</span> +</div><div class="codeblock-line"><span style="color: #953800">H</span> +</div><div class="codeblock-line"><span style="color: #953800">P</span></div></code></pre> </div> <p> トークン「#WELOVEPHP」が手に入った。 @@ -184,8 +180,7 @@ W</span> Vim で開くと次のようになる (1 行目を抜粋)。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"<200b>"</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<200b><?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">?</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"<200b>"</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">:</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))(</span><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<200b><?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\x27</span><span style="color: #0550ae">$s</span><span style="color: #0a3069">\x27</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #6e7781">?></span></div></code></pre> </div> <p> <code><200b></code> と表示されているのは、Unicode の U+200b で、ゼロ幅スペースである。 @@ -207,15 +202,13 @@ W</span> 続いて、トークンへの変換ロジックを解析する。注目すべきはこの部分だ。以下、ゼロ幅スペースは Vim での表示に合わせて <code><200b></code> と記載する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">/</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span></div></code></pre> </div> <p> PHP の <code>strlen()</code> は文字列のバイト数を返す。1 行目の <code>$s</code> は以下の内容となっており、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<200b><?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'<200b><?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'</span></div></code></pre> </div> <p> このソースコードは UTF-8 で書かれているので、105 バイトになる。それを 3 で割ると 35 となり、これは <code>#</code> の ASCII コードと一致する。他の行も、同様にしてゼロ幅スペースを詰めることで文字列長を調整し、トークンをエンコードしている。 diff --git a/services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html b/services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html index d21af422..ecf1e478 100644 --- a/services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html +++ b/services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2023: ボツになったトークン問題 その 3|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -121,119 +121,118 @@ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> -<span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">/</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">catch</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Throwable</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getPrevious</span><span style="color: #24292f;background-color: #f6f8fa">())</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getLine</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">23</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">();</span> - <span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">0</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - - <span style="color: #0550ae">15</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">36</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">14</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">37</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - - - - - - - - - <span style="color: #0550ae">6</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - <span style="color: #0550ae">5</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - <span style="color: #0550ae">22</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - - - <span style="color: #0550ae">34</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">35</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - - - - - - - <span style="color: #0550ae">25</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">17</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">21</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - <span style="color: #0550ae">24</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">32</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - - - - - - <span style="color: #0550ae">33</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - <span style="color: #0550ae">16</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - <span style="color: #0550ae">18</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - - - - - - - <span style="color: #0550ae">7</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - <span style="color: #0550ae">2</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">20</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">10</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">28</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">12</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">26</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">4</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">9</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">13</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - - - - <span style="color: #0550ae">31</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - <span style="color: #0550ae">29</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - <span style="color: #0550ae">11</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - - <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">19</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">23</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - - <span style="color: #0550ae">27</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - <span style="color: #0550ae">30</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">};</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">finally</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - - - - - - - -<span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"><span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">/</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">catch</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Throwable</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getPrevious</span><span style="color: #24292f;background-color: #f6f8fa">())</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getLine</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">23</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">();</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">15</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">36</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">14</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">37</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">6</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">5</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">22</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">34</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">35</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">25</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">17</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">21</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">24</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">32</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">33</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">16</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">18</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">7</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">2</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">20</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">10</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">28</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">12</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">26</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">4</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">9</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">13</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">31</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">29</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">11</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">19</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">23</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">27</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">30</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">};</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">finally</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> “Catchline” と名付けた作品。実行するとトークン <code>#base64_decode('SGVsbG8sIFdvcmxkIQ==')</code> が得られる。 @@ -267,21 +266,20 @@ このうち 1つ目のケースは、 <code>finally</code> 節の中でエラーを投げると PHP 処理系が勝手に <code>$previous</code> を設定してくれる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">throw</span> <span style="color: #cf222e">new</span> <span style="color: #953800">Exception</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Error 1"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">finally</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">throw</span> <span style="color: #cf222e">new</span> <span style="color: #953800">Exception</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Error 2"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">catch</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Exception</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">echo</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getMessage</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">.</span> <span style="color: #0550ae">PHP_EOL</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #6e7781">// => Error 2</span> - <span style="color: #cf222e">echo</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getPrevious</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">-></span><span style="color: #8250df">getMessage</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">.</span> <span style="color: #0550ae">PHP_EOL</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #6e7781">// => Error 1</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">throw</span> <span style="color: #cf222e">new</span> <span style="color: #953800">Exception</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Error 1"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">finally</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">throw</span> <span style="color: #cf222e">new</span> <span style="color: #953800">Exception</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Error 2"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">catch</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Exception</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getMessage</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">.</span> <span style="color: #0550ae">PHP_EOL</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// => Error 2</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getPrevious</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">-></span><span style="color: #8250df">getMessage</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">.</span> <span style="color: #0550ae">PHP_EOL</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// => Error 1</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> この知識を元に、トークンの出力部を解析してみる。 @@ -293,16 +291,15 @@ 出力部をコメントや改行を追加して再掲する: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> -<span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">/</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">catch</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Throwable</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getPrevious</span><span style="color: #24292f;background-color: #f6f8fa">())</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getLine</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">23</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"><span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">/</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">catch</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Throwable</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getPrevious</span><span style="color: #24292f;background-color: #f6f8fa">())</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getLine</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">23</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 出力をおこなう <code>catch</code> 節を見てみると、 <code>Throwable::getPrevious()</code> を呼び出してエラーチェインを辿り、 <code>Throwable::getLine()</code> でエラーが発生した行数を取得している。その行数に <code>23</code> なるマジックナンバーを足し、フォーマット指定子 <code>%c</code> で出力している。 @@ -311,8 +308,7 @@ フォーマット指定子 <code>%c</code> は、整数を ASCII コード<sup class="footnote"><a class="footnote" href="#footnote--ras-syndrome" id="footnoteref--ras-syndrome">[1]</a></sup> と見做して印字する。トークン <code>#base64_decode('SGVsbG8sIFdvcmxkIQ==')</code> の <code>b</code> であれば、ASCII コード <code>98</code> なので、75 行目で発生したエラー、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">20</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">20</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span></div></code></pre> </div> <p> によって表現されている。エラーを起こす方法はいろいろと考えられるが、今回はゼロ除算を使った。 @@ -327,42 +323,39 @@ <code>f()</code> の定義を再掲する (エラーオブジェクトの行数を利用しているので、一部分だけ抜き出すと値が変わることに注意): </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">();</span> - <span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">0</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// 12 行目</span> - - - - <span style="color: #0550ae">15</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">36</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">14</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">37</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - - <span style="color: #6e7781">// (略)</span> - - <span style="color: #0550ae">30</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// 97 行目</span> - <span style="color: #24292f;background-color: #f6f8fa">};</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">finally</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">();</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// 12 行目</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">15</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">36</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">14</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">37</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #6e7781">// (略)</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #0550ae">30</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// 97 行目</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">};</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">finally</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 前述のように、 <code>finally</code> 節でエラーを投げると PHP 処理系が <code>$previous</code> を設定する。ここでは、エラーを繋げるために <code>f()</code> を再帰呼び出ししている。最初に <code>f()</code> を呼び出している箇所を確認すると、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> -<span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">/</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #6e7781">// 3 行目</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"><span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">/</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #6e7781">// 3 行目</span></div></code></pre> </div> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #6e7781">// 111 行目</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #6e7781">// 111 行目</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> <code>f()</code> には <code>111 / 3</code> で <code>37</code> が渡されることがわかる。そこから 1 ずつ減らして再帰呼び出ししていき、0 より小さくなったら <code>f()</code> を引数なしで呼び出す。引数の数が足りないと呼び出しに失敗するので、再帰はここで止まる。 diff --git a/services/nuldoc/public/blog/posts/2023-03-10/rewrite-this-blog-generator/index.html b/services/nuldoc/public/blog/posts/2023-03-10/rewrite-this-blog-generator/index.html index c1b43466..db9fea79 100644 --- a/services/nuldoc/public/blog/posts/2023-03-10/rewrite-this-blog-generator/index.html +++ b/services/nuldoc/public/blog/posts/2023-03-10/rewrite-this-blog-generator/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>このブログのジェネレータを書き直した|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html b/services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html index 1d323964..4b482fb7 100644 --- a/services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html +++ b/services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PNG 画像の最小構成エンコーダを実装する|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -135,45 +135,44 @@ 以下のソースコードをベースにする。今回 PNG のデコーダは扱わないので、読み込みには Go の標準ライブラリ <code>image/png</code> を用いる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">package</span> <span style="color: #24292f;background-color: #f6f8fa">main</span> - -<span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> - <span style="color: #0a3069">"image"</span> - <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0a3069">"image/png"</span> - <span style="color: #0a3069">"io"</span> - <span style="color: #0a3069">"os"</span> -<span style="color: #24292f;background-color: #f6f8fa">)</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Open</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"input.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - - <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Decode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - - <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Create</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"output.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - - <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">width</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dx</span><span style="color: #24292f;background-color: #f6f8fa">())</span> - <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dy</span><span style="color: #24292f;background-color: #f6f8fa">())</span> - <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">package</span> <span style="color: #24292f;background-color: #f6f8fa">main</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"image"</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0a3069">"image/png"</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"io"</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"os"</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Open</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"input.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Decode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Create</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"output.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">width</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dx</span><span style="color: #24292f;background-color: #f6f8fa">())</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dy</span><span style="color: #24292f;background-color: #f6f8fa">())</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 以降は、<code>writeSignature</code> や <code>writeChunkIhdr</code> などを実装していく。 @@ -216,22 +215,21 @@ <code>writeSignature</code> の実装はこちら: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">import</span> <span style="color: #0a3069">"encoding/binary"</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">sig</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">0x89</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">0x50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// P</span> - <span style="color: #0550ae">0x4E</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// N</span> - <span style="color: #0550ae">0x47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// G</span> - <span style="color: #0550ae">0x0D</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// CR</span> - <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span> - <span style="color: #0550ae">0x1A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// EOF (^Z)</span> - <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">sig</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #0a3069">"encoding/binary"</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">sig</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x89</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// P</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x4E</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// N</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// G</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x0D</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// CR</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x1A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// EOF (^Z)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">sig</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> <code>encoding/binary</code> パッケージの <code>binary.Write</code> を使い、固定の 8 バイトを書き込む。 @@ -260,57 +258,55 @@ CRC (Cyclic Redundancy Check) は誤り検出符号の一種。Go 言語では <code>hash/crc32</code> パッケージにあるが、今回はこれも自前で実装する。PNG の仕様書に C 言語のサンプルコードが載っている ( <a href="https://www.w3.org/TR/png/#D-CRCAppendix" rel="noreferrer" target="_blank">D. Sample CRC implementation</a> ) ので、これを Go に移植する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> - <span style="color: #24292f;background-color: #f6f8fa">crcTable</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint32</span> - <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #cf222e">bool</span> -<span style="color: #24292f;background-color: #f6f8fa">)</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">!=</span> <span style="color: #0550ae">0</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0xEDB88320</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">1</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">crc</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">^</span><span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span><span style="color: #0550ae">&</span><span style="color: #0550ae">0xFF</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0xFFFFFFFF</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">0xFFFFFFFF</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint32</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #cf222e">bool</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">!=</span> <span style="color: #0550ae">0</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0xEDB88320</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">1</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">crc</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">^</span><span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span><span style="color: #0550ae">&</span><span style="color: #0550ae">0xFF</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0xFFFFFFFF</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">0xFFFFFFFF</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> できた <code>crc</code> 関数を使って、chunk 一般を書き込む関数も用意しておこう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">chunkType</span> <span style="color: #cf222e">string</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">make</span><span style="color: #24292f;background-color: #f6f8fa">([]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">))</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">chunkType</span> <span style="color: #cf222e">string</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">make</span><span style="color: #24292f;background-color: #f6f8fa">([]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 仕様どおり、<code>chunkType</code> と <code>data</code> から CRC を計算し、<code>data</code> の長さと合わせて書き込んでいる。PNG では基本的に big endian を使うことに注意する。 @@ -388,21 +384,20 @@ 今回ほとんどのデータは決め打ちするので、データに応じて変わるのは width と height だけになる。コードは次のようになる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">import</span> <span style="color: #0a3069">"bytes"</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - - <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IHDR"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">())</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #0a3069">"bytes"</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IHDR"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">())</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> </section> <section id="section--implement-png-encoder--idat-chunk"> @@ -436,23 +431,22 @@ Adler-32 も CRC と同じく誤り検出符号である。こちらも zlib の仕様書に C 言語でサンプルコードが記載されている ( <a href="https://www.rfc-editor.org/rfc/rfc1950#section-9" rel="noreferrer" target="_blank">9. Appendix: Sample code</a> ) ので、Go に移植する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">65521</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">0xFFFF</span> - <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">0xFFFF</span> - - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">+</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> - <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae"><<</span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">65521</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">0xFFFF</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">0xFFFF</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">+</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae"><<</span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 「データ」の部分には圧縮したデータが入るのだが、真面目に deflate アルゴリズムを実装する必要はない。Zlib には無圧縮のデータブロックを格納することができるので、これを使う。本来は、データの圧縮効率の悪いランダムなデータをそのまま格納するためのものだが、今回は deflate の実装をサボるために使う。 @@ -478,31 +472,30 @@ 実際にこの手抜き zlib を実装したものがこちら: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> - - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x78</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x01</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">65535</span> - <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">false</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> - <span style="color: #cf222e">if</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae"><=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #0550ae">:</span><span style="color: #24292f;background-color: #f6f8fa">]</span> - <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #24292f;background-color: #f6f8fa">]</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">^</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x78</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x01</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">65535</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">false</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae"><=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #0550ae">:</span><span style="color: #24292f;background-color: #f6f8fa">]</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #24292f;background-color: #f6f8fa">]</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">^</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> </section> <section id="section--implement-png-encoder--idat-chunk--image-data"> @@ -517,21 +510,20 @@ 先ほどの <code>encodeZlib</code> も使って実際に実装したものがこちら: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">pixels</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">At</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">RGBA</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - - <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IDAT"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()))</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">pixels</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">At</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">RGBA</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IDAT"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()))</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> </section> </section> @@ -544,10 +536,9 @@ 特に追加のデータはなく、必要なのは chunk type の <code>IEND</code> くらいなので実装は簡単: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IEND"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">nil</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IEND"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">nil</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> </section> </section> @@ -557,181 +548,180 @@ 最後に全ソースコードを再掲しておく。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">package</span> <span style="color: #24292f;background-color: #f6f8fa">main</span> - -<span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> - <span style="color: #0a3069">"bytes"</span> - <span style="color: #0a3069">"encoding/binary"</span> - <span style="color: #0a3069">"image"</span> - <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0a3069">"image/png"</span> - <span style="color: #0a3069">"io"</span> - <span style="color: #0a3069">"os"</span> -<span style="color: #24292f;background-color: #f6f8fa">)</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Open</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"input.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - - <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Decode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - - <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Create</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"output.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - - <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">width</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dx</span><span style="color: #24292f;background-color: #f6f8fa">())</span> - <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dy</span><span style="color: #24292f;background-color: #f6f8fa">())</span> - <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">sig</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">0x89</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">0x50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// P</span> - <span style="color: #0550ae">0x4E</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// N</span> - <span style="color: #0550ae">0x47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// G</span> - <span style="color: #0550ae">0x0D</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// CR</span> - <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span> - <span style="color: #0550ae">0x1A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// EOF (^Z)</span> - <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">sig</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - - <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IHDR"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">())</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">pixels</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">At</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">RGBA</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - - <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IDAT"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()))</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> - - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x78</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x01</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">65535</span> - <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">false</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> - <span style="color: #cf222e">if</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae"><=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #0550ae">:</span><span style="color: #24292f;background-color: #f6f8fa">]</span> - <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #24292f;background-color: #f6f8fa">]</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">^</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IEND"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">nil</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">chunkType</span> <span style="color: #cf222e">string</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">make</span><span style="color: #24292f;background-color: #f6f8fa">([]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">))</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> - <span style="color: #24292f;background-color: #f6f8fa">crcTable</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint32</span> - <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #cf222e">bool</span> -<span style="color: #24292f;background-color: #f6f8fa">)</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">!=</span> <span style="color: #0550ae">0</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0xEDB88320</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">1</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">crc</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">^</span><span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span><span style="color: #0550ae">&</span><span style="color: #0550ae">0xFF</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0xFFFFFFFF</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">0xFFFFFFFF</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">65521</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">0xFFFF</span> - <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">0xFFFF</span> - - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">+</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> - <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae"><<</span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> - -<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">package</span> <span style="color: #24292f;background-color: #f6f8fa">main</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"bytes"</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"encoding/binary"</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"image"</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0a3069">"image/png"</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"io"</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"os"</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Open</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"input.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Decode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Create</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"output.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">width</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dx</span><span style="color: #24292f;background-color: #f6f8fa">())</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dy</span><span style="color: #24292f;background-color: #f6f8fa">())</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">sig</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x89</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// P</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x4E</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// N</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// G</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x0D</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// CR</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x1A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// EOF (^Z)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">sig</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IHDR"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">())</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">pixels</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">At</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">RGBA</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IDAT"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()))</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x78</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x01</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">65535</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">false</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae"><=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #0550ae">:</span><span style="color: #24292f;background-color: #f6f8fa">]</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #24292f;background-color: #f6f8fa">]</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">^</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IEND"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">nil</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">chunkType</span> <span style="color: #cf222e">string</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">make</span><span style="color: #24292f;background-color: #f6f8fa">([]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint32</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #cf222e">bool</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">!=</span> <span style="color: #0550ae">0</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0xEDB88320</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">1</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">crc</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">^</span><span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span><span style="color: #0550ae">&</span><span style="color: #0550ae">0xFF</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0xFFFFFFFF</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">0xFFFFFFFF</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">65521</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">0xFFFF</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">>></span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&</span> <span style="color: #0550ae">0xFFFF</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">+</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae"><<</span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> </section> <section id="section--references"> diff --git a/services/nuldoc/public/blog/posts/2023-04-04/phperkaigi-2023-report/index.html b/services/nuldoc/public/blog/posts/2023-04-04/phperkaigi-2023-report/index.html index 8061db33..1d451e16 100644 --- a/services/nuldoc/public/blog/posts/2023-04-04/phperkaigi-2023-report/index.html +++ b/services/nuldoc/public/blog/posts/2023-04-04/phperkaigi-2023-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2023 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2023-06-25/phpconfuk-2023-report/index.html b/services/nuldoc/public/blog/posts/2023-06-25/phpconfuk-2023-report/index.html index 32cc00e0..5cf3ab36 100644 --- a/services/nuldoc/public/blog/posts/2023-06-25/phpconfuk-2023-report/index.html +++ b/services/nuldoc/public/blog/posts/2023-06-25/phpconfuk-2023-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP カンファレンス福岡 2023 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2023-10-02/compile-php-runtime-to-wasm/index.html b/services/nuldoc/public/blog/posts/2023-10-02/compile-php-runtime-to-wasm/index.html index 7879f5df..33ad3d2b 100644 --- a/services/nuldoc/public/blog/posts/2023-10-02/compile-php-runtime-to-wasm/index.html +++ b/services/nuldoc/public/blog/posts/2023-10-02/compile-php-runtime-to-wasm/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP の処理系を Emscripten で WebAssembly にコンパイルする|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -142,19 +142,18 @@ <div class="filename"> index.mjs </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">readFile</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">from</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">node:fs/promises</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">PHPWasm</span> <span style="color: #cf222e">from</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">./php-wasm.mjs</span><span style="color: #0a3069">'</span> - -<span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">code</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">await</span> <span style="color: #8250df">readFile</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'</span><span style="color: #0a3069">/dev/stdin</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #116329">encoding</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">utf-8</span><span style="color: #0a3069">'</span> <span style="color: #24292f;background-color: #f6f8fa">});</span> - -<span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">ccall</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">await</span> <span style="color: #953800">PHPWasm</span><span style="color: #24292f;background-color: #f6f8fa">();</span> -<span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">result</span> <span style="color: #0550ae">=</span> <span style="color: #8250df">ccall</span><span style="color: #24292f;background-color: #f6f8fa">(</span> - <span style="color: #0a3069">'</span><span style="color: #0a3069">php_wasm_run</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">'</span><span style="color: #0a3069">number</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'</span><span style="color: #0a3069">string</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> - <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">code</span><span style="color: #24292f;background-color: #f6f8fa">],</span> -<span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #24292f;background-color: #f6f8fa">console</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">log</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">`exit code: </span><span style="color: #24292f;background-color: #f6f8fa">${</span><span style="color: #24292f;background-color: #f6f8fa">result</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #0a3069">`</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">readFile</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">from</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">node:fs/promises</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">PHPWasm</span> <span style="color: #cf222e">from</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">./php-wasm.mjs</span><span style="color: #0a3069">'</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">code</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">await</span> <span style="color: #8250df">readFile</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'</span><span style="color: #0a3069">/dev/stdin</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #116329">encoding</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">utf-8</span><span style="color: #0a3069">'</span> <span style="color: #24292f;background-color: #f6f8fa">});</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">ccall</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">await</span> <span style="color: #953800">PHPWasm</span><span style="color: #24292f;background-color: #f6f8fa">();</span> +</div><div class="codeblock-line"><span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">result</span> <span style="color: #0550ae">=</span> <span style="color: #8250df">ccall</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">'</span><span style="color: #0a3069">php_wasm_run</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">'</span><span style="color: #0a3069">number</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'</span><span style="color: #0a3069">string</span><span style="color: #0a3069">'</span><span style="color: #24292f;background-color: #f6f8fa">],</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">code</span><span style="color: #24292f;background-color: #f6f8fa">],</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">console</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">log</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">`exit code: </span><span style="color: #24292f;background-color: #f6f8fa">${</span><span style="color: #24292f;background-color: #f6f8fa">result</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #0a3069">`</span><span style="color: #24292f;background-color: #f6f8fa">);</span></div></code></pre> </div> <p> 標準入力から与えたコードを WebAssembly にコンパイルされた PHP 処理系の上で実行している。このような <code>php-wasm.mjs</code> (とそこから呼び出される <code>php-wasm.wasm</code>) を作成する。 @@ -168,31 +167,30 @@ 先ほどのコードでも使っていたエントリポイントである <code>php_wasm_run</code> を用意する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">#include</span> <span style="color: #6e7781"><stdio.h></span><span style="color: #6e7781"> -#include</span> <span style="color: #6e7781"><emscripten.h></span><span style="color: #6e7781"> -#include</span> <span style="color: #6e7781"><Zend/zend_execute.h></span><span style="color: #6e7781"> -#include</span> <span style="color: #6e7781"><sapi/embed/php_embed.h></span><span style="color: #6e7781"> -</span> -<span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">EMSCRIPTEN_KEEPALIVE</span> <span style="color: #8250df">php_wasm_run</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">const</span> <span style="color: #cf222e">char</span><span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">code</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">zend_result</span> <span style="color: #24292f;background-color: #f6f8fa">result</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - - <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">argc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">char</span><span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">argv</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #0a3069">"php.wasm"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">NULL</span> <span style="color: #24292f;background-color: #f6f8fa">};</span> - - <span style="color: #24292f;background-color: #f6f8fa">PHP_EMBED_START_BLOCK</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">argc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">argv</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - - <span style="color: #24292f;background-color: #f6f8fa">result</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">zend_eval_string_ex</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">code</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">NULL</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"php.wasm code"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - - <span style="color: #24292f;background-color: #f6f8fa">PHP_EMBED_END_BLOCK</span><span style="color: #24292f;background-color: #f6f8fa">();</span> - - <span style="color: #24292f;background-color: #f6f8fa">fprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">stdout</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">fflush</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">stdout</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">fprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">stderr</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">fflush</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">stderr</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">result</span> <span style="color: #0550ae">==</span> <span style="color: #24292f;background-color: #f6f8fa">SUCCESS</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">#include</span> <span style="color: #6e7781"><stdio.h></span> +</div><div class="codeblock-line"><span style="color: #6e7781">#include</span> <span style="color: #6e7781"><emscripten.h></span> +</div><div class="codeblock-line"><span style="color: #6e7781">#include</span> <span style="color: #6e7781"><Zend/zend_execute.h></span> +</div><div class="codeblock-line"><span style="color: #6e7781">#include</span> <span style="color: #6e7781"><sapi/embed/php_embed.h></span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">EMSCRIPTEN_KEEPALIVE</span> <span style="color: #8250df">php_wasm_run</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">const</span> <span style="color: #cf222e">char</span><span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">code</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">zend_result</span> <span style="color: #24292f;background-color: #f6f8fa">result</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">argc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">char</span><span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">argv</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #0a3069">"php.wasm"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">NULL</span> <span style="color: #24292f;background-color: #f6f8fa">};</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">PHP_EMBED_START_BLOCK</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">argc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">argv</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">result</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">zend_eval_string_ex</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">code</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">NULL</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"php.wasm code"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">PHP_EMBED_END_BLOCK</span><span style="color: #24292f;background-color: #f6f8fa">();</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">fprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">stdout</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">fflush</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">stdout</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">fprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">stderr</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">fflush</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">stderr</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">result</span> <span style="color: #0550ae">==</span> <span style="color: #24292f;background-color: #f6f8fa">SUCCESS</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> ほとんどはただの PHP の公開 API を使ったコードだが、Emscripten 向けの注意点が 2点ある。 @@ -215,16 +213,15 @@ デフォルトの出力方法は <code>index.mjs</code> の中で <code>PHPWasm()</code> を呼ぶとき、<code>stdout</code>・<code>stderr</code> というオプションを渡せば変更できる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">ccall</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">await</span> <span style="color: #953800">PHPWasm</span><span style="color: #24292f;background-color: #f6f8fa">({</span> - <span style="color: #116329">stdout</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if </span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #6e7781">// flush the standard output.</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #6e7781">// output c to the standard output.</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">},</span> -<span style="color: #24292f;background-color: #f6f8fa">});</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">ccall</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">await</span> <span style="color: #953800">PHPWasm</span><span style="color: #24292f;background-color: #f6f8fa">({</span> +</div><div class="codeblock-line"> <span style="color: #116329">stdout</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if </span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">null</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// flush the standard output.</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// output c to the standard output.</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">});</span></div></code></pre> </div> <p> <code>c</code> は <code>null</code> か 1バイト符号つき整数を取り、<code>null</code> が flush 要求を意味する。 @@ -244,52 +241,49 @@ まずは <a href="https://hub.docker.com/r/emscripten/emsdk" rel="noreferrer" target="_blank">Emscripten 公式が提供している Docker イメージ</a> を使って、PHP 処理系と先ほど示した C 言語のソースコードを WebAssembly にコンパイルする。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">FROM</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">emscripten/emsdk:3.1.46</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #cf222e">AS</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">wasm-builder</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">FROM</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">emscripten/emsdk:3.1.46</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #cf222e">AS</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">wasm-builder</span></div></code></pre> </div> <p> 次に、 <a href="https://github.com/php/php-src" rel="noreferrer" target="_blank">php/php-src</a> から PHP 処理系のソースコードを取得し、ビルドに必要な apt パッケージを取ってくる。有効にする拡張を増やしたいなら、ここでインストールするパッケージも増やすことになるだろう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">RUN </span>git clone <span style="color: #116329">--depth</span><span style="color: #0550ae">=</span>1 <span style="color: #116329">--branch</span><span style="color: #0550ae">=</span>php-8.2.10 https://github.com/php/php-src - -<span style="color: #cf222e">RUN </span>apt-get update <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> apt-get <span style="color: #953800">install</span> <span style="color: #116329">-y</span> <span style="color: #116329">--no-install-recommends</span> <span style="color: #0a3069">\ -</span> autoconf <span style="color: #0a3069">\ -</span> bison <span style="color: #0a3069">\ -</span> pkg-config <span style="color: #0a3069">\ -</span> re2c <span style="color: #0a3069">\ -</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> : -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">RUN </span>git clone <span style="color: #116329">--depth</span><span style="color: #0550ae">=</span>1 <span style="color: #116329">--branch</span><span style="color: #0550ae">=</span>php-8.2.10 https://github.com/php/php-src +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">RUN </span>apt-get update <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> apt-get <span style="color: #953800">install</span> <span style="color: #116329">-y</span> <span style="color: #116329">--no-install-recommends</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> autoconf <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> bison <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> pkg-config <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> re2c <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> :</div></code></pre> </div> <p> 続けて、Emscripten のツールチェインを用いて PHP 処理系をビルドする。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">RUN </span><span style="color: #953800">cd </span>php-src <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> ./buildconf <span style="color: #116329">--force</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> emconfigure ./configure <span style="color: #0a3069">\ -</span> <span style="color: #116329">--disable-all</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--disable-mbregex</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--disable-fiber-asm</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--disable-cli</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--disable-cgi</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--disable-phpdbg</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--enable-embed</span><span style="color: #0550ae">=</span>static <span style="color: #0a3069">\ -</span> <span style="color: #116329">--enable-mbstring</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--without-iconv</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--without-libxml</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--without-pcre-jit</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--without-pdo-sqlite</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">--without-sqlite3</span> <span style="color: #0a3069">\ -</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> <span style="color: #0550ae">EMCC_CFLAGS</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'-s ERROR_ON_UNDEFINED_SYMBOLS=0'</span> emmake make <span style="color: #116329">-j</span><span style="color: #24292f">$(</span><span style="color: #953800">nproc</span><span style="color: #24292f">)</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> <span style="color: #953800">mv </span>libs/libphp.a .. <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> make clean <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> git clean <span style="color: #116329">-fd</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> : -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">RUN </span><span style="color: #953800">cd </span>php-src <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> ./buildconf <span style="color: #116329">--force</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> emconfigure ./configure <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--disable-all</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--disable-mbregex</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--disable-fiber-asm</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--disable-cli</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--disable-cgi</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--disable-phpdbg</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--enable-embed</span><span style="color: #0550ae">=</span>static <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--enable-mbstring</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--without-iconv</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--without-libxml</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--without-pcre-jit</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--without-pdo-sqlite</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--without-sqlite3</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">EMCC_CFLAGS</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'-s ERROR_ON_UNDEFINED_SYMBOLS=0'</span> emmake make <span style="color: #116329">-j</span><span style="color: #24292f">$(</span><span style="color: #953800">nproc</span><span style="color: #24292f">)</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #953800">mv </span>libs/libphp.a .. <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> make clean <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> git clean <span style="color: #116329">-fd</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> :</div></code></pre> </div> <p> ここまでと比べると少し複雑なので、それぞれ詳しく見ていこう。 @@ -313,23 +307,22 @@ さて、PHP 処理系をライブラリ化できたので、次に先ほど載せた C のソースコードをビルドしていこう。<code>Dockerfile</code> と同じ場所に <code>php-wasm.c</code> という名前で保存し、次のようにする。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">COPY</span><span style="color: #0a3069"> php-wasm.c /src/</span> - -<span style="color: #cf222e">RUN </span><span style="color: #953800">cd </span>php-src <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> emcc <span style="color: #0a3069">\ -</span> <span style="color: #116329">-c</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">-o</span> php-wasm.o <span style="color: #0a3069">\ -</span> <span style="color: #116329">-I</span> <span style="color: #953800">.</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">-I</span> TSRM <span style="color: #0a3069">\ -</span> <span style="color: #116329">-I</span> Zend <span style="color: #0a3069">\ -</span> <span style="color: #116329">-I</span> main <span style="color: #0a3069">\ -</span> ../php-wasm.c <span style="color: #0a3069">\ -</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> <span style="color: #953800">mv </span>php-wasm.o .. <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> make clean <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> git clean <span style="color: #116329">-fd</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\ -</span> : -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">COPY</span><span style="color: #0a3069"> php-wasm.c /src/</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">RUN </span><span style="color: #953800">cd </span>php-src <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> emcc <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-c</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-o</span> php-wasm.o <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-I</span> <span style="color: #953800">.</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-I</span> TSRM <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-I</span> Zend <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-I</span> main <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> ../php-wasm.c <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #953800">mv </span>php-wasm.o .. <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> make clean <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> git clean <span style="color: #116329">-fd</span> <span style="color: #0550ae">&&</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> :</div></code></pre> </div> <p> <code>emcc</code> は <code>cc</code> (C コンパイラ/リンカ) の Emscripten 版で、<code>-c</code> は「コンパイル」の意。<code>-o</code> や <code>-I</code> は普通の C コンパイラと同様、出力ファイルの指定とインクルードパスの指定である。 @@ -338,19 +331,18 @@ <code>libphp.a</code> と <code>php-wasm.o</code> が手に入ったので、これらをリンクして WebAssembly のバイナリとそのラッパである JavaScript ファイルを生成する。これにも <code>emcc</code> コマンドを使う。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">RUN </span>emcc <span style="color: #0a3069">\ -</span> <span style="color: #116329">-s</span> <span style="color: #0550ae">ENVIRONMENT</span><span style="color: #0550ae">=</span>node <span style="color: #0a3069">\ -</span> <span style="color: #116329">-s</span> <span style="color: #0550ae">ERROR_ON_UNDEFINED_SYMBOLS</span><span style="color: #0550ae">=</span>0 <span style="color: #0a3069">\ -</span> <span style="color: #116329">-s</span> <span style="color: #0550ae">EXPORTED_RUNTIME_METHODS</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'["ccall"]'</span> <span style="color: #0a3069">\ -</span> <span style="color: #116329">-s</span> <span style="color: #0550ae">EXPORT_ES6</span><span style="color: #0550ae">=</span>1 <span style="color: #0a3069">\ -</span> <span style="color: #116329">-s</span> <span style="color: #0550ae">INITIAL_MEMORY</span><span style="color: #0550ae">=</span>16777216 <span style="color: #0a3069">\ -</span> <span style="color: #116329">-s</span> <span style="color: #0550ae">INVOKE_RUN</span><span style="color: #0550ae">=</span>0 <span style="color: #0a3069">\ -</span> <span style="color: #116329">-s</span> <span style="color: #0550ae">MODULARIZE</span><span style="color: #0550ae">=</span>1 <span style="color: #0a3069">\ -</span> <span style="color: #116329">-o</span> php-wasm.js <span style="color: #0a3069">\ -</span> php-wasm.o <span style="color: #0a3069">\ -</span> libphp.a <span style="color: #0a3069">\ -</span> <span style="color: #24292f;background-color: #f6f8fa">;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">RUN </span>emcc <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-s</span> <span style="color: #0550ae">ENVIRONMENT</span><span style="color: #0550ae">=</span>node <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-s</span> <span style="color: #0550ae">ERROR_ON_UNDEFINED_SYMBOLS</span><span style="color: #0550ae">=</span>0 <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-s</span> <span style="color: #0550ae">EXPORTED_RUNTIME_METHODS</span><span style="color: #0550ae">=</span><span style="color: #0a3069">'["ccall"]'</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-s</span> <span style="color: #0550ae">EXPORT_ES6</span><span style="color: #0550ae">=</span>1 <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-s</span> <span style="color: #0550ae">INITIAL_MEMORY</span><span style="color: #0550ae">=</span>16777216 <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-s</span> <span style="color: #0550ae">INVOKE_RUN</span><span style="color: #0550ae">=</span>0 <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-s</span> <span style="color: #0550ae">MODULARIZE</span><span style="color: #0550ae">=</span>1 <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-o</span> php-wasm.js <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> php-wasm.o <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> libphp.a <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> </div> <p> それぞれのフラグについて解説する。 @@ -383,15 +375,14 @@ といっても、Node.js はビルトインで WebAssembly をサポートしているので、ほとんどやることはない。先ほど掲載した JavaScript のコードは、<code>Dockerfile</code> と同じディレクトリに <code>index.mjs</code> で配置すること。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">FROM</span><span style="color: #0a3069"> node:20.7</span> - -<span style="color: #cf222e">WORKDIR</span><span style="color: #0a3069"> /app</span> -<span style="color: #cf222e">COPY</span><span style="color: #0a3069"> --from=wasm-builder /src/php-wasm.js /app/php-wasm.mjs</span> -<span style="color: #cf222e">COPY</span><span style="color: #0a3069"> --from=wasm-builder /src/php-wasm.wasm /app/php-wasm.wasm</span> -<span style="color: #cf222e">COPY</span><span style="color: #0a3069"> index.mjs /app/</span> - -<span style="color: #cf222e">ENTRYPOINT</span><span style="color: #0a3069"> ["node", "index.mjs"]</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">FROM</span><span style="color: #0a3069"> node:20.7</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">WORKDIR</span><span style="color: #0a3069"> /app</span> +</div><div class="codeblock-line"><span style="color: #cf222e">COPY</span><span style="color: #0a3069"> --from=wasm-builder /src/php-wasm.js /app/php-wasm.mjs</span> +</div><div class="codeblock-line"><span style="color: #cf222e">COPY</span><span style="color: #0a3069"> --from=wasm-builder /src/php-wasm.wasm /app/php-wasm.wasm</span> +</div><div class="codeblock-line"><span style="color: #cf222e">COPY</span><span style="color: #0a3069"> index.mjs /app/</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">ENTRYPOINT</span><span style="color: #0a3069"> ["node", "index.mjs"]</span></div></code></pre> </div> </section> </section> @@ -401,13 +392,12 @@ <code>Dockerfile</code>、<code>php-wasm.c</code>、<code>index.mjs</code> を用意したら、Docker コンテナをビルドして実行する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ docker build -t php-wasm . -$ echo 'echo "Hello, World!", PHP_EOL;' | docker run --rm -i php-wasm -Hello, World! - - -exit code: 0 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ docker build -t php-wasm . +</div><div class="codeblock-line">$ echo 'echo "Hello, World!", PHP_EOL;' | docker run --rm -i php-wasm +</div><div class="codeblock-line">Hello, World! +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> +</div><div class="codeblock-line">exit code: 0</div></code></pre> </div> </section> <section id="section--outro"> diff --git a/services/nuldoc/public/blog/posts/2023-10-13/i-entered-the-open-university-of-japan/index.html b/services/nuldoc/public/blog/posts/2023-10-13/i-entered-the-open-university-of-japan/index.html index a2749ba9..af1d4335 100644 --- a/services/nuldoc/public/blog/posts/2023-10-13/i-entered-the-open-university-of-japan/index.html +++ b/services/nuldoc/public/blog/posts/2023-10-13/i-entered-the-open-university-of-japan/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>放送大学に入学しました|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2023-12-03/isucon-13/index.html b/services/nuldoc/public/blog/posts/2023-12-03/isucon-13/index.html index 0447e7fb..bbf6aab4 100644 --- a/services/nuldoc/public/blog/posts/2023-12-03/isucon-13/index.html +++ b/services/nuldoc/public/blog/posts/2023-12-03/isucon-13/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>ISUCON 13 に参加した|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2023-12-31/2023-reflections/index.html b/services/nuldoc/public/blog/posts/2023-12-31/2023-reflections/index.html index 126add6f..d8ba47f7 100644 --- a/services/nuldoc/public/blog/posts/2023-12-31/2023-reflections/index.html +++ b/services/nuldoc/public/blog/posts/2023-12-31/2023-reflections/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>2023年の振り返り|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2024-01-10/neovim-insert-namespace-declaration-to-empty-php-file/index.html b/services/nuldoc/public/blog/posts/2024-01-10/neovim-insert-namespace-declaration-to-empty-php-file/index.html index 46780269..8e538579 100644 --- a/services/nuldoc/public/blog/posts/2024-01-10/neovim-insert-namespace-declaration-to-empty-php-file/index.html +++ b/services/nuldoc/public/blog/posts/2024-01-10/neovim-insert-namespace-declaration-to-empty-php-file/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Neovim】 空の PHP ファイルに namespace 宣言を挿入する|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -100,20 +100,18 @@ Neovim で空の PHP ファイルを開いたとき、そのファイルが置かれているディレクトリの構造に基づいて、自動的に <code>namespace</code> 宣言を挿入したい。具体的には、トップレベルの名前空間が <code>MyNamespace</code> であり、ファイル <code>src/Foo/Bar/Baz.php</code> を開いたときに、そのファイルが空であるなら、次のようなテンプレートが自動的に挿入されてほしい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> - -<span style="color: #cf222e">namespace</span> <span style="color: #953800">MyNamespace\Foo\Bar</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">namespace</span> <span style="color: #953800">MyNamespace\Foo\Bar</span><span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> </div> </section> <section id="section--version"> <h2><a href="#section--version">バージョン情報</a></h2> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ nvim --version -NVIM v0.9.2 -Build type: Release -LuaJIT 2.1.1693350652 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ nvim --version +</div><div class="codeblock-line">NVIM v0.9.2 +</div><div class="codeblock-line">Build type: Release +</div><div class="codeblock-line">LuaJIT 2.1.1693350652</div></code></pre> </div> <p> 今回は Lua で処理を記述したため、Vim では動作しない。以下の説明でも Neovim に絞って述べる。また、パス区切りがスラッシュである前提で記述したため、Windows には対応していない。 @@ -137,14 +135,13 @@ LuaJIT 2.1.1693350652 ファイルタイプは読み込んだあとに変更されることもあるので、ftplugin は複数回実行されうる。二重読み込みを防ぐために、<code>did_ftplugin_<FILE_TYPE>_after</code> というバッファローカル変数を定義しておくのが慣習となっている。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">did_ftplugin_php_after</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> -<span style="color: #cf222e">end</span> - -<span style="color: #6e7781">-- ここに実際の処理を書く</span> - -<span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">did_ftplugin_php_after</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">did_ftplugin_php_after</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">-- ここに実際の処理を書く</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">did_ftplugin_php_after</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span></div></code></pre> </div> </section> <section id="section--implement"> @@ -176,120 +173,119 @@ LuaJIT 2.1.1693350652 実装を簡単にするため、Composer を用いない場合や PSR 4 以外のオートロード規則を使う場合には対応しない。少々長くなるが、以下にスクリプト全文を載せる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">did_ftplugin_php_after</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> -<span style="color: #cf222e">end</span> - -<span style="color: #6e7781">-- base_dir を起点としてディレクトリを上向きに辿っていき、composer.json を探す</span> -<span style="color: #6e7781">-- :help vim.fs.find()</span> -<span style="color: #cf222e">local</span> <span style="color: #cf222e">function</span> <span style="color: #8250df">find_composer_json</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">base_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fs</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">find</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'composer.json'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">path</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">base_dir</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">upward</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #6e7781">-- ホームディレクトリまで到達したら探索を打ち切る</span> - <span style="color: #24292f;background-color: #f6f8fa">stop</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">loop</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">os_homedir</span><span style="color: #24292f;background-color: #f6f8fa">(),</span> - <span style="color: #953800">type</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'file'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">})[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> -<span style="color: #cf222e">end</span> - -<span style="color: #6e7781">-- JSON ファイルを読み込み、デコードして返す</span> -<span style="color: #6e7781">-- :help readblob()</span> -<span style="color: #6e7781">-- :help vim.json.decode</span> -<span style="color: #6e7781">-- :help luaref-pcall()</span> -<span style="color: #cf222e">local</span> <span style="color: #cf222e">function</span> <span style="color: #8250df">load_json</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">file_path</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #6e7781">-- readblob() は Vim script では Blob オブジェクトを返すが、Lua から呼ぶと string に変換される</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">ok_read</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">content</span> <span style="color: #0550ae">=</span> <span style="color: #953800">pcall</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">readblob</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">file_path</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">ok_read</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">ok_decode</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">obj</span> <span style="color: #0550ae">=</span> <span style="color: #953800">pcall</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">json</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">decode</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">content</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">ok_decode</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">obj</span> -<span style="color: #cf222e">end</span> - -<span style="color: #6e7781">-- 対象ファイルの置かれたディレクトリを基に namespace 宣言を生成する</span> -<span style="color: #6e7781">-- :help nvim_buf_get_name()</span> -<span style="color: #6e7781">-- :help vim.fs.dirname()</span> -<span style="color: #cf222e">local</span> <span style="color: #cf222e">function</span> <span style="color: #8250df">generate_namespace_declaration</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - <span style="color: #6e7781">-- composer.json を探し、トップレベルの名前空間とディレクトリを特定する</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">current_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fs</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">dirname</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">api</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">nvim_buf_get_name</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">path_to_composer_json</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">find_composer_json</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">current_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">path_to_composer_json</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- failed to locate composer.json</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">composer_json</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">load_json</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">path_to_composer_json</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">composer_json</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- failed to load composer.json</span> - <span style="color: #cf222e">end</span> - <span style="color: #6e7781">-- autoload.psr-4 を探し、型が期待される型と一致するかどうか調べる</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">psr4</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">tbl_get</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">composer_json</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'autoload'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'psr-4'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">psr4</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- autoload.psr-4 section is absent</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">tbl_count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">~=</span> <span style="color: #0550ae">1</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- psr-4 section is ambiguous</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">v</span> <span style="color: #cf222e">in</span> <span style="color: #953800">pairs</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">do</span> - <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> - <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">v</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">if</span> <span style="color: #953800">type</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0a3069">'table'</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">if</span> <span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">1</span> <span style="color: #cf222e">then</span> - <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> - <span style="color: #cf222e">else</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- psr-4 section is ambiguous</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">if</span> <span style="color: #953800">type</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">~=</span> <span style="color: #0a3069">'string'</span> <span style="color: #0550ae">or</span> <span style="color: #953800">type</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">~=</span> <span style="color: #0a3069">'string'</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- psr-4 section is invalid</span> - <span style="color: #cf222e">end</span> - <span style="color: #6e7781">-- 末尾のスラッシュとバックスラッシュを取り除いておく</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">\\</span><span style="color: #0a3069">'</span> <span style="color: #cf222e">then</span> - <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0a3069">'/'</span> <span style="color: #cf222e">then</span> - <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">end</span> - - <span style="color: #6e7781">-- 対象ファイルが置かれたディレクトリとトップレベルのディレクトリを比較し、その差分を名前空間とする</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_root_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fs</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">dirname</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">path_to_composer_json</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">..</span> <span style="color: #0a3069">'/'</span> <span style="color: #0550ae">..</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> - <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">startswith</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">current_dir</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_root_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">then</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> - <span style="color: #cf222e">end</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">current_path_suffix</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">current_dir</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">namespace_root_dir</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">namespace</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span> <span style="color: #0550ae">..</span> <span style="color: #24292f;background-color: #f6f8fa">current_path_suffix</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #953800">gsub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">'/'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #116329">'</span><span style="color: #0a3069">\\</span><span style="color: #116329">'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"namespace %s;"</span><span style="color: #24292f;background-color: #f6f8fa">):</span><span style="color: #24292f;background-color: #f6f8fa">format</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">namespace</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #cf222e">end</span> - -<span style="color: #cf222e">local</span> <span style="color: #cf222e">function</span> <span style="color: #8250df">generate_template</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">lines</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0a3069">'<?php'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">'declare(strict_types=1);'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_decl</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">generate_namespace_declaration</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_decl</span> <span style="color: #cf222e">then</span> - <span style="color: #24292f;background-color: #f6f8fa">lines</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">lines</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_decl</span> - <span style="color: #24292f;background-color: #f6f8fa">lines</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">lines</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span> - <span style="color: #cf222e">end</span> - <span style="color: #24292f;background-color: #f6f8fa">lines</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">lines</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span> - <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">lines</span> -<span style="color: #cf222e">end</span> - -<span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">line</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'$'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">and</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">getline</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0a3069">''</span> <span style="color: #cf222e">then</span> - <span style="color: #6e7781">-- 対象ファイルが空なら、テンプレートを挿入してカーソルを末尾に移動させる</span> - <span style="color: #6e7781">-- :help setline()</span> - <span style="color: #6e7781">-- :help cursor()</span> - <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">setline</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">generate_template</span><span style="color: #24292f;background-color: #f6f8fa">())</span> - <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">cursor</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'$'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #cf222e">end</span> - -<span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">did_ftplugin_php_after</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">did_ftplugin_php_after</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">-- base_dir を起点としてディレクトリを上向きに辿っていき、composer.json を探す</span> +</div><div class="codeblock-line"><span style="color: #6e7781">-- :help vim.fs.find()</span> +</div><div class="codeblock-line"><span style="color: #cf222e">local</span> <span style="color: #cf222e">function</span> <span style="color: #8250df">find_composer_json</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">base_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fs</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">find</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'composer.json'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">path</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">base_dir</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">upward</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">-- ホームディレクトリまで到達したら探索を打ち切る</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">stop</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">loop</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">os_homedir</span><span style="color: #24292f;background-color: #f6f8fa">(),</span> +</div><div class="codeblock-line"> <span style="color: #953800">type</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'file'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">})[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">-- JSON ファイルを読み込み、デコードして返す</span> +</div><div class="codeblock-line"><span style="color: #6e7781">-- :help readblob()</span> +</div><div class="codeblock-line"><span style="color: #6e7781">-- :help vim.json.decode</span> +</div><div class="codeblock-line"><span style="color: #6e7781">-- :help luaref-pcall()</span> +</div><div class="codeblock-line"><span style="color: #cf222e">local</span> <span style="color: #cf222e">function</span> <span style="color: #8250df">load_json</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">file_path</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">-- readblob() は Vim script では Blob オブジェクトを返すが、Lua から呼ぶと string に変換される</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">ok_read</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">content</span> <span style="color: #0550ae">=</span> <span style="color: #953800">pcall</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">readblob</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">file_path</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">ok_read</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">ok_decode</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">obj</span> <span style="color: #0550ae">=</span> <span style="color: #953800">pcall</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">json</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">decode</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">content</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">ok_decode</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">obj</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781">-- 対象ファイルの置かれたディレクトリを基に namespace 宣言を生成する</span> +</div><div class="codeblock-line"><span style="color: #6e7781">-- :help nvim_buf_get_name()</span> +</div><div class="codeblock-line"><span style="color: #6e7781">-- :help vim.fs.dirname()</span> +</div><div class="codeblock-line"><span style="color: #cf222e">local</span> <span style="color: #cf222e">function</span> <span style="color: #8250df">generate_namespace_declaration</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">-- composer.json を探し、トップレベルの名前空間とディレクトリを特定する</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">current_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fs</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">dirname</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">api</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">nvim_buf_get_name</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">path_to_composer_json</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">find_composer_json</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">current_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">path_to_composer_json</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- failed to locate composer.json</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">composer_json</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">load_json</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">path_to_composer_json</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">composer_json</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- failed to load composer.json</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">-- autoload.psr-4 を探し、型が期待される型と一致するかどうか調べる</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">psr4</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">tbl_get</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">composer_json</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'autoload'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'psr-4'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">psr4</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- autoload.psr-4 section is absent</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">tbl_count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">~=</span> <span style="color: #0550ae">1</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- psr-4 section is ambiguous</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">v</span> <span style="color: #cf222e">in</span> <span style="color: #953800">pairs</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">do</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">v</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #953800">type</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0a3069">'table'</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">1</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">else</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- psr-4 section is ambiguous</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #953800">type</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">~=</span> <span style="color: #0a3069">'string'</span> <span style="color: #0550ae">or</span> <span style="color: #953800">type</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">~=</span> <span style="color: #0a3069">'string'</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> <span style="color: #6e7781">-- psr-4 section is invalid</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">-- 末尾のスラッシュとバックスラッシュを取り除いておく</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">\\</span><span style="color: #0a3069">'</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0a3069">'/'</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #6e7781">-- 対象ファイルが置かれたディレクトリとトップレベルのディレクトリを比較し、その差分を名前空間とする</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_root_dir</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fs</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">dirname</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">path_to_composer_json</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">..</span> <span style="color: #0a3069">'/'</span> <span style="color: #0550ae">..</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_dir</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #0550ae">not</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">startswith</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">current_dir</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_root_dir</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">nil</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">current_path_suffix</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">current_dir</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa">sub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">namespace_root_dir</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">namespace</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">psr4_namespace</span> <span style="color: #0550ae">..</span> <span style="color: #24292f;background-color: #f6f8fa">current_path_suffix</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #953800">gsub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">'/'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #116329">'</span><span style="color: #0a3069">\\</span><span style="color: #116329">'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"namespace %s;"</span><span style="color: #24292f;background-color: #f6f8fa">):</span><span style="color: #24292f;background-color: #f6f8fa">format</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">namespace</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">local</span> <span style="color: #cf222e">function</span> <span style="color: #8250df">generate_template</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">lines</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">'<?php'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">'declare(strict_types=1);'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_decl</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">generate_namespace_declaration</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_decl</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">lines</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">lines</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">namespace_decl</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">lines</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">lines</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">lines</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">#</span><span style="color: #24292f;background-color: #f6f8fa">lines</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">lines</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">line</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'$'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">and</span> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">getline</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">==</span> <span style="color: #0a3069">''</span> <span style="color: #cf222e">then</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">-- 対象ファイルが空なら、テンプレートを挿入してカーソルを末尾に移動させる</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">-- :help setline()</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">-- :help cursor()</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">setline</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">generate_template</span><span style="color: #24292f;background-color: #f6f8fa">())</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">fn</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">cursor</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'$'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">did_ftplugin_php_after</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span></div></code></pre> </div> </section> <section id="section--outro"> diff --git a/services/nuldoc/public/blog/posts/2024-02-03/install-wireguard-on-personal-server/index.html b/services/nuldoc/public/blog/posts/2024-02-03/install-wireguard-on-personal-server/index.html index 60a72a00..68b5a90a 100644 --- a/services/nuldoc/public/blog/posts/2024-02-03/install-wireguard-on-personal-server/index.html +++ b/services/nuldoc/public/blog/posts/2024-02-03/install-wireguard-on-personal-server/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【備忘録】 個人用サーバに WireGuard を導入する|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -119,16 +119,14 @@ まずは個人用サービスをホストしている Ubuntu のサーバに WireGuard をインストールする。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ sudo apt install wireguard -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ sudo apt install wireguard</div></code></pre> </div> <p> 次に、WireGuard で使用する鍵を生成する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ wg genkey | sudo tee /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub -$ sudo chmod 600 /etc/wireguard/server.{key,pub} -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ wg genkey | sudo tee /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub +</div><div class="codeblock-line">$ sudo chmod 600 /etc/wireguard/server.{key,pub}</div></code></pre> </div> </section> <section id="section--install-wireguard-client"> @@ -137,28 +135,26 @@ $ sudo chmod 600 /etc/wireguard/server.{key,pub} 公式サイトから各 OS 向けのクライアントソフトウェアを入手し、インストールする。次に、設定をおこなう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># クライアント 1 の場合 -</span><span style="color: #953800">[Interface]</span><span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #0550ae">Address</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.2/32</span> -<span style="color: #0550ae">PrivateKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><クライアント 1 の秘密鍵></span> -<span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #953800">[Peer]</span><span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #0550ae">PublicKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの公開鍵></span> -<span style="color: #0550ae">AllowedIPs</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの外部 IP アドレス>/32</span> -<span style="color: #0550ae">Endpoint</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの外部 IP アドレス>:51820</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># クライアント 1 の場合</span> +</div><div class="codeblock-line"><span style="color: #953800">[Interface]</span> +</div><div class="codeblock-line"><span style="color: #0550ae">Address</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.2/32</span> +</div><div class="codeblock-line"><span style="color: #0550ae">PrivateKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><クライアント 1 の秘密鍵></span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #953800">[Peer]</span> +</div><div class="codeblock-line"><span style="color: #0550ae">PublicKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの公開鍵></span> +</div><div class="codeblock-line"><span style="color: #0550ae">AllowedIPs</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの外部 IP アドレス>/32</span> +</div><div class="codeblock-line"><span style="color: #0550ae">Endpoint</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの外部 IP アドレス>:51820</span></div></code></pre> </div> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># クライアント 2 の場合 -</span><span style="color: #953800">[Interface]</span><span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #0550ae">Address</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.3/32</span> -<span style="color: #0550ae">PrivateKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><クライアント 2 の秘密鍵></span> -<span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #953800">[Peer]</span><span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #0550ae">PublicKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの公開鍵></span> -<span style="color: #0550ae">AllowedIPs</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの外部 IP アドレス>/32</span> -<span style="color: #0550ae">Endpoint</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの外部 IP アドレス>:51820</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># クライアント 2 の場合</span> +</div><div class="codeblock-line"><span style="color: #953800">[Interface]</span> +</div><div class="codeblock-line"><span style="color: #0550ae">Address</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.3/32</span> +</div><div class="codeblock-line"><span style="color: #0550ae">PrivateKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><クライアント 2 の秘密鍵></span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #953800">[Peer]</span> +</div><div class="codeblock-line"><span style="color: #0550ae">PublicKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの公開鍵></span> +</div><div class="codeblock-line"><span style="color: #0550ae">AllowedIPs</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの外部 IP アドレス>/32</span> +</div><div class="codeblock-line"><span style="color: #0550ae">Endpoint</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの外部 IP アドレス>:51820</span></div></code></pre> </div> <p> <code>PrivateKey</code> や <code>PublicKey</code> は鍵ファイルのパスではなく中身を書くことに注意。 @@ -170,32 +166,29 @@ $ sudo chmod 600 /etc/wireguard/server.{key,pub} 一度サーバへ戻り、WireGuard の設定ファイルを書く。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ sudo vim /etc/wireguard/wg0.conf -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ sudo vim /etc/wireguard/wg0.conf</div></code></pre> </div> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #953800">[Interface]</span><span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #0550ae">Address</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.1/32</span> -<span style="color: #0550ae">SaveConfig</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">true</span> -<span style="color: #0550ae">PrivateKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの秘密鍵></span> -<span style="color: #0550ae">ListenPort</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">51820</span> -<span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #953800">[Peer]</span><span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #0550ae">PublicKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><クライアント 1 の公開鍵></span> -<span style="color: #0550ae">AllowedIPs</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.2/32</span> -<span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #953800">[Peer]</span><span style="color: #24292f;background-color: #f6f8fa"> -</span><span style="color: #0550ae">PublicKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><クライアント 2 の公開鍵></span> -<span style="color: #0550ae">AllowedIPs</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.3/32</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #953800">[Interface]</span> +</div><div class="codeblock-line"><span style="color: #0550ae">Address</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.1/32</span> +</div><div class="codeblock-line"><span style="color: #0550ae">SaveConfig</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">true</span> +</div><div class="codeblock-line"><span style="color: #0550ae">PrivateKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><サーバの秘密鍵></span> +</div><div class="codeblock-line"><span style="color: #0550ae">ListenPort</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">51820</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #953800">[Peer]</span> +</div><div class="codeblock-line"><span style="color: #0550ae">PublicKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><クライアント 1 の公開鍵></span> +</div><div class="codeblock-line"><span style="color: #0550ae">AllowedIPs</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.2/32</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #953800">[Peer]</span> +</div><div class="codeblock-line"><span style="color: #0550ae">PublicKey</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069"><クライアント 2 の公開鍵></span> +</div><div class="codeblock-line"><span style="color: #0550ae">AllowedIPs</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">=</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0a3069">10.10.1.3/32</span></div></code></pre> </div> <p> 次に、WireGuard のサービスを起動する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ sudo systemctl enable wg-quick@wg0 -$ sudo systemctl start wg-quick@wg0 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ sudo systemctl enable wg-quick@wg0 +</div><div class="codeblock-line">$ sudo systemctl start wg-quick@wg0</div></code></pre> </div> </section> <section id="section--configure-firewall"> @@ -204,26 +197,23 @@ $ sudo systemctl start wg-quick@wg0 続けてファイアウォールを設定する。まずは WireGuard が使用する UDP のポートを開き、<code>wg0</code> を通る通信を許可する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ sudo ufw allow 51820/udp -$ sudo ufw allow in on wg0 -$ sudo ufw allow out on wg0 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ sudo ufw allow 51820/udp +</div><div class="codeblock-line">$ sudo ufw allow in on wg0 +</div><div class="codeblock-line">$ sudo ufw allow out on wg0</div></code></pre> </div> <p> 次に、80 や 443 などの必要なポートについて、<code>wg0</code> を経由してのアクセスのみ許可する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ sudo ufw allow in on wg0 to any port 80 proto tcp -$ sudo ufw allow in on wg0 to any port 443 proto tcp -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ sudo ufw allow in on wg0 to any port 80 proto tcp +</div><div class="codeblock-line">$ sudo ufw allow in on wg0 to any port 443 proto tcp</div></code></pre> </div> <p> 最後に、<code>ufw</code> を有効にする。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ sudo ufw status -$ sudo ufw enable -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ sudo ufw status +</div><div class="codeblock-line">$ sudo ufw enable</div></code></pre> </div> </section> <section id="section--connect-each-other"> diff --git a/services/nuldoc/public/blog/posts/2024-02-10/yapcjapan-2024-report/index.html b/services/nuldoc/public/blog/posts/2024-02-10/yapcjapan-2024-report/index.html index 2040806a..3563c3aa 100644 --- a/services/nuldoc/public/blog/posts/2024-02-10/yapcjapan-2024-report/index.html +++ b/services/nuldoc/public/blog/posts/2024-02-10/yapcjapan-2024-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>YAPC::Hiroshima 2024 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2024-02-22/phpkansai-2024-report/index.html b/services/nuldoc/public/blog/posts/2024-02-22/phpkansai-2024-report/index.html index cfe88e49..cadb6c54 100644 --- a/services/nuldoc/public/blog/posts/2024-02-22/phpkansai-2024-report/index.html +++ b/services/nuldoc/public/blog/posts/2024-02-22/phpkansai-2024-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPカンファレンス関西 2024 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2024-03-17/phperkaigi-2024-report/index.html b/services/nuldoc/public/blog/posts/2024-03-17/phperkaigi-2024-report/index.html index 1e0f129d..26eb9c8d 100644 --- a/services/nuldoc/public/blog/posts/2024-03-17/phperkaigi-2024-report/index.html +++ b/services/nuldoc/public/blog/posts/2024-03-17/phperkaigi-2024-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2024 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2024-03-20/my-bucket-list/index.html b/services/nuldoc/public/blog/posts/2024-03-20/my-bucket-list/index.html index b23b1392..716b280e 100644 --- a/services/nuldoc/public/blog/posts/2024-03-20/my-bucket-list/index.html +++ b/services/nuldoc/public/blog/posts/2024-03-20/my-bucket-list/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>死ぬまでに作る自作○○一覧あるいは人生の TODO リスト|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2024-04-14/phpcon-odawara-2024-report/index.html b/services/nuldoc/public/blog/posts/2024-04-14/phpcon-odawara-2024-report/index.html index 42d76723..d11414dc 100644 --- a/services/nuldoc/public/blog/posts/2024-04-14/phpcon-odawara-2024-report/index.html +++ b/services/nuldoc/public/blog/posts/2024-04-14/phpcon-odawara-2024-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP カンファレンス小田原 2024 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/index.html b/services/nuldoc/public/blog/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/index.html index 97ea0199..8d2370e6 100644 --- a/services/nuldoc/public/blog/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/index.html +++ b/services/nuldoc/public/blog/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -116,15 +116,14 @@ 例: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #116329">hello-world</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #116329">stage</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">test</span> - <span style="color: #116329">image</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">alpine:latest</span> - <span style="color: #116329">script</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">echo</span><span style="color: #0550ae"> </span><span style="color: #0a3069">"Hello,</span><span style="color: #0550ae"> </span><span style="color: #0a3069">World!"'</span> - <span style="color: #116329">rules</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #116329">if</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">$CI_MERGE_REQUEST_IID'</span> - <span style="color: #116329">when</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">always</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #116329">hello-world</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #116329">stage</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">test</span> +</div><div class="codeblock-line"> <span style="color: #116329">image</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">alpine:latest</span> +</div><div class="codeblock-line"> <span style="color: #116329">script</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">echo</span><span style="color: #0550ae"> </span><span style="color: #0a3069">"Hello,</span><span style="color: #0550ae"> </span><span style="color: #0a3069">World!"'</span> +</div><div class="codeblock-line"> <span style="color: #116329">rules</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #116329">if</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">$CI_MERGE_REQUEST_IID'</span> +</div><div class="codeblock-line"> <span style="color: #116329">when</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">always</span></div></code></pre> </div> <p> ここで、<code>script</code> に指定したコマンドが失敗する (exit status が 0 以外になる) と、即座に実行が停止され、ジョブは失敗する。 @@ -133,15 +132,14 @@ では、次のようなケースだとどうなるか。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #116329">hello-world</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #116329">stage</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">test</span> - <span style="color: #116329">image</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">alpine:latest</span> - <span style="color: #116329">script</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">exit</span><span style="color: #0550ae"> </span><span style="color: #0a3069">1</span><span style="color: #0550ae"> </span><span style="color: #0a3069">|</span><span style="color: #0550ae"> </span><span style="color: #0a3069">exit</span><span style="color: #0550ae"> </span><span style="color: #0a3069">0'</span> - <span style="color: #116329">rules</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #116329">if</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">$CI_MERGE_REQUEST_IID'</span> - <span style="color: #116329">when</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">always</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #116329">hello-world</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #116329">stage</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">test</span> +</div><div class="codeblock-line"> <span style="color: #116329">image</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">alpine:latest</span> +</div><div class="codeblock-line"> <span style="color: #116329">script</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">exit</span><span style="color: #0550ae"> </span><span style="color: #0a3069">1</span><span style="color: #0550ae"> </span><span style="color: #0a3069">|</span><span style="color: #0550ae"> </span><span style="color: #0a3069">exit</span><span style="color: #0550ae"> </span><span style="color: #0a3069">0'</span> +</div><div class="codeblock-line"> <span style="color: #116329">rules</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #116329">if</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">$CI_MERGE_REQUEST_IID'</span> +</div><div class="codeblock-line"> <span style="color: #116329">when</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">always</span></div></code></pre> </div> <p> 失敗するコマンドをパイプに接続した。通常 Bash では、パイプの最後のコマンドの exit code が全体の exit code になる。 @@ -153,11 +151,10 @@ 前述したようなケースにおいて、途中で失敗したときに全体を失敗させるには、<code>pipefail</code> オプションを有効にする。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># On にする</span> -<span style="color: #953800">set</span> <span style="color: #116329">-o</span> pipefail -<span style="color: #6e7781"># Off にする</span> -<span style="color: #953800">set</span> +o pipefail -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># On にする</span> +</div><div class="codeblock-line"><span style="color: #953800">set</span> <span style="color: #116329">-o</span> pipefail +</div><div class="codeblock-line"><span style="color: #6e7781"># Off にする</span> +</div><div class="codeblock-line"><span style="color: #953800">set</span> +o pipefail</div></code></pre> </div> <p> こうすると、パイプ全体が失敗するようになる。この設定は、デフォルトだと off になっている。 @@ -170,15 +167,14 @@ 次のような GitLab CI/CD ジョブが失敗してしまった。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #116329">hoge</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #116329">stage</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">test</span> - <span style="color: #116329">image</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">alpine:latest</span> - <span style="color: #116329">script</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">cat</span><span style="color: #0550ae"> </span><span style="color: #0a3069">hoge.txt</span><span style="color: #0550ae"> </span><span style="color: #0a3069">|</span><span style="color: #0550ae"> </span><span style="color: #0a3069">grep</span><span style="color: #0550ae"> </span><span style="color: #0a3069">piyo</span><span style="color: #0550ae"> </span><span style="color: #0a3069">|</span><span style="color: #0550ae"> </span><span style="color: #0a3069">sed</span><span style="color: #0550ae"> </span><span style="color: #0a3069">-e</span><span style="color: #0550ae"> </span><span style="color: #0a3069">"s/foo/bar/g"'</span> - <span style="color: #116329">rules</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #116329">if</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">$CI_MERGE_REQUEST_IID'</span> - <span style="color: #116329">when</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">always</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #116329">hoge</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #116329">stage</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">test</span> +</div><div class="codeblock-line"> <span style="color: #116329">image</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">alpine:latest</span> +</div><div class="codeblock-line"> <span style="color: #116329">script</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">cat</span><span style="color: #0550ae"> </span><span style="color: #0a3069">hoge.txt</span><span style="color: #0550ae"> </span><span style="color: #0a3069">|</span><span style="color: #0550ae"> </span><span style="color: #0a3069">grep</span><span style="color: #0550ae"> </span><span style="color: #0a3069">piyo</span><span style="color: #0550ae"> </span><span style="color: #0a3069">|</span><span style="color: #0550ae"> </span><span style="color: #0a3069">sed</span><span style="color: #0550ae"> </span><span style="color: #0a3069">-e</span><span style="color: #0550ae"> </span><span style="color: #0a3069">"s/foo/bar/g"'</span> +</div><div class="codeblock-line"> <span style="color: #116329">rules</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #116329">if</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">$CI_MERGE_REQUEST_IID'</span> +</div><div class="codeblock-line"> <span style="color: #116329">when</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">always</span></div></code></pre> </div> <p> <code>grep</code> コマンドは、パターンにマッチする行が一行もなかったとき、exit code 1 を返す。よって、<code>pipefail</code> が on になっていると、このジョブは失敗する。現在の <code>pipefail</code> がどうなっているか確かめるため <code>set +o</code> で全オプションを出力させたところ、<code>pipefail</code> が on になっていた。 @@ -187,21 +183,20 @@ しかし、先述したように Bash における <code>pipefail</code> のデフォルト値は off のはずだ。実際に、ローカルで <code>alpine:latest</code> を動かしてみたところ、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ docker run --rm alpine:latest sh -c "set +o" -set +o errexit -set +o noglob -set +o ignoreeof -set +o monitor -set +o noexec -set +o xtrace -set +o verbose -set +o noclobber -set +o allexport -set +o notify -set +o nounset -set +o vi -set +o pipefail -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ docker run --rm alpine:latest sh -c "set +o" +</div><div class="codeblock-line">set +o errexit +</div><div class="codeblock-line">set +o noglob +</div><div class="codeblock-line">set +o ignoreeof +</div><div class="codeblock-line">set +o monitor +</div><div class="codeblock-line">set +o noexec +</div><div class="codeblock-line">set +o xtrace +</div><div class="codeblock-line">set +o verbose +</div><div class="codeblock-line">set +o noclobber +</div><div class="codeblock-line">set +o allexport +</div><div class="codeblock-line">set +o notify +</div><div class="codeblock-line">set +o nounset +</div><div class="codeblock-line">set +o vi +</div><div class="codeblock-line">set +o pipefail</div></code></pre> </div> <p> 確かに <code>pipefail</code> は無効になっている。 @@ -216,10 +211,9 @@ set +o pipefail <code>.gitlab-ci.yml</code> で明示的には書いていないので、GitLab Runner (GitLab CI/CD のスクリプトを実行するプログラム) が勝手に追加しているに違いない。そう仮説を立てて <a href="https://gitlab.com/gitlab-org/gitlab-runner" rel="noreferrer" target="_blank">GitLab Runner のリポジトリ</a> を調査したところ、 <a href="https://gitlab.com/gitlab-org/gitlab-runner/-/blob/c75da0796a0e3048991dccfdf2784e3d931beda4/shells/bash.go#L276" rel="noreferrer" target="_blank">ソースコード中の以下の箇所</a> で <code>set -o pipefail</code> していることが判明した (コメントは筆者による)。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">// pipefail オプションが存在しない環境にも対応するため、</span> -<span style="color: #6e7781">// 先に set -o でオプション一覧を表示させたあと、set -o pipefail している</span> -<span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">WriteString</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"if set -o | grep pipefail > /dev/null; then set -o pipefail; fi; set -o errexit</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">// pipefail オプションが存在しない環境にも対応するため、</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// 先に set -o でオプション一覧を表示させたあと、set -o pipefail している</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">WriteString</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"if set -o | grep pipefail > /dev/null; then set -o pipefail; fi; set -o errexit</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">)</span></div></code></pre> </div> </section> <section id="section--how-to-solve"> @@ -228,17 +222,16 @@ set +o pipefail 通常の Bash スクリプトを書く場合と同様に、<code>pipefail</code> が on になっていては困る場所だけ off にしてやればよい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code> <span style="color: #116329">hoge</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #116329">stage</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">test</span> - <span style="color: #116329">image</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">alpine:latest</span> - <span style="color: #116329">script</span><span style="color: #24292f;background-color: #f6f8fa">:</span> -<span style="color: #0a3069">+ - 'set +o pipefail'</span> - <span style="color: #0a3069">- 'cat hoge.txt | grep piyo | sed -e "s/foo/bar/g"'</span> -<span style="color: #0a3069">+ - 'set -o pipefail'</span> <span style="color: #6e7781"># この例の場合、ここで終わりなので戻さなくてもよい</span> - <span style="color: #116329">rules</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #116329">if</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">$CI_MERGE_REQUEST_IID'</span> - <span style="color: #116329">when</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">always</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> <span style="color: #116329">hoge</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #116329">stage</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">test</span> +</div><div class="codeblock-line"> <span style="color: #116329">image</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">alpine:latest</span> +</div><div class="codeblock-line"> <span style="color: #116329">script</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"><span style="color: #0a3069">+ - 'set +o pipefail'</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">- 'cat hoge.txt | grep piyo | sed -e "s/foo/bar/g"'</span> +</div><div class="codeblock-line"><span style="color: #0a3069">+ - 'set -o pipefail'</span> <span style="color: #6e7781"># この例の場合、ここで終わりなので戻さなくてもよい</span> +</div><div class="codeblock-line"> <span style="color: #116329">rules</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #116329">if</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">'</span><span style="color: #0a3069">$CI_MERGE_REQUEST_IID'</span> +</div><div class="codeblock-line"> <span style="color: #116329">when</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0a3069">always</span></div></code></pre> </div> </section> <section id="section--remarks"> diff --git a/services/nuldoc/public/blog/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/index.html b/services/nuldoc/public/blog/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/index.html index 065a11da..118c0d58 100644 --- a/services/nuldoc/public/blog/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/index.html +++ b/services/nuldoc/public/blog/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -116,12 +116,11 @@ このことは、先ほどリンクを載せた <code>_composer</code> 関数を定義しているファイルの冒頭にも書かれている。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># - @todo We don't complete custom commands (including script aliases). This is</span> -<span style="color: #6e7781"># easy to do in the general case, but it probably requires some clever caching</span> -<span style="color: #6e7781"># to avoid introducing a noticeable lag to every completion operation, due to</span> -<span style="color: #6e7781"># the way command resolution works and the fact that discovering custom</span> -<span style="color: #6e7781"># commands requires making slow calls to Composer</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># - @todo We don't complete custom commands (including script aliases). This is</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># easy to do in the general case, but it probably requires some clever caching</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># to avoid introducing a noticeable lag to every completion operation, due to</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># the way command resolution works and the fact that discovering custom</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># commands requires making slow calls to Composer</span></div></code></pre> </div> </section> <section id="section--what-i-want-to-achive"> @@ -139,8 +138,7 @@ まずは、Zsh で補完関数を提供する場合のボイラープレートコードを書く。以下は <code>~/.zshrc</code> にすべて書く前提だが、<code>autoload</code> を設定するなどすれば別ファイルに分離できる (詳細な手順は割愛)。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>compdef _my_composer composer composer.phar -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">compdef _my_composer composer composer.phar</div></code></pre> </div> <p> <code>compdef</code> は Zsh が用意している関数で、第一引数に補完関数の名前、第二引数以降に補完を適用するコマンド名を並べる。この場合は、<code>composer</code> コマンドや <code>composer.phar</code> コマンドに対して <code>_my_composer</code> を使って補完をおこなうよう定義している。 @@ -149,10 +147,9 @@ 次に <code>_my_composer</code> を定義する。基本的にはデフォルトの <code>composer</code> コマンドの補完関数 (つまり <code>_composer</code> 関数) を使い、それが何も返さなかった場合に限り、Zsh のファイル・ディレクトリ補完へフォールバックする。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">function </span>_my_composer<span style="color: #0550ae">()</span> <span style="color: #0550ae">{</span> - _composer <span style="color: #0a3069">"</span><span style="color: #0550ae">$@</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">||</span> _files <span style="color: #0a3069">"</span><span style="color: #0550ae">$@</span><span style="color: #0a3069">"</span> -<span style="color: #0550ae">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">function </span>_my_composer<span style="color: #0550ae">()</span> <span style="color: #0550ae">{</span> +</div><div class="codeblock-line"> _composer <span style="color: #0a3069">"</span><span style="color: #0550ae">$@</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">||</span> _files <span style="color: #0a3069">"</span><span style="color: #0550ae">$@</span><span style="color: #0a3069">"</span> +</div><div class="codeblock-line"><span style="color: #0550ae">}</span></div></code></pre> </div> <p> <code>_composer</code> コマンドは何も補完候補がなかったとき非ゼロな exit status で終了するので、そうであったなら <code>_files</code> を呼び出す。<code>_files</code> は、Zsh がデフォルトで用意しているファイル・ディレクトリの補完をおこなう関数である。 diff --git a/services/nuldoc/public/blog/posts/2024-05-11/phpconkagawa-2024-report/index.html b/services/nuldoc/public/blog/posts/2024-05-11/phpconkagawa-2024-report/index.html index 7f4108cf..d04b02c4 100644 --- a/services/nuldoc/public/blog/posts/2024-05-11/phpconkagawa-2024-report/index.html +++ b/services/nuldoc/public/blog/posts/2024-05-11/phpconkagawa-2024-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP カンファレンス香川 2024 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2024-06-19/scalamatsuri-2024-report/index.html b/services/nuldoc/public/blog/posts/2024-06-19/scalamatsuri-2024-report/index.html index ed185463..558ffbcb 100644 --- a/services/nuldoc/public/blog/posts/2024-06-19/scalamatsuri-2024-report/index.html +++ b/services/nuldoc/public/blog/posts/2024-06-19/scalamatsuri-2024-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>ScalaMatsuri 2024 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2024-07-19/reparojson-fix-only-json-formatter/index.html b/services/nuldoc/public/blog/posts/2024-07-19/reparojson-fix-only-json-formatter/index.html index 4856480e..009ca8f9 100644 --- a/services/nuldoc/public/blog/posts/2024-07-19/reparojson-fix-only-json-formatter/index.html +++ b/services/nuldoc/public/blog/posts/2024-07-19/reparojson-fix-only-json-formatter/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>reparojson: 文法エラーを直すだけの JSON フォーマッタを作った|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -106,18 +106,17 @@ 次のように動作する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ echo '[ 1 2 ]' | reparojson -[ 1, 2 ] - -$ echo '[ 1, 2, ]' | reparojson -[ 1, 2 ] - -$ echo '{ "foo": 1 "bar": 2 }' | reparojson -{ "foo": 1, "bar": 2 } - -$ echo '{ "foo": 1, "bar": 2, }' | reparojson -{ "foo": 1, "bar": 2 } -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ echo '[ 1 2 ]' | reparojson +</div><div class="codeblock-line">[ 1, 2 ] +</div><div class="codeblock-line"> +</div><div class="codeblock-line">$ echo '[ 1, 2, ]' | reparojson +</div><div class="codeblock-line">[ 1, 2 ] +</div><div class="codeblock-line"> +</div><div class="codeblock-line">$ echo '{ "foo": 1 "bar": 2 }' | reparojson +</div><div class="codeblock-line">{ "foo": 1, "bar": 2 } +</div><div class="codeblock-line"> +</div><div class="codeblock-line">$ echo '{ "foo": 1, "bar": 2, }' | reparojson +</div><div class="codeblock-line">{ "foo": 1, "bar": 2 }</div></code></pre> </div> <p> バージョン 0.1.1 時点で修正対象の文法エラーは次のとおり: @@ -149,34 +148,33 @@ $ echo '{ "foo": 1, "bar": 2, }' | reparojson ここでは、 <a href="https://github.com/neovim/nvim-lspconfig" rel="noreferrer" target="_blank">nvim-lspconfig</a> と <a href="https://github.com/mattn/efm-langserver" rel="noreferrer" target="_blank">efm-langserver</a> を用いた設定例を紹介する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">lspconfig</span> <span style="color: #0550ae">=</span> <span style="color: #953800">require</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'lspconfig'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - - <span style="color: #24292f;background-color: #f6f8fa">lspconfig</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">efm</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">setup</span><span style="color: #24292f;background-color: #f6f8fa">({</span> - <span style="color: #24292f;background-color: #f6f8fa">init_options</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">documentFormatting</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span> <span style="color: #24292f;background-color: #f6f8fa">},</span> - <span style="color: #24292f;background-color: #f6f8fa">settings</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">rootMarkers</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">".git/"</span><span style="color: #24292f;background-color: #f6f8fa">},</span> - <span style="color: #24292f;background-color: #f6f8fa">languages</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">json</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">formatCommand</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"reparojson -q"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">formatStdin</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">},</span> - <span style="color: #24292f;background-color: #f6f8fa">},</span> - <span style="color: #24292f;background-color: #f6f8fa">},</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">})</span> - - <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">api</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">nvim_create_autocmd</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'LspAttach'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">callback</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">function</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">api</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">nvim_create_autocmd</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'BufWritePre'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">buffer</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">callback</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">function</span><span style="color: #24292f;background-color: #f6f8fa">()</span> - <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">lsp</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">format</span><span style="color: #24292f;background-color: #f6f8fa">({</span> <span style="color: #24292f;background-color: #f6f8fa">async</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">false</span> <span style="color: #24292f;background-color: #f6f8fa">})</span> - <span style="color: #cf222e">end</span> - <span style="color: #24292f;background-color: #f6f8fa">})</span> - <span style="color: #cf222e">end</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">})</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> <span style="color: #cf222e">local</span> <span style="color: #24292f;background-color: #f6f8fa">lspconfig</span> <span style="color: #0550ae">=</span> <span style="color: #953800">require</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'lspconfig'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">lspconfig</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">efm</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">setup</span><span style="color: #24292f;background-color: #f6f8fa">({</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">init_options</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">documentFormatting</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span> <span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">settings</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">rootMarkers</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">".git/"</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">languages</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">json</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">formatCommand</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"reparojson -q"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">formatStdin</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">})</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">api</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">nvim_create_autocmd</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'LspAttach'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">callback</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">function</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">api</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">nvim_create_autocmd</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'BufWritePre'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">buffer</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">callback</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">function</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">vim</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">lsp</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #24292f;background-color: #f6f8fa">format</span><span style="color: #24292f;background-color: #f6f8fa">({</span> <span style="color: #24292f;background-color: #f6f8fa">async</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">false</span> <span style="color: #24292f;background-color: #f6f8fa">})</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">})</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">})</span></div></code></pre> </div> <p> ほとんどは nvim-lspconfig と efm-langserver を使う際のボイラープレートだが、<code>formatCommand</code> で <code>-q</code> フラグを指定していることに注意してほしい。このツールは、デフォルトでは JSON が修正された場合 exit code 1 で終了する。これは、入力が最初から正しかった場合と修正して正しくなった場合を区別するためだが、異常終了してしまうと置き換えが発生しない。そのため、<code>-q</code> フラグを指定して、修正されたときも exit code 0 で終了するようにしている。 @@ -188,31 +186,28 @@ $ echo '{ "foo": 1, "bar": 2, }' | reparojson このツールが威力を発揮するのは、行の入れ換え時である。次のような JSON があり、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa"> - </span><span style="color: #0550ae">"a"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa"> - </span><span style="color: #0550ae">"b"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">false</span><span style="color: #24292f;background-color: #f6f8fa"> - </span><span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">"a"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">"b"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">false</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 2行目と3行目を入れ換えて以下のように編集した。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa"> - </span><span style="color: #0550ae">"b"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">false</span><span style="color: #24292f;background-color: #f6f8fa"> - </span><span style="color: #0550ae">"a"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa"> - </span><span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">"b"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">false</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">"a"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> これは不正な JSON だが、このツールを通せば次のようになる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa"> - </span><span style="color: #0550ae">"b"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">false</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa"> - </span><span style="color: #0550ae">"a"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa"> - </span><span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">"b"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">false</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">"a"</span><span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #0550ae">true</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa"> </span><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> もちろん、このような操作を文法を壊さずにおこなう Vim プラグインは存在する。しかし、単なる行の入れ換えであれば <code>ddp</code> の3ストロークでおこなうことができ、専用のキーバインドを覚える必要もない。このツールを用いることで、より Vimmer-friendly な JSON 編集が可能となる。 diff --git a/services/nuldoc/public/blog/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html b/services/nuldoc/public/blog/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html index 5bdb0cc9..951f1c81 100644 --- a/services/nuldoc/public/blog/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html +++ b/services/nuldoc/public/blog/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Go】 text/template の with や range の内側から外側の "." にアクセスする|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -90,20 +90,19 @@ Go には、標準ライブラリにテンプレートライブラリ <code>text/template</code> がある。この <code>text/template</code> における制御構造、<code>with</code> と <code>range</code> は次のように使われる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code># {{ .Title }} - -# User - -{{ with .User }} - {{ .Name }} ({{ .ID }}) -{{ end }} - -# Items - -{{ range .Items }} - - {{ . }} -{{ end }} -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"># {{ .Title }} +</div><div class="codeblock-line"> +</div><div class="codeblock-line"># User +</div><div class="codeblock-line"> +</div><div class="codeblock-line">{{ with .User }} +</div><div class="codeblock-line"> {{ .Name }} ({{ .ID }}) +</div><div class="codeblock-line">{{ end }} +</div><div class="codeblock-line"> +</div><div class="codeblock-line"># Items +</div><div class="codeblock-line"> +</div><div class="codeblock-line">{{ range .Items }} +</div><div class="codeblock-line"> - {{ . }} +</div><div class="codeblock-line">{{ end }}</div></code></pre> </div> <p> <code>text/template</code> の <code>.</code> は、現在の操作対象を表す特殊なオブジェクトである。 @@ -115,19 +114,18 @@ つまりこのテンプレートは、次のような構造をレンダリングしている (<code>Execute()</code> の第2引数)。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">tmpl</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Execute</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">out</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Params</span><span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">Title</span><span style="color: #0550ae">:</span> <span style="color: #0a3069">"foo"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">User</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">User</span><span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">ID</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">123</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">Name</span><span style="color: #0550ae">:</span> <span style="color: #0a3069">"john"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">},</span> - <span style="color: #24292f;background-color: #f6f8fa">Items</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">string</span><span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0a3069">"hoge"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">"piyo"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">"fuga"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">},</span> -<span style="color: #24292f;background-color: #f6f8fa">})</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">tmpl</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Execute</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">out</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Params</span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">Title</span><span style="color: #0550ae">:</span> <span style="color: #0a3069">"foo"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">User</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">User</span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">ID</span><span style="color: #0550ae">:</span> <span style="color: #0550ae">123</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">Name</span><span style="color: #0550ae">:</span> <span style="color: #0a3069">"john"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">Items</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">string</span><span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"hoge"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"piyo"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">"fuga"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">},</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">})</span></div></code></pre> </div> </section> <section id="section--what-i-want-to-do"> @@ -136,14 +134,13 @@ 今回おこないたいのは、<code>with</code> や <code>range</code> の中で、その外側で使われていたトップレベルのオブジェクトを参照することだ。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>{{ with .User }} - ここから .Title を参照するには? -{{ end }} - -{{ range .Items }} - ここから .User を参照するには? -{{ end }} -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">{{ with .User }} +</div><div class="codeblock-line"> ここから .Title を参照するには? +</div><div class="codeblock-line">{{ end }} +</div><div class="codeblock-line"> +</div><div class="codeblock-line">{{ range .Items }} +</div><div class="codeblock-line"> ここから .User を参照するには? +</div><div class="codeblock-line">{{ end }}</div></code></pre> </div> <p> <code>with</code> や <code>range</code> は、<code>.</code> を自身の対象オブジェクトに変更するので、単に <code>{{ with .User }}</code> の中で <code>.Title</code> と書いても、それは <code>User</code> の <code>Title</code> プロパティを参照しているとみなされる。 @@ -152,8 +149,7 @@ <code>text/template</code> では変数が使えるので、テンプレートの先頭で </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>{{ $params := . }} -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">{{ $params := . }}</div></code></pre> </div> <p> とでもしておけば実現は可能である。 @@ -168,14 +164,13 @@ 常にトップレベルを指す特殊変数 <code>$</code> を使えばよい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>{{ with .User }} - {{ $.Title }} -{{ end }} - -{{ range .Items }} - {{ $.User.Name }} -{{ end }} -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">{{ with .User }} +</div><div class="codeblock-line"> {{ $.Title }} +</div><div class="codeblock-line">{{ end }} +</div><div class="codeblock-line"> +</div><div class="codeblock-line">{{ range .Items }} +</div><div class="codeblock-line"> {{ $.User.Name }} +</div><div class="codeblock-line">{{ end }}</div></code></pre> </div> <p> <code>$</code> は、テンプレートが実行されるときに渡されたオブジェクトを指す。これを使えば現在の <code>.</code> に関係なくトップレベルを参照できる。 diff --git a/services/nuldoc/public/blog/posts/2024-09-28/mncore-challenge-1/index.html b/services/nuldoc/public/blog/posts/2024-09-28/mncore-challenge-1/index.html index 3e0d0fef..c7e54b71 100644 --- a/services/nuldoc/public/blog/posts/2024-09-28/mncore-challenge-1/index.html +++ b/services/nuldoc/public/blog/posts/2024-09-28/mncore-challenge-1/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>MN-Core Challenge #1 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2024-12-04/cohackpp-report/index.html b/services/nuldoc/public/blog/posts/2024-12-04/cohackpp-report/index.html index e864775d..15496f4d 100644 --- a/services/nuldoc/public/blog/posts/2024-12-04/cohackpp-report/index.html +++ b/services/nuldoc/public/blog/posts/2024-12-04/cohackpp-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>紅白ぺぱ合戦に参加&LTしました|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -157,130 +157,129 @@ <a class="url" href="https://github.com/nsfisis/cohackpp/blob/main/congrats.php" rel="noreferrer" target="_blank">https://github.com/nsfisis/cohackpp/blob/main/congrats.php</a> </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> -<span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069"><<<'Q' -<?php -% -$s=<<<'Q' -@$c=[`]; -$m="";for($k=0;$k<min(13,intdiv(__LINE__-119,80)+1);$k++){$C=str_replace("\n","", -$c[$k]);$f=!0;foreach(str_split(base64_decode($C))as$l){$L=ord($l);$m.=str_repeat -($f?"#":chr(32),$L&127);$f=!$f;if($L&128){$m.="\n";$f=!0;continue;}}}print( -str_replace([chr(96),chr(37),chr(64)],[implode("\n",array_map(fn($C)=>"'".trim( -chunk_split(str_replace("\n","",$C),80,"\n"))."',",$c)),"\n{$m}","{$s}\nQ;\n"],$s)); -Q;</span> -<span style="color: #0550ae">$c</span><span style="color: #0550ae">=</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFEAgiBAUIECIEBQwQHgQE8AQYFBoEBOgQGBAaBAToEBwQFgQE6BQYFBIEB -OwQHBASBATwEBgUDgQE8BQYEA4EBPQQGBAOBAT0FBgEFgQERBhsIBAQMgQERKQQFC4EBESkFAQ6BAREp -FIEBESkUgQERKRSBAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6B -AU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAQ4EPIEBDQY7gQENBjuBAQ0GO4EBDQU8gQENBTyBAQwG -PIEBDAY8gQEMBjyBAQwGPIEBDAY8gQEMBjyBAQwHO4EBDAc7gQENBzqBAQ0IOYEBDgg4gQEOCiUCD4EB -DwwdBw+BARAQDhEPgQERLg+BARItD4EBFCsPgQEXJRKBARsbGIEBToEBToEBToEBToEBToHQ'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQEPASMFFoEBDwMhBRaBAQ4FIAUWgQEOBSAFFoEBDQUhBRaBAQ0FIQUWgQEMBSIFFoEB -DAUiBRaBAQsFIwUWgQELBQgBGgUWgQEKBQkDGAUWgQEKBQgGBCoDgQEJBQkFBSoDgQEFAQMECQYFKgOB -AQQDAQUJBQYqA4EBBAgJBQcqA4EBAwkJBRkFFoEBBAcJBRoFFoEBBQYIBRsFFoEBBgYHBRsFFoEBBwYF -BRwFFoEBCAYDBR0FFoEBCQYCBR0FFoEBCgseBRaBAQsJHwUWgQEMByAFFoEBDAcFAxgFFoEBDQUFBBgF -FoEBDQQGBRYGFoEBDAUHBAcmBYEBCwUIBQYmBYEBCwQKBAYmBYEBCgQLBQUmBYEBCQUMBS+BAQgFDAYv -gQEDHC+BAQMdLoEBAx0ugQEDHi2BAQMJBAUIBC2BARAFCAQtgQEQBQgELYEBEAUJAS+BARAFESEHgQEQ -BREhB4EBBwEIBQYBCiEHgQEHBAUFBAQJIQeBAQcEBQUEBAkEGAUHgQEGBQUFBAUIBBgFB4EBBgUFBQUE -CAQYBQeBAQYFBQUFBAgEGAUHgQEGBAYFBQUHBBgFB4EBBgQGBQYEBwQYBQeBAQUFBgUGBQYEGAUHgQEF -BQYFBwQGBBgFB4EBBQQHBQcEBgQYBQeBAQUEBwUHBQUEGAUHgQEEBQcFBwUFBBgFB4EBBAUHBQgEBQQY -BQeBAQQECAUIBAUEGAUHgQEDBQgFCAEIBBgFB4EBAwUIBREEGAUHgQECBQkFEQQYBQeBAQIFCQURIQeB -AQQCCgURIQeBARAFESEHgQEQBREhB4EBEAURIQeBARAFEQQYBQeBARAFEQQYBQeBARAFEQQYBQeBARAF -EQQYBQeBAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQEOAjEBDIEBDgUqBwqBAQ0FJwwJgQENBSETCIEBDQURAQcXDIEBDQURGxCBAQ0FERcU -gQENBBIOBAUUgQEMBRIGDAUUgQEMBRIFDQUUgQEMBRIFDgQUgQEMBRIFDgQUgQEMBBMFDgQUgQELBRMF -DgQUgQELBRMFDgUTgQELBRMFDgUTgQEDGQcFDgUTgQEDGwUoA4EBAxsFKAOBAQMbBSgDgQEDGwUoA4EB -CgUKBQUFDwUSgQEKBAsEBgUQBBKBAQkFCwQGBRAFEYEBCQULBAYFEAURgQEJBQoFBgUQBRGBAQkFCgUG -BREFEIEBCQQLBQYFEQUQgQEIBQsFBgUSBQkBBYEBCAULBQYFEgUJAwOBAQgFCwUGBQoFBAUIBAKBAQgF -CwQHBQQLBAYHAwOBAQgECwUHFAUGBQQDgQEHBQsFAxgFBwQEA4EBBwULBQMVCQ4DgQEHBQsFAw8QDQOB -AQcEDAUDCRcLBIEBBgULBQUCHwgFgQEGBQsFKAQHgQEGBQsFM4EBBgULBTOBAQYFCgUKIgiBAQUHCQUK -IgiBAQUICAUKIgiBAQUKBgUKIgiBAQULBAULBRgFCIEBBA0DBQsFGAUIgQEEBQIHAgULBRgFCIEBBgMD -DAwFGAUIgQENCwwFGAUIgQEOCgwFGAUIgQEQBw0FGAUIgQERBwwFGAUIgQERCAsiCIEBEAoKIgiBARAL -CSIIgQEPDQgiCIEBDwUCBwcFGAUIgQEOBgMHBgUYBQiBAQ0GBQcFBRgFCIEBDAcGBgUFGAUIgQELBwgE -BgUYBQiBAQoHCgMGBRgFCIEBCQcMAQcFGAUIgQEIBxUFGAUIgQEHCBUiCIEBBggWIgiBAQQJFyIIgQEF -BxgiCIEBBQUaBRgFCIEBBgMbBRgFCIEBJAUYBQiBAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQEZBi+BARkGL4EBGgUvgQEaBS+BARoFL4EBGgUvgQEaBS+BARoF -L4EBGgUvgQEaBRkBFYEBGgUZAxOBARoFDwEIBRKBARoFCwUIBxCBARoFBgoHCg6BARoVCQkNgQEJJgsJ -C4EBCSYMCQqBAQohEgkIgQEKGxoIB4EBChUhCQWBARkFIwkEgQEZBSUGBYEBGQUmBAaBARkFKAIGgQEZ -BTCBARkFMIEBGQUwgQEZBTCBARkFMIEBGQUwgQEZBTCBARkFCRAXgQEZBQQYFIEBGSMSgQEZJBGBARkS -CAwPgQEXDhIJDoEBFQwYCA2BARMMGwcNgQESDB0HDIEBEA4eBgyBAQ8IAwQfBguBAQ4IBAQfBguBAQ0H -BgQgBQuBAQwHBwQgBQuBAQsHCAUfBQuBAQoGCgUfBQuBAQoGCgUfBQuBAQkGCwUfBQuBAQkFDAUeBguB -AQgGDAUeBguBAQgGDAUdBwuBAQgGDAUdBgyBAQgGDAUcBwyBAQkFDAUbBw2BAQkGCwUZCQ2BAQkHCgUY -CQ6BAQoIBwYVCw+BAQsIBQcSDRCBAQwSChURgQENEQoTE4EBDhAKERWBARANDA4XgQESCwwLGoEBFQYO -BSCBAU6BAU6BAU6BAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQEuBhqBAS4FG4EBLgUbgQEuBRuBARICGQYbgQEPBRkGG4EBDgYZ -BRyBAQ8FGQUcgQEPBhgFHIEBDwYXBhyBARAFFwUdgQEQBRcFHYEBEAYNERqBAREFChcXgQERBQccFYEB -EQYEIBOBARIFAg4DExGBARIRBwYEChCBARIOCgUHCQ+BARMKDQUJCA6BARIJDgYKCA2BAREIEAUNBwyB -ARAJEAUOBgyBAQ8KDwYPBguBAQ4MDgUQBwqBAQ4MDgURBgqBAQ0GAgYMBRMFCoEBDAYEBQwFEwYJgQEM -BgQFCwYTBgmBAQsGBQYKBRUFCYEBCgYHBQkGFQYIgQEKBQgGCAYVBgiBAQkGCQUIBRcFCIEBCQUKBgYG -FwUIgQEJBQsFBgUYBQiBAQgFDAYEBhgFCIEBCAUNBQMGGQUIgQEIBQ0GAgYZBQiBAQcFDwwaBQiBAQcF -DwwaBQiBAQcFEAobBQiBAQcFEAoaBgiBAQcFEQgbBgiBAQcFEgYcBgiBAQcFEQgbBQmBAQcFEAoZBgmB -AQcFEAoZBgmBAQcFDwwXBgqBAQcFDg4VBwqBAQcGDAcCBxQGC4EBCAULBwQEFQcLgQEIBggIBgIVBwyB -AQgIBAkHARUHDYEBCRMcCQ2BAQoRHAkOgQELDhwKD4EBDAwbChGBAQ4HGwwSgQEsDxOBASgRFYEBKQ4X -gQEpDBmBASoIHIEBKwMggQFOgQFOgQFOgQFOgQFOgQFOgQFOgdA='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQE1DwqBASkbCoEBHiYKgQETMQqBAQc9CoEBBjQU -gQEGIQQKGYEBBhcOBxyBAQcOFAcegQEHBhsHH4EBJwYhgQEmBiKBASUGFgEMgQEkBhUDDIEBIwYWBAuB -ASMGFwQKgQEiBg8DBgQKgQEhBg8EBwQJgQEhBhAEBwQIgQEgBhEFBgQIgQEgBRMEBwQHgQEfBhQEBgUG -gQEfBhQEBwQGgQEfBRYEBgIIgQEeBhYEEIEBHgYXBA+BAR4FGAMQgQEeBSuBAR0GK4EBHQYrgQEdBiuB -AR0GK4EBHQYrgQEdBiuBAR0GK4EBHQYrgQEdBiuBAR4FK4EBHgYqgQEeBiqBAR4HKYEBHwYpgQEfByiB -ASAHJ4EBIAcngQEhByaBASEJJIEBIgkjgQEjCiGBASQLH4EBJQwdgQEmDxmBASgTE4EBKhMRgQErEhGB -AS4PEYEBMAwSgQE0CBKBAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQEXATaBARQENoEBEgY2gQESBzWBARMGNYEBEwc0gQEUBjSB -ARQGNIEBFQYzgQEVBiABEoEBFgYeAxGBARYGHAYQgQEWBxoHEIEBFwYYCg+BARcHFQsQgQEYBhMLEoEB -GAYRCxSBARkGDgsWgQEZBgwLGIEBGgYJCxqBARoHBwocgQEbBgUKHoEBGwcCCiCBARwRIYEBHA8jgQEd -DCWBAR0KJ4EBHAoogQEbCSqBARoILIEBGQgtgQEXCC+BARYIMIEBFQgxgQEVBzKBARQHM4EBEwc0gQES -BzWBARIGNoEBEQY3gQERBjeBAREFOIEBEAY4gQEQBjiBARAGOIEBEAY4gQEQBjiBARAGOIEBEAY4gQEQ -BjiBARAHN4EBEAc3gQERBzaBAREINYEBEgkzgQETCiEDDYEBEw0WCw2BARQtDYEBFisNgQEXKg2BARon -DYEBHSARgQEjDxyBAU6BAU6BAU6BAU6BAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQEXBDOBARcLLIEBFxQjgQEXIRaBARchFoEBGh4WgQEiFhaBASsN -FoEBNgEXgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQEkDR2BAR4WGoEBGR0YgQEVIxaBARApFYEB -DRcLCxSBAQ4QFAkTgQEODBoIEoEBDgkeBxKBAQ4GIgcRgQEPAiYGEYEBNwcQgQE4BhCBATgGEIEBOAYQ -gQE4BhCBATkFEIEBOQUQgQE5BRCBATgGEIEBOAYQgQE4BhCBATgGEIEBNwcQgQE3BhGBATcGEYEBNgcR -gQE1BxKBATUHEoEBNAcTgQEzCBOBATIIFIEBMQgVgQEvCRaBAS4JF4EBLAoYgQEqCxmBAScMG4EBJQ0c -gQEhDx6BARwTH4EBGBQigQEZESSBARoNJ4EBGgoqgQEbBS6BAU6BAU6BAU6BAU6BAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFDAgmBAUEECYEBQgQIgQE7AQYFB4EBOQQGBAeBATkEBwQGgQE5BQYFBYEB -OgQHBAWBATsEBgUEgQE7BQYEBIEBPAQGBASBATwFBgEGgQEQBhsIBAQNgQEQKQQFDIEBECkFAQ+BARAp -FYEBECkVgQEQKRWBAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6B -AU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAQ0EPYEBDAY8gQEMBjyBAQwGPIEBDAU9gQEMBT2BAQsG -PYEBCwY9gQELBj2BAQsGPYEBCwY9gQELBj2BAQsHPIEBCwc8gQEMBzuBAQwIOoEBDQg5gQENCiUCEIEB -DgwdBxCBAQ8QDhEQgQEQLhCBAREtEIEBEysQgQEWJROBARobGYEBToEBToEBToEBToEBToHQ'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFCAwmBAUEECYEBQQUIgQE5AwYFB4EBOAQHBAeBASkCDgQGBQaBASYGDQUGBAaB -ASYGDgQHBAWBASYGDgUGBAWBAScFDwQHBASBAScGDwQGAwWBAScGDwUNgQEoBRAEDYEBKAUQAw6BASgG -IIEBKQUQAw2BASkFDAcNgQEpBgYMDYEBCgMdFw2BAQsVAh8NgQELNQ6BAQsxEoEBCysYgQELJh2BARkI -CwUdgQEsBhyBAS0FHIEBLQUcgQEuBRuBAS4FG4EBLwUagQEvBRqBATAFGYEBMAYYgQExBRiBATEGF4EB -MgUXgQEyBhaBATMGFYEBNAUVgQE0BhSBATUGE4EBEAIWCgMHEoEBEAYSFRGBAQ8GExURgQEPBRQUEoEB -DgYaDROBAQ4GIwQTgQEOBTuBAQ0GO4EBDQY7gQENBTyBAQ0FPIEBDQU8gQENBTyBAQ0FPIEBDQU8gQEN -BjuBAQ0GO4EBDgY6gQEOBzmBAQ4IOIEBDwg3gQEQCh4BFYEBEQwVBxWBARInFYEBEyYVgQEVJBWBARgh -FYEBGxoZgQFOgQFOgQFOgQFOgdA='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQEJBz6BAQkGP4EBCQY/gQEJBigDFIEB -CQYlBhSBAQkGJQcTgQEJBiYHEoEBCQYnBhKBAQkGJwcRgQEJBigGEYEBCQYoBxCBAQkGKQYQgQEJBioG -D4EBCQYqBg+BAQkGKgcOgQEJBisGDoEBCgUrBg6BAQoFLAYNgQEKBSwGDYEBCgUtBgyBAQoFLQYMgQEK -BS0GDIEBCgUuBguBAQoFLgYLgQEKBS4GC4EBCgYtBguBAQoGLgYKgQEKBi4GCoEBCgYuBgqBAQoGLwYJ -gQELBS8GCYEBCwUvBgmBAQsFLwYJgQELBhMBGgYJgQELBhMCGgYIgQELBhMDGQYIgQEMBRMEGAYIgQEM -BhEGFwYIgQEMBhEGFwYIgQEMBhAGGQUIgQENBg8GGQUIgQENBg8GGQUIgQENBg4GGgILgQEOBg0GJ4EB -DgcLBiiBAQ4HCgcogQEPBwgHKYEBEAcGCCmBARAKAQkqgQEREiuBARIRK4EBEhAsgQETDi2BARULLoEB -FwcwgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgdA='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQElBiOBASYFI4EBJgUjgQEmBSOBASYFI4EBJgUjgQEmBSOBASYF -I4EBJgUQBQ6BAQ4IEAUGDw6BAQ4yDoEBDjIOgQEOMg6BAQ4rFYEBGhIigQEmBSOBASYFI4EBJgUjgQEm -BSOBASYFI4EBJgUjgQEmBSOBASYFI4EBJgUjgQEmBRQCDYEBDQMWBQwKDYEBDQ8JHA2BAQ4zDYEBDjMN -gQEOMg6BARAnF4EBJQYjgQEmBSOBASYFI4EBJgUjgQEmBSOBASYFI4EBJgUjgQEmBSOBASYFI4EBJgUj -gQEmBSOBAR0EBQUjgQEXFCOBARQZIYEBEh4egQERIRyBARAJDBAZgQEPBxARF4EBDgYSExWBAQ4FEwYD -CxSBAQ4FEwYFCxKBAQ0FFAYHChGBAQ0FFAYJCg+BAQ0FFAYKCg6BAQ0GEwYMCQ2BAQ4FEwYNCQyBAQ4G -EQYQBg2BAQ4HDwcRBQ2BAQ8IDAgSAw6BAQ8bFAEPgQERGCWBARIWJoEBFBIogQEXDSqBAU6BAU6BAU6B -AU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQEpBh+BASkGH4EBKQYfgQEqBR+BASoFH4EBKgUfgQEqBR+BASoFH4EB -KgUfgQEqBR+BARkuB4EBBkEHgQEHQAeBAQdAB4EBB0AHgQEHDBcFH4EBKgUfgQEqBR+BASoFH4EBKgUf -gQEqBR+BASoFH4EBKgUfgQEgDx+BAR4RH4EBHBMfgQEbFB+BARoIBAkfgQEZBwkGH4EBGQYLBh6BARgG -DQUegQEYBQ4GHYEBFwYPBR2BARcFEAUdgQEXBRAFHYEBFwUQBhyBARcFEAYcgQEXBQ8HHIEBFwUPBxyB -ARcGDgccgQEXBg0IHIEBGAYMBx2BARgHCggdgQEZCAYKHYEBGhcdgQEbFh2BARwVHYEBHgsBBh6BASAG -BAYegQEpBh+BASkGH4EBKAYggQEnByCBASYHIYEBJQcigQEkCCKBASIJI4EBIAokgQEeCyWBARwLJ4EB -GQ0ogQEWDiqBARcMK4EBGAktgQEZBTCBARoCMoEBToEBToEBToEBToEBToEBToHQ'</span><span style="color: #24292f;background-color: #f6f8fa">,];</span> -<span style="color: #0550ae">$m</span><span style="color: #0550ae">=</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">for</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$k</span><span style="color: #0550ae">=</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #0550ae">$k</span><span style="color: #0550ae"><</span><span style="color: #953800">min</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">13</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__LINE__</span><span style="color: #0550ae">-</span><span style="color: #0550ae">119</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">80</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #0550ae">$k</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$C</span><span style="color: #0550ae">=</span><span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -<span style="color: #0550ae">$c</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$k</span><span style="color: #24292f;background-color: #f6f8fa">]);</span><span style="color: #0550ae">$f</span><span style="color: #0550ae">=!</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">foreach</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">base64_decode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$C</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #cf222e">as</span><span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$L</span><span style="color: #0550ae">=</span><span style="color: #953800">ord</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #0550ae">$m</span><span style="color: #0550ae">.</span><span style="color: #0550ae">=</span><span style="color: #953800">str_repeat</span> -<span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$f</span><span style="color: #0550ae">?</span><span style="color: #0a3069">"#"</span><span style="color: #0550ae">:</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">32</span><span style="color: #24292f;background-color: #f6f8fa">),</span><span style="color: #0550ae">$L</span><span style="color: #0550ae">&</span><span style="color: #0550ae">127</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #0550ae">$f</span><span style="color: #0550ae">=!</span><span style="color: #0550ae">$f</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">if</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$L</span><span style="color: #0550ae">&</span><span style="color: #0550ae">128</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$m</span><span style="color: #0550ae">.</span><span style="color: #0550ae">=</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #0550ae">$f</span><span style="color: #0550ae">=!</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;}}}</span><span style="color: #cf222e">print</span><span style="color: #24292f;background-color: #f6f8fa">(</span> -<span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">96</span><span style="color: #24292f;background-color: #f6f8fa">),</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">37</span><span style="color: #24292f;background-color: #f6f8fa">),</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">64</span><span style="color: #24292f;background-color: #f6f8fa">)],[</span><span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$C</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #0a3069">"'"</span><span style="color: #0550ae">.</span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span> -<span style="color: #953800">chunk_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">$C</span><span style="color: #24292f;background-color: #f6f8fa">),</span><span style="color: #0550ae">80</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"',"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">$c</span><span style="color: #24292f;background-color: #f6f8fa">)),</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #24292f">{</span><span style="color: #0550ae">$m</span><span style="color: #24292f">}</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #24292f">{</span><span style="color: #0550ae">$s</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">Q;</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$s</span><span style="color: #0550ae">=</span><span style="color: #0a3069"><<<'Q'</span> +</div><div class="codeblock-line"><span style="color: #0a3069"><?php</span> +</div><div class="codeblock-line"><span style="color: #0a3069">%</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$s=<<<'Q'</span> +</div><div class="codeblock-line"><span style="color: #0a3069">@$c=[`];</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$m="";for($k=0;$k<min(13,intdiv(__LINE__-119,80)+1);$k++){$C=str_replace("\n","",</span> +</div><div class="codeblock-line"><span style="color: #0a3069">$c[$k]);$f=!0;foreach(str_split(base64_decode($C))as$l){$L=ord($l);$m.=str_repeat</span> +</div><div class="codeblock-line"><span style="color: #0a3069">($f?"#":chr(32),$L&127);$f=!$f;if($L&128){$m.="\n";$f=!0;continue;}}}print(</span> +</div><div class="codeblock-line"><span style="color: #0a3069">str_replace([chr(96),chr(37),chr(64)],[implode("\n",array_map(fn($C)=>"'".trim(</span> +</div><div class="codeblock-line"><span style="color: #0a3069">chunk_split(str_replace("\n","",$C),80,"\n"))."',",$c)),"\n{$m}","{$s}\nQ;\n"],$s));</span> +</div><div class="codeblock-line"><span style="color: #0a3069">Q;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$c</span><span style="color: #0550ae">=</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFEAgiBAUIECIEBQwQHgQE8AQYFBoEBOgQGBAaBAToEBwQFgQE6BQYFBIEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">OwQHBASBATwEBgUDgQE8BQYEA4EBPQQGBAOBAT0FBgEFgQERBhsIBAQMgQERKQQFC4EBESkFAQ6BAREp</span> +</div><div class="codeblock-line"><span style="color: #0a3069">FIEBESkUgQERKRSBAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6B</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAQ4EPIEBDQY7gQENBjuBAQ0GO4EBDQU8gQENBTyBAQwG</span> +</div><div class="codeblock-line"><span style="color: #0a3069">PIEBDAY8gQEMBjyBAQwGPIEBDAY8gQEMBjyBAQwHO4EBDAc7gQENBzqBAQ0IOYEBDgg4gQEOCiUCD4EB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DwwdBw+BARAQDhEPgQERLg+BARItD4EBFCsPgQEXJRKBARsbGIEBToEBToEBToEBToEBToHQ'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQEPASMFFoEBDwMhBRaBAQ4FIAUWgQEOBSAFFoEBDQUhBRaBAQ0FIQUWgQEMBSIFFoEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DAUiBRaBAQsFIwUWgQELBQgBGgUWgQEKBQkDGAUWgQEKBQgGBCoDgQEJBQkFBSoDgQEFAQMECQYFKgOB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AQQDAQUJBQYqA4EBBAgJBQcqA4EBAwkJBRkFFoEBBAcJBRoFFoEBBQYIBRsFFoEBBgYHBRsFFoEBBwYF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BRwFFoEBCAYDBR0FFoEBCQYCBR0FFoEBCgseBRaBAQsJHwUWgQEMByAFFoEBDAcFAxgFFoEBDQUFBBgF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">FoEBDQQGBRYGFoEBDAUHBAcmBYEBCwUIBQYmBYEBCwQKBAYmBYEBCgQLBQUmBYEBCQUMBS+BAQgFDAYv</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQEDHC+BAQMdLoEBAx0ugQEDHi2BAQMJBAUIBC2BARAFCAQtgQEQBQgELYEBEAUJAS+BARAFESEHgQEQ</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BREhB4EBBwEIBQYBCiEHgQEHBAUFBAQJIQeBAQcEBQUEBAkEGAUHgQEGBQUFBAUIBBgFB4EBBgUFBQUE</span> +</div><div class="codeblock-line"><span style="color: #0a3069">CAQYBQeBAQYFBQUFBAgEGAUHgQEGBAYFBQUHBBgFB4EBBgQGBQYEBwQYBQeBAQUFBgUGBQYEGAUHgQEF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BQYFBwQGBBgFB4EBBQQHBQcEBgQYBQeBAQUEBwUHBQUEGAUHgQEEBQcFBwUFBBgFB4EBBAUHBQgEBQQY</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BQeBAQQECAUIBAUEGAUHgQEDBQgFCAEIBBgFB4EBAwUIBREEGAUHgQECBQkFEQQYBQeBAQIFCQURIQeB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AQQCCgURIQeBARAFESEHgQEQBREhB4EBEAURIQeBARAFEQQYBQeBARAFEQQYBQeBARAFEQQYBQeBARAF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">EQQYBQeBAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQEOAjEBDIEBDgUqBwqBAQ0FJwwJgQENBSETCIEBDQURAQcXDIEBDQURGxCBAQ0FERcU</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQENBBIOBAUUgQEMBRIGDAUUgQEMBRIFDQUUgQEMBRIFDgQUgQEMBRIFDgQUgQEMBBMFDgQUgQELBRMF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DgQUgQELBRMFDgUTgQELBRMFDgUTgQEDGQcFDgUTgQEDGwUoA4EBAxsFKAOBAQMbBSgDgQEDGwUoA4EB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">CgUKBQUFDwUSgQEKBAsEBgUQBBKBAQkFCwQGBRAFEYEBCQULBAYFEAURgQEJBQoFBgUQBRGBAQkFCgUG</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BREFEIEBCQQLBQYFEQUQgQEIBQsFBgUSBQkBBYEBCAULBQYFEgUJAwOBAQgFCwUGBQoFBAUIBAKBAQgF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">CwQHBQQLBAYHAwOBAQgECwUHFAUGBQQDgQEHBQsFAxgFBwQEA4EBBwULBQMVCQ4DgQEHBQsFAw8QDQOB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AQcEDAUDCRcLBIEBBgULBQUCHwgFgQEGBQsFKAQHgQEGBQsFM4EBBgULBTOBAQYFCgUKIgiBAQUHCQUK</span> +</div><div class="codeblock-line"><span style="color: #0a3069">IgiBAQUICAUKIgiBAQUKBgUKIgiBAQULBAULBRgFCIEBBA0DBQsFGAUIgQEEBQIHAgULBRgFCIEBBgMD</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DAwFGAUIgQENCwwFGAUIgQEOCgwFGAUIgQEQBw0FGAUIgQERBwwFGAUIgQERCAsiCIEBEAoKIgiBARAL</span> +</div><div class="codeblock-line"><span style="color: #0a3069">CSIIgQEPDQgiCIEBDwUCBwcFGAUIgQEOBgMHBgUYBQiBAQ0GBQcFBRgFCIEBDAcGBgUFGAUIgQELBwgE</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BgUYBQiBAQoHCgMGBRgFCIEBCQcMAQcFGAUIgQEIBxUFGAUIgQEHCBUiCIEBBggWIgiBAQQJFyIIgQEF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BxgiCIEBBQUaBRgFCIEBBgMbBRgFCIEBJAUYBQiBAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQEZBi+BARkGL4EBGgUvgQEaBS+BARoFL4EBGgUvgQEaBS+BARoF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">L4EBGgUvgQEaBRkBFYEBGgUZAxOBARoFDwEIBRKBARoFCwUIBxCBARoFBgoHCg6BARoVCQkNgQEJJgsJ</span> +</div><div class="codeblock-line"><span style="color: #0a3069">C4EBCSYMCQqBAQohEgkIgQEKGxoIB4EBChUhCQWBARkFIwkEgQEZBSUGBYEBGQUmBAaBARkFKAIGgQEZ</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BTCBARkFMIEBGQUwgQEZBTCBARkFMIEBGQUwgQEZBTCBARkFCRAXgQEZBQQYFIEBGSMSgQEZJBGBARkS</span> +</div><div class="codeblock-line"><span style="color: #0a3069">CAwPgQEXDhIJDoEBFQwYCA2BARMMGwcNgQESDB0HDIEBEA4eBgyBAQ8IAwQfBguBAQ4IBAQfBguBAQ0H</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BgQgBQuBAQwHBwQgBQuBAQsHCAUfBQuBAQoGCgUfBQuBAQoGCgUfBQuBAQkGCwUfBQuBAQkFDAUeBguB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AQgGDAUeBguBAQgGDAUdBwuBAQgGDAUdBgyBAQgGDAUcBwyBAQkFDAUbBw2BAQkGCwUZCQ2BAQkHCgUY</span> +</div><div class="codeblock-line"><span style="color: #0a3069">CQ6BAQoIBwYVCw+BAQsIBQcSDRCBAQwSChURgQENEQoTE4EBDhAKERWBARANDA4XgQESCwwLGoEBFQYO</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BSCBAU6BAU6BAU6BAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQEuBhqBAS4FG4EBLgUbgQEuBRuBARICGQYbgQEPBRkGG4EBDgYZ</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BRyBAQ8FGQUcgQEPBhgFHIEBDwYXBhyBARAFFwUdgQEQBRcFHYEBEAYNERqBAREFChcXgQERBQccFYEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">EQYEIBOBARIFAg4DExGBARIRBwYEChCBARIOCgUHCQ+BARMKDQUJCA6BARIJDgYKCA2BAREIEAUNBwyB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">ARAJEAUOBgyBAQ8KDwYPBguBAQ4MDgUQBwqBAQ4MDgURBgqBAQ0GAgYMBRMFCoEBDAYEBQwFEwYJgQEM</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BgQFCwYTBgmBAQsGBQYKBRUFCYEBCgYHBQkGFQYIgQEKBQgGCAYVBgiBAQkGCQUIBRcFCIEBCQUKBgYG</span> +</div><div class="codeblock-line"><span style="color: #0a3069">FwUIgQEJBQsFBgUYBQiBAQgFDAYEBhgFCIEBCAUNBQMGGQUIgQEIBQ0GAgYZBQiBAQcFDwwaBQiBAQcF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DwwaBQiBAQcFEAobBQiBAQcFEAoaBgiBAQcFEQgbBgiBAQcFEgYcBgiBAQcFEQgbBQmBAQcFEAoZBgmB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AQcFEAoZBgmBAQcFDwwXBgqBAQcFDg4VBwqBAQcGDAcCBxQGC4EBCAULBwQEFQcLgQEIBggIBgIVBwyB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AQgIBAkHARUHDYEBCRMcCQ2BAQoRHAkOgQELDhwKD4EBDAwbChGBAQ4HGwwSgQEsDxOBASgRFYEBKQ4X</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQEpDBmBASoIHIEBKwMggQFOgQFOgQFOgQFOgQFOgQFOgQFOgdA='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQE1DwqBASkbCoEBHiYKgQETMQqBAQc9CoEBBjQU</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQEGIQQKGYEBBhcOBxyBAQcOFAcegQEHBhsHH4EBJwYhgQEmBiKBASUGFgEMgQEkBhUDDIEBIwYWBAuB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">ASMGFwQKgQEiBg8DBgQKgQEhBg8EBwQJgQEhBhAEBwQIgQEgBhEFBgQIgQEgBRMEBwQHgQEfBhQEBgUG</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQEfBhQEBwQGgQEfBRYEBgIIgQEeBhYEEIEBHgYXBA+BAR4FGAMQgQEeBSuBAR0GK4EBHQYrgQEdBiuB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AR0GK4EBHQYrgQEdBiuBAR0GK4EBHQYrgQEdBiuBAR4FK4EBHgYqgQEeBiqBAR4HKYEBHwYpgQEfByiB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">ASAHJ4EBIAcngQEhByaBASEJJIEBIgkjgQEjCiGBASQLH4EBJQwdgQEmDxmBASgTE4EBKhMRgQErEhGB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AS4PEYEBMAwSgQE0CBKBAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQEXATaBARQENoEBEgY2gQESBzWBARMGNYEBEwc0gQEUBjSB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">ARQGNIEBFQYzgQEVBiABEoEBFgYeAxGBARYGHAYQgQEWBxoHEIEBFwYYCg+BARcHFQsQgQEYBhMLEoEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">GAYRCxSBARkGDgsWgQEZBgwLGIEBGgYJCxqBARoHBwocgQEbBgUKHoEBGwcCCiCBARwRIYEBHA8jgQEd</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DCWBAR0KJ4EBHAoogQEbCSqBARoILIEBGQgtgQEXCC+BARYIMIEBFQgxgQEVBzKBARQHM4EBEwc0gQES</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BzWBARIGNoEBEQY3gQERBjeBAREFOIEBEAY4gQEQBjiBARAGOIEBEAY4gQEQBjiBARAGOIEBEAY4gQEQ</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BjiBARAHN4EBEAc3gQERBzaBAREINYEBEgkzgQETCiEDDYEBEw0WCw2BARQtDYEBFisNgQEXKg2BARon</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DYEBHSARgQEjDxyBAU6BAU6BAU6BAU6BAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQEXBDOBARcLLIEBFxQjgQEXIRaBARchFoEBGh4WgQEiFhaBASsN</span> +</div><div class="codeblock-line"><span style="color: #0a3069">FoEBNgEXgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQEkDR2BAR4WGoEBGR0YgQEVIxaBARApFYEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DRcLCxSBAQ4QFAkTgQEODBoIEoEBDgkeBxKBAQ4GIgcRgQEPAiYGEYEBNwcQgQE4BhCBATgGEIEBOAYQ</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQE4BhCBATkFEIEBOQUQgQE5BRCBATgGEIEBOAYQgQE4BhCBATgGEIEBNwcQgQE3BhGBATcGEYEBNgcR</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQE1BxKBATUHEoEBNAcTgQEzCBOBATIIFIEBMQgVgQEvCRaBAS4JF4EBLAoYgQEqCxmBAScMG4EBJQ0c</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQEhDx6BARwTH4EBGBQigQEZESSBARoNJ4EBGgoqgQEbBS6BAU6BAU6BAU6BAU6BAU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFDAgmBAUEECYEBQgQIgQE7AQYFB4EBOQQGBAeBATkEBwQGgQE5BQYFBYEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">OgQHBAWBATsEBgUEgQE7BQYEBIEBPAQGBASBATwFBgEGgQEQBhsIBAQNgQEQKQQFDIEBECkFAQ+BARAp</span> +</div><div class="codeblock-line"><span style="color: #0a3069">FYEBECkVgQEQKRWBAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6B</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAU6BAQ0EPYEBDAY8gQEMBjyBAQwGPIEBDAU9gQEMBT2BAQsG</span> +</div><div class="codeblock-line"><span style="color: #0a3069">PYEBCwY9gQELBj2BAQsGPYEBCwY9gQELBj2BAQsHPIEBCwc8gQEMBzuBAQwIOoEBDQg5gQENCiUCEIEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DgwdBxCBAQ8QDhEQgQEQLhCBAREtEIEBEysQgQEWJROBARobGYEBToEBToEBToEBToEBToHQ'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFCAwmBAUEECYEBQQUIgQE5AwYFB4EBOAQHBAeBASkCDgQGBQaBASYGDQUGBAaB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">ASYGDgQHBAWBASYGDgUGBAWBAScFDwQHBASBAScGDwQGAwWBAScGDwUNgQEoBRAEDYEBKAUQAw6BASgG</span> +</div><div class="codeblock-line"><span style="color: #0a3069">IIEBKQUQAw2BASkFDAcNgQEpBgYMDYEBCgMdFw2BAQsVAh8NgQELNQ6BAQsxEoEBCysYgQELJh2BARkI</span> +</div><div class="codeblock-line"><span style="color: #0a3069">CwUdgQEsBhyBAS0FHIEBLQUcgQEuBRuBAS4FG4EBLwUagQEvBRqBATAFGYEBMAYYgQExBRiBATEGF4EB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">MgUXgQEyBhaBATMGFYEBNAUVgQE0BhSBATUGE4EBEAIWCgMHEoEBEAYSFRGBAQ8GExURgQEPBRQUEoEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DgYaDROBAQ4GIwQTgQEOBTuBAQ0GO4EBDQY7gQENBTyBAQ0FPIEBDQU8gQENBTyBAQ0FPIEBDQU8gQEN</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BjuBAQ0GO4EBDgY6gQEOBzmBAQ4IOIEBDwg3gQEQCh4BFYEBEQwVBxWBARInFYEBEyYVgQEVJBWBARgh</span> +</div><div class="codeblock-line"><span style="color: #0a3069">FYEBGxoZgQFOgQFOgQFOgQFOgdA='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQEJBz6BAQkGP4EBCQY/gQEJBigDFIEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">CQYlBhSBAQkGJQcTgQEJBiYHEoEBCQYnBhKBAQkGJwcRgQEJBigGEYEBCQYoBxCBAQkGKQYQgQEJBioG</span> +</div><div class="codeblock-line"><span style="color: #0a3069">D4EBCQYqBg+BAQkGKgcOgQEJBisGDoEBCgUrBg6BAQoFLAYNgQEKBSwGDYEBCgUtBgyBAQoFLQYMgQEK</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BS0GDIEBCgUuBguBAQoFLgYLgQEKBS4GC4EBCgYtBguBAQoGLgYKgQEKBi4GCoEBCgYuBgqBAQoGLwYJ</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQELBS8GCYEBCwUvBgmBAQsFLwYJgQELBhMBGgYJgQELBhMCGgYIgQELBhMDGQYIgQEMBRMEGAYIgQEM</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BhEGFwYIgQEMBhEGFwYIgQEMBhAGGQUIgQENBg8GGQUIgQENBg8GGQUIgQENBg4GGgILgQEOBg0GJ4EB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DgcLBiiBAQ4HCgcogQEPBwgHKYEBEAcGCCmBARAKAQkqgQEREiuBARIRK4EBEhAsgQETDi2BARULLoEB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">FwcwgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgQFOgdA='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQFOgQElBiOBASYFI4EBJgUjgQEmBSOBASYFI4EBJgUjgQEmBSOBASYF</span> +</div><div class="codeblock-line"><span style="color: #0a3069">I4EBJgUQBQ6BAQ4IEAUGDw6BAQ4yDoEBDjIOgQEOMg6BAQ4rFYEBGhIigQEmBSOBASYFI4EBJgUjgQEm</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BSOBASYFI4EBJgUjgQEmBSOBASYFI4EBJgUjgQEmBRQCDYEBDQMWBQwKDYEBDQ8JHA2BAQ4zDYEBDjMN</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQEOMg6BARAnF4EBJQYjgQEmBSOBASYFI4EBJgUjgQEmBSOBASYFI4EBJgUjgQEmBSOBASYFI4EBJgUj</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQEmBSOBAR0EBQUjgQEXFCOBARQZIYEBEh4egQERIRyBARAJDBAZgQEPBxARF4EBDgYSExWBAQ4FEwYD</span> +</div><div class="codeblock-line"><span style="color: #0a3069">CxSBAQ4FEwYFCxKBAQ0FFAYHChGBAQ0FFAYJCg+BAQ0FFAYKCg6BAQ0GEwYMCQ2BAQ4FEwYNCQyBAQ4G</span> +</div><div class="codeblock-line"><span style="color: #0a3069">EQYQBg2BAQ4HDwcRBQ2BAQ8IDAgSAw6BAQ8bFAEPgQERGCWBARIWJoEBFBIogQEXDSqBAU6BAU6BAU6B</span> +</div><div class="codeblock-line"><span style="color: #0a3069">AU6BAU6BAU6B0A=='</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0a3069">'0AFOgQFOgQFOgQFOgQFOgQFOgQEpBh+BASkGH4EBKQYfgQEqBR+BASoFH4EBKgUfgQEqBR+BASoFH4EB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">KgUfgQEqBR+BARkuB4EBBkEHgQEHQAeBAQdAB4EBB0AHgQEHDBcFH4EBKgUfgQEqBR+BASoFH4EBKgUf</span> +</div><div class="codeblock-line"><span style="color: #0a3069">gQEqBR+BASoFH4EBKgUfgQEgDx+BAR4RH4EBHBMfgQEbFB+BARoIBAkfgQEZBwkGH4EBGQYLBh6BARgG</span> +</div><div class="codeblock-line"><span style="color: #0a3069">DQUegQEYBQ4GHYEBFwYPBR2BARcFEAUdgQEXBRAFHYEBFwUQBhyBARcFEAYcgQEXBQ8HHIEBFwUPBxyB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">ARcGDgccgQEXBg0IHIEBGAYMBx2BARgHCggdgQEZCAYKHYEBGhcdgQEbFh2BARwVHYEBHgsBBh6BASAG</span> +</div><div class="codeblock-line"><span style="color: #0a3069">BAYegQEpBh+BASkGH4EBKAYggQEnByCBASYHIYEBJQcigQEkCCKBASIJI4EBIAokgQEeCyWBARwLJ4EB</span> +</div><div class="codeblock-line"><span style="color: #0a3069">GQ0ogQEWDiqBARcMK4EBGAktgQEZBTCBARoCMoEBToEBToEBToEBToEBToEBToHQ'</span><span style="color: #24292f;background-color: #f6f8fa">,];</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$m</span><span style="color: #0550ae">=</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">for</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$k</span><span style="color: #0550ae">=</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #0550ae">$k</span><span style="color: #0550ae"><</span><span style="color: #953800">min</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">13</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__LINE__</span><span style="color: #0550ae">-</span><span style="color: #0550ae">119</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">80</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #0550ae">$k</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$C</span><span style="color: #0550ae">=</span><span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$c</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$k</span><span style="color: #24292f;background-color: #f6f8fa">]);</span><span style="color: #0550ae">$f</span><span style="color: #0550ae">=!</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">foreach</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">base64_decode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$C</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #cf222e">as</span><span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$L</span><span style="color: #0550ae">=</span><span style="color: #953800">ord</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #0550ae">$m</span><span style="color: #0550ae">.</span><span style="color: #0550ae">=</span><span style="color: #953800">str_repeat</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$f</span><span style="color: #0550ae">?</span><span style="color: #0a3069">"#"</span><span style="color: #0550ae">:</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">32</span><span style="color: #24292f;background-color: #f6f8fa">),</span><span style="color: #0550ae">$L</span><span style="color: #0550ae">&</span><span style="color: #0550ae">127</span><span style="color: #24292f;background-color: #f6f8fa">);</span><span style="color: #0550ae">$f</span><span style="color: #0550ae">=!</span><span style="color: #0550ae">$f</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">if</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$L</span><span style="color: #0550ae">&</span><span style="color: #0550ae">128</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$m</span><span style="color: #0550ae">.</span><span style="color: #0550ae">=</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #0550ae">$f</span><span style="color: #0550ae">=!</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;}}}</span><span style="color: #cf222e">print</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"><span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">96</span><span style="color: #24292f;background-color: #f6f8fa">),</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">37</span><span style="color: #24292f;background-color: #f6f8fa">),</span><span style="color: #953800">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">64</span><span style="color: #24292f;background-color: #f6f8fa">)],[</span><span style="color: #953800">implode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$C</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">=></span><span style="color: #0a3069">"'"</span><span style="color: #0550ae">.</span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"><span style="color: #953800">chunk_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">$C</span><span style="color: #24292f;background-color: #f6f8fa">),</span><span style="color: #0550ae">80</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #0550ae">.</span><span style="color: #0a3069">"',"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0550ae">$c</span><span style="color: #24292f;background-color: #f6f8fa">)),</span><span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #24292f">{</span><span style="color: #0550ae">$m</span><span style="color: #24292f">}</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #0a3069">"</span><span style="color: #24292f">{</span><span style="color: #0550ae">$s</span><span style="color: #24292f">}</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">Q;</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre> </div> </section> </div> diff --git a/services/nuldoc/public/blog/posts/2024-12-33/2024-reflections/index.html b/services/nuldoc/public/blog/posts/2024-12-33/2024-reflections/index.html index 86f96380..0453296c 100644 --- a/services/nuldoc/public/blog/posts/2024-12-33/2024-reflections/index.html +++ b/services/nuldoc/public/blog/posts/2024-12-33/2024-reflections/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>2024年の振り返り|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html b/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html index 510f3062..25859d88 100644 --- a/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html +++ b/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2023 トークン問題解説 (1/5)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -167,8 +167,7 @@ まずはトークンを得る方法を解説抜きで説明する。次のように実行する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ echo "#iwillblog" | php Q1.png >/dev/null -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ echo "#iwillblog" | php Q1.png >/dev/null</div></code></pre> </div> <p> 無事に実行できていれば「#ModernPHPisStaticallyTypedLanguage」というトークンが得られる。 @@ -182,8 +181,7 @@ まずは素直に画像として見てみよう。全体は QR コードになっている。適当な QR コードリーダで読み込むと、次のようなテキストが表示されるはずだ。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>Guess password. $ echo "password" | php Q1.png >/dev/null -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">Guess password. $ echo "password" | php Q1.png >/dev/null</div></code></pre> </div> <p> メッセージは、この画像の実行方法とこの問題でやるべきこと (パスワードの推測) を示している。 @@ -198,9 +196,8 @@ 不正なパスワードを使って実行してみると、次のようなエラーメッセージが表示される。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ echo "foo" | php Q1.png >/dev/null -401 Unauthorized -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ echo "foo" | php Q1.png >/dev/null +</div><div class="codeblock-line">401 Unauthorized</div></code></pre> </div> <p> すでに <a href="#section--how-to-solve">「解き方」の節</a> で示したように、パスワードである PHPer トークンは「#iwillblog」である。これを与えて実行すると正解のトークンが得られる。 @@ -270,25 +267,23 @@ <code>strings</code> コマンドを使うと、隠されたデータを簡単に閲覧できる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>IHDR --HHc -<PLTE -IDATx -IEND -<?php -error_reporting(-1); -$b = unpack('C*', file_get_contents(__FILE__)); -$w = $b[20]+2; -$h = $b[24]+2; -// (以下略) -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">IHDR +</div><div class="codeblock-line">-HHc +</div><div class="codeblock-line"><PLTE +</div><div class="codeblock-line">IDATx +</div><div class="codeblock-line">IEND +</div><div class="codeblock-line"><?php +</div><div class="codeblock-line">error_reporting(-1); +</div><div class="codeblock-line">$b = unpack('C*', file_get_contents(__FILE__)); +</div><div class="codeblock-line">$w = $b[20]+2; +</div><div class="codeblock-line">$h = $b[24]+2; +</div><div class="codeblock-line">// (以下略)</div></code></pre> </div> <p> <code>IHDR</code> や <code>IEND</code> が PNG 画像の一部で、<code><?php</code> からが実際のプログラムになっている。もちろんこれを PHP プログラムとして動かすと、PHP タグより前にある PNG 画像としてのデータはそのまま標準出力へと出力されてしまう。それを防ぐため、QR コードを読み込んだときの実行方法 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>Guess password. $ echo "password" | php Q1.png >/dev/null -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">Guess password. $ echo "password" | php Q1.png >/dev/null</div></code></pre> </div> <p> には標準出力を捨てるよう <code>>/dev/null</code> と指定されている。 @@ -303,108 +298,107 @@ $h = $b[24]+2; 画像の正体がわかったところで、画像に隠されていた PHP プログラムについて見ていこう。先ほどは一部しか記載しなかったので、全体を載せる。なお、ある程度ゴルフしながら書いたので、空白こそ残しているものの可読性は非常に低いことと思う。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> -<span style="color: #953800">error_reporting</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -<span style="color: #0550ae">$w</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">20</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$h</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">24</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$cs</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> -<span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$h</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">?</span> <span style="color: #0550ae">0</span> - <span style="color: #0550ae">:</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">122</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span> -<span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #953800">stream_isatty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">?</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span> - <span style="color: #0550ae">:</span> <span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">ord</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #24292f;background-color: #f6f8fa">string</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #953800">fgets</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">))));</span> -<span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> -<span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$ns</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$o</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$ns</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ns</span> <span style="color: #0550ae">></span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e5</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"infinite loop detected</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$c1</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">6</span> <span style="color: #0550ae">+</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">-</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c0</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">6</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$c1</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$c0</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #0550ae">$c0</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">1</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">2</span> <span style="color: #0550ae">=></span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">3</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">4</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">5</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">8</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">11</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">*=</span> <span style="color: #953800">pow</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">12</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">],</span> - <span style="color: #0550ae">13</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span> - <span style="color: #0550ae">...</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">([</span> - <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #24292f;background-color: #f6f8fa">]),</span> - <span style="color: #24292f;background-color: #f6f8fa">])(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">15</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">and</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_shift</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">16</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%d'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">17</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">'nop'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">};</span> - <span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$v</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #0550ae">$z</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">-=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$q</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$qq</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qq</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> - <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$qy</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$qx</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #0550ae">$np</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_keys</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">7</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">4</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span> -<span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span> -<span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span> -<span style="color: #6e7781">// Piet any longer at that time.</span> -<span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"><span style="color: #953800">error_reporting</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$w</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">20</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$h</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">24</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$cs</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> +</div><div class="codeblock-line"><span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$h</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">?</span> <span style="color: #0550ae">0</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">:</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">122</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #953800">stream_isatty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">?</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">:</span> <span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">ord</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #24292f;background-color: #f6f8fa">string</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #953800">fgets</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">))));</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$ns</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$o</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$ns</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ns</span> <span style="color: #0550ae">></span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e5</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"infinite loop detected</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$c1</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">6</span> <span style="color: #0550ae">+</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">-</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c0</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">6</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$c1</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$c0</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #0550ae">$c0</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">1</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">2</span> <span style="color: #0550ae">=></span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">3</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">4</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">5</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">8</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">11</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">*=</span> <span style="color: #953800">pow</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">12</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">],</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">13</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">([</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">]),</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">])(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">15</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">and</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_shift</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">16</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%d'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">17</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">'nop'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">};</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$v</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$z</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">-=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$q</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$qq</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qq</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$qy</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$qx</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$np</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_keys</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">7</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">4</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// Piet any longer at that time.</span> +</div><div class="codeblock-line"><span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre> </div> <p> これは一体なんなのか。ずばり、難解プログラミング言語の一つ Piet のインタプリタである。Piet はピエト・モンドリアン (『赤・青・黄のコンポジション』などで知られる抽象画家) の作品にインスピレーションを受けて作られた、画像をソースコードとするプログラミング言語である。インタプリタは画像の各ピクセルの上を進みながら、色等に応じて特定の処理をおこなっていく。ここでは詳しい言語仕様については解説しないので、気になる方は <a href="https://ja.wikipedia.org/wiki/Piet" rel="noreferrer" target="_blank">Wikipedia の記事「Piet」</a> などを参照してほしい。 @@ -413,8 +407,7 @@ $h = $b[24]+2; プログラムの冒頭にあるこの箇所 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre> </div> <p> で <code>__FILE__</code> つまりこの画像ファイルを読み込んでいる。先ほど Piet は画像をソースコードにしていると説明した。そう、今回の問題の画像ファイル <code>Q1.png</code> は、PHP 製 Piet インタプリタであると同時に、Piet のソースコード画像でもあるのだ。QR コード中央のカラフルな部分が Piet の命令になっている。 @@ -466,12 +459,11 @@ $h = $b[24]+2; ところで、先ほど掲載した Piet のインタプリタのソースコード末尾には次のような箇所がある。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span> -<span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span> -<span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span> -<span style="color: #6e7781">// Piet any longer at that time.</span> -<span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// Piet any longer at that time.</span> +</div><div class="codeblock-line"><span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre> </div> <p> コメントにも書かれているが、この Piet のソースコード画像には誤りがあった。本来 HTTP のステータスコードを真似るのなら、認証の失敗には 401 を返さなければならない。しかし、Piet のソースは 403 を返すように書いてしまっていた。そのことに私が気付いたのは PHPerKaigi 2023 が開催されるひと月前で、その時点で私はこの Piet のソースコードを (ちょうどこの記事でそうなっているのと同じように) 読解できなくなっていた。さらに悪いことに、正しいメッセージ「401 Unauthorized」は元の「403 Forbidden」よりも3文字長い。3文字出力が長くなるということは、それだけ Piet で塗るべきピクセルが増えることを意味する。もはや3文字追加で出力するだけの余白はこの画像に残されていなかった (と思う。腕ききの Piet プログラマならできるかもしれないので挑戦してみてほしい)。 diff --git a/services/nuldoc/public/blog/posts/2025-01-26/yaml-breaking-changes-between-v1-1-and-v1-2/index.html b/services/nuldoc/public/blog/posts/2025-01-26/yaml-breaking-changes-between-v1-1-and-v1-2/index.html index 83ae95f3..2df63490 100644 --- a/services/nuldoc/public/blog/posts/2025-01-26/yaml-breaking-changes-between-v1-1-and-v1-2/index.html +++ b/services/nuldoc/public/blog/posts/2025-01-26/yaml-breaking-changes-between-v1-1-and-v1-2/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【YAML】YAML 1.1 と YAML 1.2 の主な破壊的変更|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -128,15 +128,14 @@ YAML 1.1 では、<code><<</code> という文字列をキーに指定することで、マップをマージすることができた。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #116329">x</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0550ae">&base</span> - <span style="color: #116329">a</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0550ae">123</span> -<span style="color: #6e7781"># => { "x": { "a": 123 } }</span> - -<span style="color: #116329">y</span><span style="color: #24292f;background-color: #f6f8fa">:</span> - <span style="color: #116329"><<</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0550ae">*base</span> - <span style="color: #116329">b</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0550ae">456</span> -<span style="color: #6e7781"># => { "y": { "a": 123, "b": 456 } }</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #116329">x</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0550ae">&base</span> +</div><div class="codeblock-line"> <span style="color: #116329">a</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0550ae">123</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># => { "x": { "a": 123 } }</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #116329">y</span><span style="color: #24292f;background-color: #f6f8fa">:</span> +</div><div class="codeblock-line"> <span style="color: #116329"><<</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0550ae">*base</span> +</div><div class="codeblock-line"> <span style="color: #116329">b</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #0550ae">456</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># => { "y": { "a": 123, "b": 456 } }</span></div></code></pre> </div> <p> 1.2 からはこれができなくなる。 diff --git a/services/nuldoc/public/blog/posts/2025-02-24/phpcon-nagoya-2025-report/index.html b/services/nuldoc/public/blog/posts/2025-02-24/phpcon-nagoya-2025-report/index.html index 5801dab7..356df5af 100644 --- a/services/nuldoc/public/blog/posts/2025-02-24/phpcon-nagoya-2025-report/index.html +++ b/services/nuldoc/public/blog/posts/2025-02-24/phpcon-nagoya-2025-report/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP カンファレンス名古屋 2025 参加レポ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2025-03-27/zip-function-like-command-paste-command/index.html b/services/nuldoc/public/blog/posts/2025-03-27/zip-function-like-command-paste-command/index.html index 052365e5..14e09c96 100644 --- a/services/nuldoc/public/blog/posts/2025-03-27/zip-function-like-command-paste-command/index.html +++ b/services/nuldoc/public/blog/posts/2025-03-27/zip-function-like-command-paste-command/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>zip 関数のようなコマンド paste|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -80,31 +80,28 @@ <code>a.txt</code> </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>a1 -a2 -a3 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">a1 +</div><div class="codeblock-line">a2 +</div><div class="codeblock-line">a3</div></code></pre> </div> <p> <code>b.txt</code> </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>b1 -b2 -b3 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">b1 +</div><div class="codeblock-line">b2 +</div><div class="codeblock-line">b3</div></code></pre> </div> <p> <code>ab.txt</code> </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>a1 -b1 -a2 -b2 -a3 -b3 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">a1 +</div><div class="codeblock-line">b1 +</div><div class="codeblock-line">a2 +</div><div class="codeblock-line">b2 +</div><div class="codeblock-line">a3 +</div><div class="codeblock-line">b3</div></code></pre> </div> <p> ちょうど Python や Haskell などにある <code>zip</code> 関数のような動きをさせたい。 @@ -116,9 +113,8 @@ b3 記事タイトルに書いたように、<code>paste</code> コマンドを使うと実現できる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ paste -d '\ -' a.txt b.txt > ab.txt -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ paste -d '\ +</div><div class="codeblock-line">' a.txt b.txt > ab.txt</div></code></pre> </div> <p> <code>paste</code> コマンドは複数のファイルを引数に取り、それらを1行ずつ消費しながら <code>-d</code> で指定した文字で区切って出力する。<code>-d</code> は区切り文字の指定で、デフォルトだとタブ区切りになる。 @@ -127,24 +123,22 @@ b3 ファイル名には <code>-</code> を指定でき、その場合は標準入力から読み込んで出力する。このとき <code>paste - -</code> のように複数回 <code>-</code> を指定すると、指定した回数の行ごとに連結することができる。例えば <code>ab.txt</code> だとこうなる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ paste - - < ab.txt -a1 b1 -a2 b2 -a3 b3 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ paste - - < ab.txt +</div><div class="codeblock-line">a1 b1 +</div><div class="codeblock-line">a2 b2 +</div><div class="codeblock-line">a3 b3</div></code></pre> </div> <p> これは標準入力を使うとき特有の挙動で、単に同じファイル名を指定してもこうはならない。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ paste ab.txt ab.txt -a1 a1 -b1 b1 -a2 a2 -b2 b2 -a3 a3 -b3 b3 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ paste ab.txt ab.txt +</div><div class="codeblock-line">a1 a1 +</div><div class="codeblock-line">b1 b1 +</div><div class="codeblock-line">a2 a2 +</div><div class="codeblock-line">b2 b2 +</div><div class="codeblock-line">a3 a3 +</div><div class="codeblock-line">b3 b3</div></code></pre> </div> <p> ときどき便利。 diff --git a/services/nuldoc/public/blog/posts/2025-03-28/http-1-1-send-multiple-same-headers/index.html b/services/nuldoc/public/blog/posts/2025-03-28/http-1-1-send-multiple-same-headers/index.html index 39545759..436b3823 100644 --- a/services/nuldoc/public/blog/posts/2025-03-28/http-1-1-send-multiple-same-headers/index.html +++ b/services/nuldoc/public/blog/posts/2025-03-28/http-1-1-send-multiple-same-headers/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【HTTP】HTTP/1.1 で同じヘッダを2回送るとどうなるか|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/index.html b/services/nuldoc/public/blog/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/index.html index 79e31d70..01cecbe3 100644 --- a/services/nuldoc/public/blog/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/index.html +++ b/services/nuldoc/public/blog/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>RubyKaigi 2025 の TRICK で入賞した|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -161,8 +161,7 @@ 表示している。つまり、Ruby プログラムにルビを振った作品である。例えば、先頭の2行目の <code>require</code> は次のような HTML で構成されている。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #116329"><ruby</span> <span style="color: #116329">class=</span><span style="color: #0a3069">"IDENTIFIER"</span><span style="color: #116329">></span>require<span style="color: #116329"><rp</span> <span style="color: #116329">class=</span><span style="color: #0a3069">""</span><span style="color: #116329">></span>(<span style="color: #116329"></rp><rt</span> <span style="color: #116329">class=</span><span style="color: #0a3069">""</span><span style="color: #116329">></span>リクワイア<span style="color: #116329"></rt><rp</span> <span style="color: #116329">class=</span><span style="color: #0a3069">""</span><span style="color: #116329">></span>)<span style="color: #116329"></rp></ruby></span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #116329"><ruby</span> <span style="color: #116329">class=</span><span style="color: #0a3069">"IDENTIFIER"</span><span style="color: #116329">></span>require<span style="color: #116329"><rp</span> <span style="color: #116329">class=</span><span style="color: #0a3069">""</span><span style="color: #116329">></span>(<span style="color: #116329"></rp><rt</span> <span style="color: #116329">class=</span><span style="color: #0a3069">""</span><span style="color: #116329">></span>リクワイア<span style="color: #116329"></rt><rp</span> <span style="color: #116329">class=</span><span style="color: #0a3069">""</span><span style="color: #116329">></span>)<span style="color: #116329"></rp></ruby></span></div></code></pre> </div> <p> 順に使ったテクニックを解説していく。 @@ -173,12 +172,11 @@ 改めて quine について説明する。Quine とは、自身のソースコードを出力するようなプログラムである。Ruby では様々な方法で quine を書くことができるが、この作品で使っている基本形は以下のようなものである。 </p> <div class="codeblock numbered"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #953800">eval</span> <span style="color: #0550ae">$s</span><span style="color: #0550ae">=<<</span><span style="color: #953800">'EOS'</span><span style="color: #0a3069"> -print "eval $s=<<'EOS'</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">" -print $s -print "EOS</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">" -</span><span style="color: #953800">EOS</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #953800">eval</span> <span style="color: #0550ae">$s</span><span style="color: #0550ae">=<<</span><span style="color: #953800">'EOS'</span> +</div><div class="codeblock-line"><span style="color: #0a3069">print "eval $s=<<'EOS'</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> +</div><div class="codeblock-line"><span style="color: #0a3069">print $s</span> +</div><div class="codeblock-line"><span style="color: #0a3069">print "EOS</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> +</div><div class="codeblock-line"><span style="color: #953800">EOS</span></div></code></pre> </div> <p> 変数 <code>$s</code> に 2 行目、3 行目、4 行目が入っており、それに加えて 1 行目と 5 行目を出力すれば元のソースコードが得られる。実際には <code>$s</code> を加工してシンタックスハイライトや振り仮名を振ることになる。 @@ -193,24 +191,23 @@ print "EOS</span><span style="color: #0a3069">\n</span><span style="color: #0a30 トークナイズには Ruby 3.4 からデフォルトのパーサになった <a href="https://github.com/ruby/prism" rel="noreferrer" target="_blank">Prism</a> を利用している。<code>Prism.lex()</code> を使うとトークナイズができるので、トークンに付いているソースコード位置の情報を使いつつ元のソースコードを復元する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span> <span style="color: #6e7781"># 現在の行</span> -<span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781"># 現在の列</span> -<span style="color: #953800">Prism</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">lex</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">value</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">..-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">].</span><span style="color: #8250df">each</span> <span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0550ae">|</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">*|</span> - <span style="color: #24292f;background-color: #f6f8fa">l</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">location</span> - <span style="color: #24292f;background-color: #f6f8fa">r</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">l</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">start_line</span> <span style="color: #6e7781"># トークンの開始行</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">r</span> <span style="color: #6e7781"># 改行が必要なら</span> - <span style="color: #953800">p</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">r</span> <span style="color: #0550ae">-</span> <span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #6e7781"># 改行を挿入して</span> - <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781"># 列の先頭へ戻る</span> - <span style="color: #cf222e">end</span> - <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">l</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">start_column</span> <span style="color: #6e7781"># トークンの開始列</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #6e7781"># 空白が必要なら</span> - <span style="color: #953800">p</span> <span style="color: #0a3069">" "</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">-</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #6e7781"># 空白を挿入</span> - <span style="color: #cf222e">end</span> - <span style="color: #953800">p</span> <span style="color: #24292f;background-color: #f6f8fa">ruby</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #6e7781"># トークン本体を出力</span> - <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">l</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">end_line</span> <span style="color: #6e7781"># 現在行を更新</span> - <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">l</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">end_column</span> <span style="color: #6e7781"># 現在列を更新</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span> <span style="color: #6e7781"># 現在の行</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781"># 現在の列</span> +</div><div class="codeblock-line"><span style="color: #953800">Prism</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">lex</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">value</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">..-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">].</span><span style="color: #8250df">each</span> <span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0550ae">|</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">*|</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">l</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">location</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">r</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">l</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">start_line</span> <span style="color: #6e7781"># トークンの開始行</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">r</span> <span style="color: #6e7781"># 改行が必要なら</span> +</div><div class="codeblock-line"> <span style="color: #953800">p</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">r</span> <span style="color: #0550ae">-</span> <span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #6e7781"># 改行を挿入して</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781"># 列の先頭へ戻る</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">l</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">start_column</span> <span style="color: #6e7781"># トークンの開始列</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae"><</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #6e7781"># 空白が必要なら</span> +</div><div class="codeblock-line"> <span style="color: #953800">p</span> <span style="color: #0a3069">" "</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">-</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #6e7781"># 空白を挿入</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">end</span> +</div><div class="codeblock-line"> <span style="color: #953800">p</span> <span style="color: #24292f;background-color: #f6f8fa">ruby</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #6e7781"># トークン本体を出力</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">l</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">end_line</span> <span style="color: #6e7781"># 現在行を更新</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">l</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">end_column</span> <span style="color: #6e7781"># 現在列を更新</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> 補足: 変数名がやたら短いのは、このあとの振り仮名データの量を削減するため。 @@ -219,21 +216,20 @@ print "EOS</span><span style="color: #0a3069">\n</span><span style="color: #0a30 トークン種別に応じた色付けは CSS でおこなっている。出力する HTML のクラス名に <code>Prism::Token#type</code> を指定しておいて、<code>index.html</code> でそれぞれのクラスにスタイルを当てた。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code> <span style="color: #116329"><style></span> - <span style="color: #6e7781">/* ... */</span> - - <span style="color: #953800">.COMMENT</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">color</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">#777</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">font-style</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #953800">italic</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - - <span style="color: #953800">.CONSTANT</span><span style="color: #0550ae">,</span> <span style="color: #953800">.GLOBAL_VARIABLE</span><span style="color: #0550ae">,</span> <span style="color: #953800">.INSTANCE_VARIABLE</span><span style="color: #0550ae">,</span> <span style="color: #953800">.IDENTIFIER</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">color</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">#088</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - - <span style="color: #6e7781">/* ... */</span> - <span style="color: #116329"></style></span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> <span style="color: #116329"><style></span> +</div><div class="codeblock-line"> <span style="color: #6e7781">/* ... */</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #953800">.COMMENT</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">color</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">#777</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">font-style</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #953800">italic</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #953800">.CONSTANT</span><span style="color: #0550ae">,</span> <span style="color: #953800">.GLOBAL_VARIABLE</span><span style="color: #0550ae">,</span> <span style="color: #953800">.INSTANCE_VARIABLE</span><span style="color: #0550ae">,</span> <span style="color: #953800">.IDENTIFIER</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">color</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">#088</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #6e7781">/* ... */</span> +</div><div class="codeblock-line"> <span style="color: #116329"></style></span></div></code></pre> </div> <p> トークン種別の列挙にはそれなりに文字数を使ってしまうのだが、今回の TRICK のレギュレーションでは <code>index.html</code> にサイズ制限がなかったので好きに色を付けることができた。 @@ -245,28 +241,27 @@ print "EOS</span><span style="color: #0a3069">\n</span><span style="color: #0a30 それぞれの英単語や記号に対応した振り仮名のデータは、プログラム中に埋め込まれている。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">def</span> <span style="color: #8250df">rt</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">r</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0a3069">:"&&"</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"1136"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">:"="</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"04199275"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">:"||"</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"623147"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"41750825"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #0550ae">*</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"111775"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #6e7781"># ...</span> - <span style="color: #0a3069">type: </span><span style="color: #0a3069">"310455"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">utf_8: </span><span style="color: #0a3069">"70923803920853080440"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">value: </span><span style="color: #0a3069">"48746992"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">x: </span><span style="color: #0a3069">"08351525"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0a3069">y: </span><span style="color: #0a3069">"7904"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">kana</span><span style="color: #24292f;background-color: #f6f8fa">(</span> - <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">:"</span><span style="color: #24292f">#{</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">type</span><span style="color: #24292f">}</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">||</span> - <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">s</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">:"</span><span style="color: #24292f">#{</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">value</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">downcase</span><span style="color: #24292f">}</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">||</span> - <span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">end_with?</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">":"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">:"</span><span style="color: #24292f">#{</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">..-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #24292f">}</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">||</span> - <span style="color: #cf222e">nil</span> - <span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">rt</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">r</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">:"&&"</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"1136"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">:"="</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"04199275"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">:"||"</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"623147"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #0550ae">$s</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"41750825"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">:</span><span style="color: #0550ae">*</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">"111775"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #6e7781"># ...</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">type: </span><span style="color: #0a3069">"310455"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">utf_8: </span><span style="color: #0a3069">"70923803920853080440"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">value: </span><span style="color: #0a3069">"48746992"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">x: </span><span style="color: #0a3069">"08351525"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0a3069">y: </span><span style="color: #0a3069">"7904"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">kana</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">:"</span><span style="color: #24292f">#{</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">type</span><span style="color: #24292f">}</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">||</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">s</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">:"</span><span style="color: #24292f">#{</span><span style="color: #24292f;background-color: #f6f8fa">t</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">value</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">downcase</span><span style="color: #24292f">}</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">||</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">end_with?</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">":"</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0a3069">:"</span><span style="color: #24292f">#{</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">..-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #24292f">}</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">||</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">nil</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> </div> <p> トークンの種類 (<code>t.type</code>) またはトークンの文字列表現そのもの (<code>t.value.downcase</code>) を使ってテーブルを引いて振り仮名へ変換している。このテーブルのキー部分そのものにも振り仮名を振るために、トークンが <code>:</code> で終わっていれば <code>:</code> を取り除いて振り仮名を得ている (例: <code>"value:"</code> → <code>"value"</code> → <code>"48746992"</code>)。 @@ -275,27 +270,25 @@ print "EOS</span><span style="color: #0a3069">\n</span><span style="color: #0a30 このテーブルはサイズ制限を突破するために圧縮されており、<code>kana()</code> 関数で展開される。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">def</span> <span style="color: #8250df">kana</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #24292f;background-color: #f6f8fa">s</span> - <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/.{2}/</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">map</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0550ae">|</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">|</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x30A0</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">to_i</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Encoding</span><span style="color: #0550ae">::</span><span style="color: #953800">UTF_8</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> - <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -<span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">kana</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/.{2}/</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">map</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0550ae">|</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">|</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x30A0</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">to_i</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Encoding</span><span style="color: #0550ae">::</span><span style="color: #953800">UTF_8</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> </div> <p> 例えば <code>value</code> に対応する振り仮名データ <code>"48746992"</code> であれば、次のような変換を経て振り仮名へと展開される。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code> <span style="color: #24292f;background-color: #f6f8fa">s</span> - <span style="color: #6e7781"># => "48746992"</span> - <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/.{2}/</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #6e7781"># => ["48", "74", "69", "92"]</span> - <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">map</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0550ae">|</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">|</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x30A0</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">to_i</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Encoding</span><span style="color: #0550ae">::</span><span style="color: #953800">UTF_8</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> - <span style="color: #6e7781"># => ["バ", "リ", "ュ", "ー"]</span> - <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #6e7781"># => "バリュー"</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">s</span> +</div><div class="codeblock-line"> <span style="color: #6e7781"># => "48746992"</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/.{2}/</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #6e7781"># => ["48", "74", "69", "92"]</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">map</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0550ae">|</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">|</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x30A0</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">to_i</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">chr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Encoding</span><span style="color: #0550ae">::</span><span style="color: #953800">UTF_8</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> +</div><div class="codeblock-line"> <span style="color: #6e7781"># => ["バ", "リ", "ュ", "ー"]</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">""</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #6e7781"># => "バリュー"</span></div></code></pre> </div> <p> これは後で気付いたのだが、Ruby は多倍長整数が扱えるので <code>"48746992"</code> のようなデータは単に <code>48746992</code> と書けばよかった。<code>kana()</code> 関数が多少長くはなるが、振り仮名データの数 x 2 バイト分サイズが減るのでこちらの方が短くなる。サイズ制限の都合で振り仮名を振るのを諦めた記号もあったのでもったいない。 diff --git a/services/nuldoc/public/blog/posts/2025-04-24/composer-patches-v2-does-not-require-gnu-patch-even-on-macos/index.html b/services/nuldoc/public/blog/posts/2025-04-24/composer-patches-v2-does-not-require-gnu-patch-even-on-macos/index.html index fa50b368..e881f68c 100644 --- a/services/nuldoc/public/blog/posts/2025-04-24/composer-patches-v2-does-not-require-gnu-patch-even-on-macos/index.html +++ b/services/nuldoc/public/blog/posts/2025-04-24/composer-patches-v2-does-not-require-gnu-patch-even-on-macos/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Composer】 composer-patches v2 では macOS でも GNU patch のインストールが不要になる (予定)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -126,9 +126,8 @@ ワークアラウンドとして、macOS にも GNU patch をインストールしてしまうという方法がある。例: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ brew install gpatch -$ echo 'PATH="/opt/homebrew/opt/gpatch/libexec/gnubin:$PATH"' >> ~/.zshrc -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ brew install gpatch +</div><div class="codeblock-line">$ echo 'PATH="/opt/homebrew/opt/gpatch/libexec/gnubin:$PATH"' >> ~/.zshrc</div></code></pre> </div> <p> GNU patch を Homebrew などの手段でインストールし、BSD patch よりも優先されるパスに配置すれば問題が解消する。 diff --git a/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler/index.html b/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler/index.html index 4d828f45..79e31d17 100644 --- a/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler/index.html +++ b/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>セルフホスト可能な C コンパイラを作った|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -359,10 +359,9 @@ compilerbook では整数一つのパース・コード生成から始めるが、今回は以下のようなソースをパースしてコード生成するところからスタートすることにした。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">int</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">42</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">42</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> この時点で、<code>struct Token</code>、<code>struct Parser</code>、<code>struct AstNode</code>、<code>struct CodeGen</code> といった主要なデータ構造が定義され、この後もほぼ同じソース設計のまま進めている。 @@ -409,24 +408,23 @@ 一日の終わりには、次のようなプログラムのテストが通るようになった。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">int</span> <span style="color: #8250df">printf</span><span style="color: #24292f;background-color: #f6f8fa">();</span> - -<span style="color: #cf222e">int</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae"><=</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">15</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"FizzBuzz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Fizz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Buzz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"%d</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #8250df">printf</span><span style="color: #24292f;background-color: #f6f8fa">();</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae"><=</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">15</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"FizzBuzz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Fizz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Buzz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"%d</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> </section> <section id="section--development--day2"> @@ -515,14 +513,13 @@ 記念すべき (?) 最後のバグはこちら。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code> gen_expr(g, ast->expr1, GEN_RVAL); - } else { - gen_expr(g, ast->expr1, GEN_RVAL); -<span style="color: #82071e;background-color: #ffebe9">- gen_lval2rval(ast->expr1->ty); -</span><span style="color: #116329;background-color: #dafbe1">+ gen_lval2rval(ast->expr1->ty->to); -</span> } - } -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> gen_expr(g, ast->expr1, GEN_RVAL); +</div><div class="codeblock-line"> } else { +</div><div class="codeblock-line"> gen_expr(g, ast->expr1, GEN_RVAL); +</div><div class="codeblock-line"><span style="color: #82071e;background-color: #ffebe9">- gen_lval2rval(ast->expr1->ty);</span> +</div><div class="codeblock-line"><span style="color: #116329;background-color: #dafbe1">+ gen_lval2rval(ast->expr1->ty->to);</span> +</div><div class="codeblock-line"> } +</div><div class="codeblock-line"> }</div></code></pre> </div> <p> メモリアドレスから参照先の値を得る際、その型によってロードする命令の種類を変える必要があるのだが、その切替をポインタ型でおこなっていた。正しくは、そのポインタ型が指す型を元にして切り替えなければならない。 @@ -537,17 +534,16 @@ 一体どこが異なるのか。<code>hexdump</code> の差分がこちら。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ diff -u <(hexdump -C p4dcc2) <(hexdump -C p4dcc3) -@@ -5090,7 +5090,7 @@ - 00015db0 72 72 61 79 5f 65 6e 74 72 79 00 66 72 61 6d 65 |rray_entry.frame| - 00015dc0 5f 64 75 6d 6d 79 00 5f 5f 66 72 61 6d 65 5f 64 |_dummy.__frame_d| - 00015dd0 75 6d 6d 79 5f 69 6e 69 74 5f 61 72 72 61 79 5f |ummy_init_array_| --00015de0 65 6e 74 72 79 00 63 63 6d 69 42 49 59 6b 2e 6f |entry.ccmiBIYk.o| -+00015de0 65 6e 74 72 79 00 63 63 53 71 64 47 76 57 2e 6f |entry.ccSqdGvW.o| - 00015df0 00 66 61 74 61 6c 5f 65 72 72 6f 72 00 72 65 61 |.fatal_error.rea| - 00015e00 64 5f 61 6c 6c 00 74 6f 6b 65 6e 69 7a 65 00 74 |d_all.tokenize.t| - 00015e10 79 70 65 5f 6e 65 77 00 74 79 70 65 5f 6e 65 77 |ype_new.type_new| -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ diff -u <(hexdump -C p4dcc2) <(hexdump -C p4dcc3) +</div><div class="codeblock-line">@@ -5090,7 +5090,7 @@ +</div><div class="codeblock-line"> 00015db0 72 72 61 79 5f 65 6e 74 72 79 00 66 72 61 6d 65 |rray_entry.frame| +</div><div class="codeblock-line"> 00015dc0 5f 64 75 6d 6d 79 00 5f 5f 66 72 61 6d 65 5f 64 |_dummy.__frame_d| +</div><div class="codeblock-line"> 00015dd0 75 6d 6d 79 5f 69 6e 69 74 5f 61 72 72 61 79 5f |ummy_init_array_| +</div><div class="codeblock-line">-00015de0 65 6e 74 72 79 00 63 63 6d 69 42 49 59 6b 2e 6f |entry.ccmiBIYk.o| +</div><div class="codeblock-line">+00015de0 65 6e 74 72 79 00 63 63 53 71 64 47 76 57 2e 6f |entry.ccSqdGvW.o| +</div><div class="codeblock-line"> 00015df0 00 66 61 74 61 6c 5f 65 72 72 6f 72 00 72 65 61 |.fatal_error.rea| +</div><div class="codeblock-line"> 00015e00 64 5f 61 6c 6c 00 74 6f 6b 65 6e 69 7a 65 00 74 |d_all.tokenize.t| +</div><div class="codeblock-line"> 00015e10 79 70 65 5f 6e 65 77 00 74 79 70 65 5f 6e 65 77 |ype_new.type_new|</div></code></pre> </div> <p> <code>fatal_error</code>、<code>read_all</code>、<code>tokenize</code> <code>type_new</code> はいずれも <code>main.c</code> で定義された関数の名前である。このことから考えると、これは GCC が埋め込んだシンボルテーブルである可能性が高い。わずかに異なっている 6バイトは、ランダム生成された何かのように見える。 diff --git a/services/nuldoc/public/blog/posts/2025-06-14/baba-is-you/index.html b/services/nuldoc/public/blog/posts/2025-06-14/baba-is-you/index.html index fbeac4b9..1a1cd0c9 100644 --- a/services/nuldoc/public/blog/posts/2025-06-14/baba-is-you/index.html +++ b/services/nuldoc/public/blog/posts/2025-06-14/baba-is-you/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>最高のパズルゲーム Baba Is You をやれ|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2025-07-15/partial-surrender-to-ebooks/index.html b/services/nuldoc/public/blog/posts/2025-07-15/partial-surrender-to-ebooks/index.html index eb022a41..897cffa5 100644 --- a/services/nuldoc/public/blog/posts/2025-07-15/partial-surrender-to-ebooks/index.html +++ b/services/nuldoc/public/blog/posts/2025-07-15/partial-surrender-to-ebooks/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>電子書籍への部分的降伏|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2025-10-31/representing-single-value-with-half-open-float-interval/index.html b/services/nuldoc/public/blog/posts/2025-10-31/representing-single-value-with-half-open-float-interval/index.html index 2c383346..535e9e49 100644 --- a/services/nuldoc/public/blog/posts/2025-10-31/representing-single-value-with-half-open-float-interval/index.html +++ b/services/nuldoc/public/blog/posts/2025-10-31/representing-single-value-with-half-open-float-interval/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>浮動小数点数の半開区間で単一値を表現する|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -152,9 +152,8 @@ <code>1</code> と <code>p</code> のビット列での表現を見てみよう。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>1 = 0011111111110000000000000000000000000000000000000000000000000000 -p = 0011111111110000000000000000000000000000000000000000000000000001 -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">1 = 0011111111110000000000000000000000000000000000000000000000000000 +</div><div class="codeblock-line">p = 0011111111110000000000000000000000000000000000000000000000000001</div></code></pre> </div> <p> <code>p</code> が <code>1</code> よりも一つ分だけ大きいのがわかるだろうか (ここでは <code>binary64</code> の具体的な表現について言及していないのでそうなる保証はないのだが、あくまで雰囲気として)。 @@ -183,39 +182,37 @@ p = 0011111111110000000000000000000000000000000000000000000000000001 <code>binary64</code> を 64 bit の整数に変換できるなら、他の言語でもほとんど同じ方法で実装できるはずだ。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code> <span style="color: #cf222e">public</span> <span style="color: #cf222e">static</span> <span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">nextUp</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">float</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">):</span> <span style="color: #cf222e">float</span> - <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #6e7781">// NaN (Not a Number) なら NaN を返す。</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">is_nan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #953800">NAN</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #6e7781">// 正の無限大なら正の無限大を返す。</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">is_infinite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&&</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">></span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #953800">INF</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #6e7781">// 0 なら minValue() を返す (後述)。</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0.0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">return</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">minValue</span><span style="color: #24292f;background-color: #f6f8fa">();</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #6e7781">// binary64 を 64 bit 整数に変換する。</span> - <span style="color: #0550ae">$u</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">floatToInt</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #6e7781">// 正なら整数に +1 して binary64 に戻す。</span> - <span style="color: #6e7781">// 負なら整数に -1 して binary64 に戻す。</span> - <span style="color: #cf222e">return</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">></span> <span style="color: #0550ae">0.0</span> <span style="color: #0550ae">?</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">intToFloat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$u</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">:</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">intToFloat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$u</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> <span style="color: #cf222e">public</span> <span style="color: #cf222e">static</span> <span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">nextUp</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">float</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">):</span> <span style="color: #cf222e">float</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// NaN (Not a Number) なら NaN を返す。</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">is_nan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #953800">NAN</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// 正の無限大なら正の無限大を返す。</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">is_infinite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&&</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">></span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #953800">INF</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// 0 なら minValue() を返す (後述)。</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0.0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">minValue</span><span style="color: #24292f;background-color: #f6f8fa">();</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// binary64 を 64 bit 整数に変換する。</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$u</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">floatToInt</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// 正なら整数に +1 して binary64 に戻す。</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// 負なら整数に -1 して binary64 に戻す。</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">></span> <span style="color: #0550ae">0.0</span> <span style="color: #0550ae">?</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">intToFloat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$u</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">:</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">intToFloat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$u</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> <p> <code>0</code> のときに返している <code>minValue()</code> は次のような値である。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code> <span style="color: #cf222e">public</span> <span style="color: #cf222e">static</span> <span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">minValue</span><span style="color: #24292f;background-color: #f6f8fa">():</span> <span style="color: #cf222e">float</span> - <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #6e7781">// 整数の 1 を binary64 と解釈した値を返す。</span> - <span style="color: #6e7781">// binary64 で表せる最小の正の非正規化数。</span> - <span style="color: #cf222e">return</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">intToFloat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> <span style="color: #cf222e">public</span> <span style="color: #cf222e">static</span> <span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">minValue</span><span style="color: #24292f;background-color: #f6f8fa">():</span> <span style="color: #cf222e">float</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// 整数の 1 を binary64 と解釈した値を返す。</span> +</div><div class="codeblock-line"> <span style="color: #6e7781">// binary64 で表せる最小の正の非正規化数。</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">::</span><span style="color: #8250df">intToFloat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> </section> <section id="section--outro"> diff --git a/services/nuldoc/public/blog/posts/2025-11-09/rubiks-cube-blindfolded-first-success/index.html b/services/nuldoc/public/blog/posts/2025-11-09/rubiks-cube-blindfolded-first-success/index.html index 68b470f6..95dd435f 100644 --- a/services/nuldoc/public/blog/posts/2025-11-09/rubiks-cube-blindfolded-first-success/index.html +++ b/services/nuldoc/public/blog/posts/2025-11-09/rubiks-cube-blindfolded-first-success/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>ルービックキューブを目隠しで揃えることに初成功した|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2025-11-27/anybatross-writeup/index.html b/services/nuldoc/public/blog/posts/2025-11-27/anybatross-writeup/index.html index c3b577e1..98f66370 100644 --- a/services/nuldoc/public/blog/posts/2025-11-27/anybatross-writeup/index.html +++ b/services/nuldoc/public/blog/posts/2025-11-27/anybatross-writeup/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>カヤックさん開催のコードゴルフコンテスト Anybatross に参加して優勝した|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -132,8 +132,7 @@ <section id="section--hole-1--answer"> <h3><a href="#section--hole-1--answer">回答 (45 byte)</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">print</span><span style="color: #0550ae">$a</span><span style="color: #0550ae">+=</span><span style="color: #0550ae">$\</span><span style="color: #0550ae">=</span><span style="color: #116329">y/8B/0/</span><span style="color: #0550ae">+</span><span style="color: #116329">y/0469ADO-R//</span><span style="color: #0550ae">.</span><span style="color: #0550ae">$/</span><span style="color: #24292f;background-color: #f6f8fa">,"</span><span style="color: #0a3069">,</span><span style="color: #24292f;background-color: #f6f8fa">"</span><span style="color: #cf222e">for</span><span style="color: #0550ae"><></span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">print</span><span style="color: #0550ae">$a</span><span style="color: #0550ae">+=</span><span style="color: #0550ae">$\</span><span style="color: #0550ae">=</span><span style="color: #116329">y/8B/0/</span><span style="color: #0550ae">+</span><span style="color: #116329">y/0469ADO-R//</span><span style="color: #0550ae">.</span><span style="color: #0550ae">$/</span><span style="color: #24292f;background-color: #f6f8fa">,"</span><span style="color: #0a3069">,</span><span style="color: #24292f;background-color: #f6f8fa">"</span><span style="color: #cf222e">for</span><span style="color: #0550ae"><></span></div></code></pre> </div> <p> Hole 1 については同一言語・同一スコアの回答が複数あるので詳細は省略する。 @@ -151,11 +150,10 @@ 最終スコアを見ると 4 位タイ (107 byte) が多く、3 位以上の回答と明確にアルゴリズムの差があるのでここから解説をスタートしようと思う。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">=</span><span style="color: #953800">gets</span> -<span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,),</span><span style="color: #24292f;background-color: #f6f8fa">m</span><span style="color: #0550ae">=</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #24292f;background-color: #f6f8fa">m</span><span style="color: #0550ae">></span><span style="color: #0550ae">1</span><span style="color: #0550ae">&&</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">)}</span><span style="color: #0a3069"> -puts$**?,,s</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">=</span><span style="color: #953800">gets</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,),</span><span style="color: #24292f;background-color: #f6f8fa">m</span><span style="color: #0550ae">=</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">m</span><span style="color: #0550ae">></span><span style="color: #0550ae">1</span><span style="color: #0550ae">&&</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> +</div><div class="codeblock-line"><span style="color: #0a3069">puts$**?,,s</span></div></code></pre> </div> <p> 変数名などの細かい差異を除けば他の 107 byte 回答と同じだが、 <code>String#scan</code> に渡す正規表現にこれを採用していたのは私だけだったのではないだろうか。 <code>/(?=(\S\S))/</code> や <code>/(?=(\w\w))/</code> と比べて短くはならないので意味はない。 @@ -170,10 +168,9 @@ puts$**?,,s</span> <code>Enumerable#max_by</code> で最頻値を取ってきた後は、多重代入を使って必要な値を取り出している。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #0a3069">"la"</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">]</span> -<span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,),</span><span style="color: #24292f;background-color: #f6f8fa">m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -<span style="color: #6e7781"># => b = "la", m = 3</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #0a3069">"la"</span><span style="color: #24292f;background-color: #f6f8fa">],</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">]</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,),</span><span style="color: #24292f;background-color: #f6f8fa">m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># => b = "la", m = 3</span></div></code></pre> </div> <p> 置換テーブルのデータは <code>$*</code> へと追加しているが、これは Ruby の特殊変数で、本来は <code>Object::ARGV</code> を指す。ここでは単に最初から空配列で初期化されている便利な入れ物として用いている。 @@ -188,11 +185,10 @@ puts$**?,,s</span> 回答 A をぐっと睨むと、<code>m>1&&(...)</code> の括弧を削りたくなる。しかしそれには <code>m>1&&</code> がどうしても邪魔になる。というわけで終了条件を工夫することでなんとか <code>m</code> を排除できないかを考えた。それがこちら。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">=</span><span style="color: #953800">gets</span> -<span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,),</span><span style="color: #0550ae">=</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?_</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #0a3069"> -puts$**?,,s</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">=</span><span style="color: #953800">gets</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,),</span><span style="color: #0550ae">=</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?_</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #0a3069">puts$**?,,s</span></div></code></pre> </div> <p> <code>s</code> の先頭に番兵 <code>_</code> を置くことで、bi-gram の出現頻度がすべて 1 になったとき、<code>b</code> へと代入される値が「<code>_</code> + (<code>s</code> の先頭の文字)」になる。これを <code>String#gsub!</code> で置き換えようとすると、そのような文字列は <code>s</code> 中にないので置換が発生しない。<code>String#gsub!</code> は置換が起きなかったとき <code>nil</code> を返すので、これを使って条件分岐ができる。<code>&&</code> だと優先度の関係から <code>String#gsub!</code> の括弧が省略できないが、後置 if なら省略できる。 @@ -207,11 +203,10 @@ puts$**?,,s</span> <code>Kernel#gets</code> は、入力を特殊変数 <code>$_</code> へ代入する。これは Perl 由来の挙動で、Ruby にはいくつか <code>$_</code> を参照するものがある。これを使って変数 <code>s</code> を置き換えると次のようになる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #953800">gets</span> -<span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,),</span><span style="color: #0550ae">=</span><span style="color: #0a3069">"_</span><span style="color: #24292f">#$_</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span> <span style="color: #cf222e">if</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #0a3069"> -puts$**?,,$_</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #953800">gets</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,),</span><span style="color: #0550ae">=</span><span style="color: #0a3069">"_</span><span style="color: #24292f">#$_</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span> <span style="color: #cf222e">if</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #0a3069">puts$**?,,$_</span></div></code></pre> </div> <p> これで 1 byte 縮む。 @@ -223,10 +218,9 @@ puts$**?,,$_</span> 回答 C を眺めると、<code>b</code> への代入に文字を費やしすぎている。これを <code>String#gsub!</code> の第一引数に直接書いてはどうか。更に、直前のマッチしたパターンを指す特殊変数 <code>$&</code> を使えば、変数 <code>b</code> を排除できる。それがこちら。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #953800">gets</span> -<span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$&</span><span style="color: #cf222e">if</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #0a3069">"_</span><span style="color: #24292f">#$_</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}[</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #0a3069"> -puts$**?,,$_</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #953800">gets</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$&</span><span style="color: #cf222e">if</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #0a3069">"_</span><span style="color: #24292f">#$_</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}[</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #0a3069">puts$**?,,$_</span></div></code></pre> </div> <p> これにより 2 bytes も一気に縮まった。 @@ -238,10 +232,9 @@ puts$**?,,$_</span> 回答 D を提出したことで tompng 氏のスコアを越え、氏のコードを閲覧できるようになった。そこから少し変更したものが、mame 氏と (変数名などの些事を除いて) 同じ以下のコードである。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">=</span><span style="color: #953800">gets</span> -<span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">1</span><span style="color: #0550ae">or</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span><span style="color: #0a3069"> -puts$**?,,s</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">=</span><span style="color: #953800">gets</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">1</span><span style="color: #0550ae">or</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> +</div><div class="codeblock-line"><span style="color: #0a3069">puts$**?,,s</span></div></code></pre> </div> <p> ここまでとは大きく異なる戦略で終了条件を判定している。使われているのはパターンマッチで、<code>in</code> がマッチの有無を <code>true</code> / <code>false</code> で返すことを利用している。<code>or</code> を用いて、最頻値の出現回数が 1 でないなら置換処理を継続する。 @@ -250,11 +243,10 @@ puts$**?,,s</span> パターンマッチの利用については途中何度か検討したが、1 でないときに処理を実行するという方針で実装しようとしてしまい、上手く短縮できなかった。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># これは 106 byte</span> -<span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">=</span><span style="color: #953800">gets</span> -<span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">2</span><span style="color: #0550ae">..</span><span style="color: #0550ae">and</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span><span style="color: #0a3069"> -puts$**?,,s</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># これは 106 byte</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">=</span><span style="color: #953800">gets</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">2</span><span style="color: #0550ae">..</span><span style="color: #0550ae">and</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">gsub!</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> +</div><div class="codeblock-line"><span style="color: #0a3069">puts$**?,,s</span></div></code></pre> </div> </section> <section id="section--hole-2--answer-f"> @@ -274,11 +266,10 @@ puts$**?,,s</span> <code>ruby</code> で <code>-p</code> を付けると、以下のようなコードを書いたかのように動作する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">while</span> <span style="color: #953800">gets</span> - <span style="color: #0550ae">...</span> <span style="color: #6e7781"># 記載したコードの処理</span> - <span style="color: #953800">puts</span> <span style="color: #0550ae">$_</span> -<span style="color: #cf222e">end</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">while</span> <span style="color: #953800">gets</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">...</span> <span style="color: #6e7781"># 記載したコードの処理</span> +</div><div class="codeblock-line"> <span style="color: #953800">puts</span> <span style="color: #0550ae">$_</span> +</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> </div> <p> また、<code>Kernel#gsub</code> という <code>$_ = $_.gsub(...)</code> と同様の処理をおこなうメソッドが生えてくる。今回は <code>String#gsub!</code> も使うので、shebang の分を回収できれば短縮になりそうだ。 @@ -287,20 +278,18 @@ puts$**?,,s</span> というわけで、実はこれまでも shebang での短縮は何度か試していた。しかし、いずれも 1 byte 増えたり変化しなかったりで成果を上げられずにいた。回答 E についても同様に、以下のようなコードを作っていた。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">#!ruby -p</span> -<span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">1</span><span style="color: #0550ae">or</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #953800">gsub</span> <span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span><span style="color: #0a3069"> -puts$**?,</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">#!ruby -p</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">1</span><span style="color: #0550ae">or</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #953800">gsub</span> <span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> +</div><div class="codeblock-line"><span style="color: #0a3069">puts$**?,</span></div></code></pre> </div> <p> しかしこれは 103 byte で縮められない。にっくきは <code>gsub</code> と <code>b</code> の間のスペースである。せっかく <code>s.gsub!</code> を <code>gsub</code> にしたのに、後ろが記号でなくなったことでスペースが生じている。といって、括弧を付けるのも上手くはいかない。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># これも同じく 103 byte</span> -<span style="color: #6e7781">#!ruby -p</span> -<span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">1</span><span style="color: #0550ae">or</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #0550ae">&&</span><span style="color: #953800">gsub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span><span style="color: #0a3069"> -puts$**?,</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># これも同じく 103 byte</span> +</div><div class="codeblock-line"><span style="color: #6e7781">#!ruby -p</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">1</span><span style="color: #0550ae">or</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #0550ae">&&</span><span style="color: #953800">gsub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> +</div><div class="codeblock-line"><span style="color: #0a3069">puts$**?,</span></div></code></pre> </div> <p> 外側の括弧を移動させてくれば <code>gsub</code> と <code>b</code> の間のスペースを消せるが、<code>;</code> を <code>&&</code> にせねばならず失敗する。この問題を解決したのが最終回答の 102 byte コードである。 @@ -309,10 +298,9 @@ puts$**?,</span> <section id="section--hole-2--answer-g"> <h3><a href="#section--hole-2--answer-g">最終回答 (102 byte)</a></h3> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">#!ruby -p</span> -<span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">1</span><span style="color: #0550ae">or</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #0550ae">%</span><span style="color: #953800">gsub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span><span style="color: #0a3069"> -puts$**?,</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">#!ruby -p</span> +</div><div class="codeblock-line"><span style="color: #0a3069">?A</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">upto</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">?Z</span><span style="color: #24292f;background-color: #f6f8fa">){</span><span style="color: #0550ae">$_</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">scan</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #116329">/(?=(.\B.))/</span><span style="color: #24292f;background-color: #f6f8fa">).</span><span style="color: #8250df">tally</span><span style="color: #24292f;background-color: #f6f8fa">.</span><span style="color: #8250df">max_by</span><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #24292f;background-color: #f6f8fa">_2</span><span style="color: #24292f;background-color: #f6f8fa">}</span><span style="color: #cf222e">in</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">],</span><span style="color: #0550ae">1</span><span style="color: #0550ae">or</span><span style="color: #0550ae">$*</span><span style="color: #0550ae"><<</span><span style="color: #953800">it</span><span style="color: #0550ae">+</span><span style="color: #0a3069">?:</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #0550ae">%</span><span style="color: #953800">gsub</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span><span style="color: #24292f;background-color: #f6f8fa">it</span><span style="color: #24292f;background-color: #f6f8fa">)}</span> +</div><div class="codeblock-line"><span style="color: #0a3069">puts$**?,</span></div></code></pre> </div> <p> <code>String#%</code> は文字列のフォーマット処理をおこなう演算子だが、ここでは特にフォーマット目的で呼んでいるわけではない。ここで重要なのは、この演算子が特に副作用を持たず、どんな型でも右辺に取れることである。<code>b</code> の中身にフォーマット指定子はない (<code>%</code> などの記号が入力されないことが問題文から分かる) ので、誤って動作を壊してしまうおそれもない。 diff --git a/services/nuldoc/public/blog/posts/2025-12-06/archive-dynamic-site-with-wget/index.html b/services/nuldoc/public/blog/posts/2025-12-06/archive-dynamic-site-with-wget/index.html index 13a7761e..988abaa5 100644 --- a/services/nuldoc/public/blog/posts/2025-12-06/archive-dynamic-site-with-wget/index.html +++ b/services/nuldoc/public/blog/posts/2025-12-06/archive-dynamic-site-with-wget/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>wget を使って動的サイトを静的サイトにアーカイブする|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -101,42 +101,41 @@ 今回使用したスクリプトはこちら: <a class="url" href="https://github.com/nsfisis/phperkaigi-2024-albatross-archive/blob/cc837f6d2109555e2392016e8f6820fb5fd46dd6/archive.sh" rel="noreferrer" target="_blank">https://github.com/nsfisis/phperkaigi-2024-albatross-archive/blob/cc837f6d2109555e2392016e8f6820fb5fd46dd6/archive.sh</a> </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"># 指定した URL からスタートしてリンクを辿りながら全ファイルをファイルに書き出す</span> -<span style="color: #6e7781">#</span> -<span style="color: #6e7781"># --mirror リンクを再帰的に辿ってダウンロードする</span> -<span style="color: #6e7781"># --page-requisites CSS や画像等も含めて HTML から参照されている全ファイルをダウンロードする</span> -<span style="color: #6e7781"># --convert-links リンクを相対リンクへ変換する</span> -<span style="color: #6e7781"># --adjust-extension URL に拡張子が無くてもいい感じに推測する</span> -<span style="color: #6e7781"># --no-parent 親ディレクトリは見に行かない</span> -<span style="color: #6e7781"># --no-wait=1 リクエスト間で 1 秒待機する</span> -<span style="color: #6e7781"># -P ./archive/ 指定したディレクトリに保存する</span> -wget <span style="color: #0a3069">\</span> - <span style="color: #116329">--mirror</span> <span style="color: #0a3069">\</span> - <span style="color: #116329">--page-requisites</span> <span style="color: #0a3069">\</span> - <span style="color: #116329">--convert-links</span> <span style="color: #0a3069">\</span> - <span style="color: #116329">--adjust-extension</span> <span style="color: #0a3069">\</span> - <span style="color: #116329">--no-parent</span> <span style="color: #0a3069">\</span> - <span style="color: #116329">--wait</span><span style="color: #0550ae">=</span>1 <span style="color: #0a3069">\</span> - <span style="color: #116329">-P</span> ./archive/ <span style="color: #0a3069">\</span> - https://t.nil.ninja/phperkaigi/2024/golf/ - -<span style="color: #6e7781"># ディレクトリ構造を調整する</span> -<span style="color: #953800">mv</span> ./archive/t.nil.ninja/phperkaigi/2024/golf/<span style="color: #cf222e">*</span> ./archive -<span style="color: #953800">rmdir</span> ./archive/t.nil.ninja/phperkaigi/2024/golf/ -<span style="color: #953800">rmdir</span> ./archive/t.nil.ninja/phperkaigi/2024/ -<span style="color: #953800">rmdir</span> ./archive/t.nil.ninja/phperkaigi/ -<span style="color: #953800">rmdir</span> ./archive/t.nil.ninja/ - -<span style="color: #953800">mkdir</span> <span style="color: #116329">-p</span> ./archive/api/quizzes/<span style="color: #0550ae">{</span>1,2,3<span style="color: #0550ae">}</span> - -<span style="color: #6e7781"># 動的な API エンドポイントを叩いて結果を JSON ファイルとして保存する</span> -wget <span style="color: #116329">-O</span> ./archive/api/quizzes/1/chart.json https://t.nil.ninja/phperkaigi/2024/golf/api/quizzes/1/chart -wget <span style="color: #116329">-O</span> ./archive/api/quizzes/2/chart.json https://t.nil.ninja/phperkaigi/2024/golf/api/quizzes/2/chart -wget <span style="color: #116329">-O</span> ./archive/api/quizzes/3/chart.json https://t.nil.ninja/phperkaigi/2024/golf/api/quizzes/3/chart - -<span style="color: #6e7781"># 上記 API を叩いている箇所を、落としてきた静的ファイルを参照するように変更する</span> -<span style="color: #953800">sed</span> <span style="color: #116329">-i</span> <span style="color: #116329">-e</span> <span style="color: #0a3069">'s#/chart`#/chart.json`#'</span> ./archive/assets/chart.js -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># 指定した URL からスタートしてリンクを辿りながら全ファイルをファイルに書き出す</span> +</div><div class="codeblock-line"><span style="color: #6e7781">#</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># --mirror リンクを再帰的に辿ってダウンロードする</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># --page-requisites CSS や画像等も含めて HTML から参照されている全ファイルをダウンロードする</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># --convert-links リンクを相対リンクへ変換する</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># --adjust-extension URL に拡張子が無くてもいい感じに推測する</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># --no-parent 親ディレクトリは見に行かない</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># --no-wait=1 リクエスト間で 1 秒待機する</span> +</div><div class="codeblock-line"><span style="color: #6e7781"># -P ./archive/ 指定したディレクトリに保存する</span> +</div><div class="codeblock-line">wget <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--mirror</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--page-requisites</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--convert-links</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--adjust-extension</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--no-parent</span> <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">--wait</span><span style="color: #0550ae">=</span>1 <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> <span style="color: #116329">-P</span> ./archive/ <span style="color: #0a3069">\</span> +</div><div class="codeblock-line"> https://t.nil.ninja/phperkaigi/2024/golf/ +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781"># ディレクトリ構造を調整する</span> +</div><div class="codeblock-line"><span style="color: #953800">mv</span> ./archive/t.nil.ninja/phperkaigi/2024/golf/<span style="color: #cf222e">*</span> ./archive +</div><div class="codeblock-line"><span style="color: #953800">rmdir</span> ./archive/t.nil.ninja/phperkaigi/2024/golf/ +</div><div class="codeblock-line"><span style="color: #953800">rmdir</span> ./archive/t.nil.ninja/phperkaigi/2024/ +</div><div class="codeblock-line"><span style="color: #953800">rmdir</span> ./archive/t.nil.ninja/phperkaigi/ +</div><div class="codeblock-line"><span style="color: #953800">rmdir</span> ./archive/t.nil.ninja/ +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #953800">mkdir</span> <span style="color: #116329">-p</span> ./archive/api/quizzes/<span style="color: #0550ae">{</span>1,2,3<span style="color: #0550ae">}</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781"># 動的な API エンドポイントを叩いて結果を JSON ファイルとして保存する</span> +</div><div class="codeblock-line">wget <span style="color: #116329">-O</span> ./archive/api/quizzes/1/chart.json https://t.nil.ninja/phperkaigi/2024/golf/api/quizzes/1/chart +</div><div class="codeblock-line">wget <span style="color: #116329">-O</span> ./archive/api/quizzes/2/chart.json https://t.nil.ninja/phperkaigi/2024/golf/api/quizzes/2/chart +</div><div class="codeblock-line">wget <span style="color: #116329">-O</span> ./archive/api/quizzes/3/chart.json https://t.nil.ninja/phperkaigi/2024/golf/api/quizzes/3/chart +</div><div class="codeblock-line"> +</div><div class="codeblock-line"><span style="color: #6e7781"># 上記 API を叩いている箇所を、落としてきた静的ファイルを参照するように変更する</span> +</div><div class="codeblock-line"><span style="color: #953800">sed</span> <span style="color: #116329">-i</span> <span style="color: #116329">-e</span> <span style="color: #0a3069">'s#/chart`#/chart.json`#'</span> ./archive/assets/chart.js</div></code></pre> </div> <p> このように wget に適切なオプションを渡すことで、指定したページから遷移可能なページを再帰的に辿っていき、サイト内の全ページをファイルへ落とすことができる。今回のサイトにはページ遷移では辿り着けないページがあったが (管理画面など)、運用が停止している今そういったページはアーカイブしなくてもよい。 @@ -145,17 +144,16 @@ wget <span style="color: #116329">-O</span> ./archive/api/quizzes/3/chart.json h あとはこのファイルを適当にサーブしてやればよい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">server</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">listen</span> <span style="color: #0550ae">80</span> <span style="color: #0a3069">default</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">listen</span> <span style="color: #0a3069">[::]:80</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - - <span style="color: #cf222e">charset</span> <span style="color: #0a3069">UTF-8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - - <span style="color: #cf222e">location</span> <span style="color: #24292f;background-color: #f6f8fa">/phperkaigi/2024/golf/</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">alias</span> <span style="color: #24292f;background-color: #f6f8fa">/archive/</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> -<span style="color: #24292f;background-color: #f6f8fa">}</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">server</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">listen</span> <span style="color: #0550ae">80</span> <span style="color: #0a3069">default</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">listen</span> <span style="color: #0a3069">[::]:80</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #cf222e">charset</span> <span style="color: #0a3069">UTF-8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> +</div><div class="codeblock-line"> <span style="color: #cf222e">location</span> <span style="color: #24292f;background-color: #f6f8fa">/phperkaigi/2024/golf/</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">alias</span> <span style="color: #24292f;background-color: #f6f8fa">/archive/</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> </div> </section> <section id="section--outro"> diff --git a/services/nuldoc/public/blog/posts/2025-12-31/2025-reflections/index.html b/services/nuldoc/public/blog/posts/2025-12-31/2025-reflections/index.html index 9f4a5b7d..75a78bf8 100644 --- a/services/nuldoc/public/blog/posts/2025-12-31/2025-reflections/index.html +++ b/services/nuldoc/public/blog/posts/2025-12-31/2025-reflections/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>2025 年の振り返り|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2026-01-16/development-environment-2026/index.html b/services/nuldoc/public/blog/posts/2026-01-16/development-environment-2026/index.html index 128d5209..06bc03f4 100644 --- a/services/nuldoc/public/blog/posts/2026-01-16/development-environment-2026/index.html +++ b/services/nuldoc/public/blog/posts/2026-01-16/development-environment-2026/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>開発環境現状確認 2026|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026/index.html b/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026/index.html index 905cf5b5..65abf235 100644 --- a/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026/index.html +++ b/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>このサイトの静的サイトジェネレータを書き直した (2026)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/3/index.html b/services/nuldoc/public/blog/posts/3/index.html index ccd30e91..428565cd 100644 --- a/services/nuldoc/public/blog/posts/3/index.html +++ b/services/nuldoc/public/blog/posts/3/index.html @@ -15,7 +15,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/posts/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>投稿一覧 (3ページ目)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/4/index.html b/services/nuldoc/public/blog/posts/4/index.html index 0bab68b4..a0969660 100644 --- a/services/nuldoc/public/blog/posts/4/index.html +++ b/services/nuldoc/public/blog/posts/4/index.html @@ -15,7 +15,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/posts/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>投稿一覧 (4ページ目)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/posts/5/index.html b/services/nuldoc/public/blog/posts/5/index.html index dffcbc52..b70c17cd 100644 --- a/services/nuldoc/public/blog/posts/5/index.html +++ b/services/nuldoc/public/blog/posts/5/index.html @@ -15,7 +15,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/posts/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>投稿一覧 (5ページ目)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> @@ -50,7 +50,7 @@ <div class="pagination-page"> <a href="/posts/">1</a> </div> - <div class="pagination-elipsis"> + <div class="pagination-ellipsis"> … </div> <div class="pagination-page"> @@ -287,7 +287,7 @@ <div class="pagination-page"> <a href="/posts/">1</a> </div> - <div class="pagination-elipsis"> + <div class="pagination-ellipsis"> … </div> <div class="pagination-page"> diff --git a/services/nuldoc/public/blog/posts/6/index.html b/services/nuldoc/public/blog/posts/6/index.html index 39dcda0d..429ef75e 100644 --- a/services/nuldoc/public/blog/posts/6/index.html +++ b/services/nuldoc/public/blog/posts/6/index.html @@ -15,7 +15,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/posts/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>投稿一覧 (6ページ目)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> @@ -50,7 +50,7 @@ <div class="pagination-page"> <a href="/posts/">1</a> </div> - <div class="pagination-elipsis"> + <div class="pagination-ellipsis"> … </div> <div class="pagination-page"> @@ -276,7 +276,7 @@ <div class="pagination-page"> <a href="/posts/">1</a> </div> - <div class="pagination-elipsis"> + <div class="pagination-ellipsis"> … </div> <div class="pagination-page"> diff --git a/services/nuldoc/public/blog/posts/index.html b/services/nuldoc/public/blog/posts/index.html index 43aab702..8bd417c7 100644 --- a/services/nuldoc/public/blog/posts/index.html +++ b/services/nuldoc/public/blog/posts/index.html @@ -15,7 +15,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/posts/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>投稿一覧 (1ページ目)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> @@ -52,7 +52,7 @@ <div class="pagination-page"> <a href="/posts/2/">2</a> </div> - <div class="pagination-elipsis"> + <div class="pagination-ellipsis"> … </div> <div class="pagination-page"> @@ -268,7 +268,7 @@ <div class="pagination-page"> <a href="/posts/2/">2</a> </div> - <div class="pagination-elipsis"> + <div class="pagination-ellipsis"> … </div> <div class="pagination-page"> diff --git a/services/nuldoc/public/blog/style.css b/services/nuldoc/public/blog/style.css index eba86a34..4090151a 100644 --- a/services/nuldoc/public/blog/style.css +++ b/services/nuldoc/public/blog/style.css @@ -181,18 +181,18 @@ code { font-size: 0.9rem; } -.shiki code { +.codeblock code { background-color: unset; padding: 0; } /* https://github.com/shikijs/shiki/issues/3 */ -.shiki code { +.codeblock.numbered code { counter-reset: codeblock-line-number; counter-increment: codeblock-line-number 0; } -.numbered .shiki code .line::before { +.codeblock.numbered code .codeblock-line::before { content: counter(codeblock-line-number); counter-increment: codeblock-line-number; width: 2rem; @@ -280,7 +280,7 @@ h1 { .admonition { background-color: #f5f5f5; - border: 1px solid #d1d1d1; + border: 1px solid #ddd; padding: 1rem 1.5rem; margin: 1rem 0; } @@ -335,8 +335,8 @@ img { gap: 1rem; margin: 2rem 0; padding: 1rem 0; - border-top: 1px solid #d1d1d1; - border-bottom: 1px solid #d1d1d1; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; } .pagination-page { @@ -368,7 +368,7 @@ img { color: #fff; } -.pagination-elipsis { +.pagination-ellipsis { color: #999; } diff --git a/services/nuldoc/public/blog/tags/c/index.html b/services/nuldoc/public/blog/tags/c/index.html index 4ada2b09..a9838d82 100644 --- a/services/nuldoc/public/blog/tags/c/index.html +++ b/services/nuldoc/public/blog/tags/c/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/c/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「C」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/ci-cd/index.html b/services/nuldoc/public/blog/tags/ci-cd/index.html index 64043793..40c97935 100644 --- a/services/nuldoc/public/blog/tags/ci-cd/index.html +++ b/services/nuldoc/public/blog/tags/ci-cd/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/ci-cd/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「CI/CD」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/code-golf/index.html b/services/nuldoc/public/blog/tags/code-golf/index.html index 2b2f0b71..57675938 100644 --- a/services/nuldoc/public/blog/tags/code-golf/index.html +++ b/services/nuldoc/public/blog/tags/code-golf/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/code-golf/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「コードゴルフ」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/cohackpp/index.html b/services/nuldoc/public/blog/tags/cohackpp/index.html index 419d2753..25c0afa7 100644 --- a/services/nuldoc/public/blog/tags/cohackpp/index.html +++ b/services/nuldoc/public/blog/tags/cohackpp/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/cohackpp/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「紅白ぺぱ合戦」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/composer/index.html b/services/nuldoc/public/blog/tags/composer/index.html index f2714a58..a4bbc409 100644 --- a/services/nuldoc/public/blog/tags/composer/index.html +++ b/services/nuldoc/public/blog/tags/composer/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/composer/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Composer」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/conference/index.html b/services/nuldoc/public/blog/tags/conference/index.html index 2d44739f..f9c31b4c 100644 --- a/services/nuldoc/public/blog/tags/conference/index.html +++ b/services/nuldoc/public/blog/tags/conference/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/conference/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「カンファレンス」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/cpp/index.html b/services/nuldoc/public/blog/tags/cpp/index.html index 8116b0b1..2ea2ccbe 100644 --- a/services/nuldoc/public/blog/tags/cpp/index.html +++ b/services/nuldoc/public/blog/tags/cpp/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/cpp/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「C++」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/float/index.html b/services/nuldoc/public/blog/tags/float/index.html index 4f707cec..73fe0116 100644 --- a/services/nuldoc/public/blog/tags/float/index.html +++ b/services/nuldoc/public/blog/tags/float/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/float/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「浮動小数点数」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/game/index.html b/services/nuldoc/public/blog/tags/game/index.html index 074196c4..5db38213 100644 --- a/services/nuldoc/public/blog/tags/game/index.html +++ b/services/nuldoc/public/blog/tags/game/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/game/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「ゲーム」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/gitlab/index.html b/services/nuldoc/public/blog/tags/gitlab/index.html index 98d8d0c0..151dadf0 100644 --- a/services/nuldoc/public/blog/tags/gitlab/index.html +++ b/services/nuldoc/public/blog/tags/gitlab/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/gitlab/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「GitLab」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/go/index.html b/services/nuldoc/public/blog/tags/go/index.html index dbbfa94e..6b39c553 100644 --- a/services/nuldoc/public/blog/tags/go/index.html +++ b/services/nuldoc/public/blog/tags/go/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/go/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Go」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/http/index.html b/services/nuldoc/public/blog/tags/http/index.html index f73599a8..dbe4e080 100644 --- a/services/nuldoc/public/blog/tags/http/index.html +++ b/services/nuldoc/public/blog/tags/http/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/http/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「HTTP」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/index.html b/services/nuldoc/public/blog/tags/index.html index 18c78531..57a7523e 100644 --- a/services/nuldoc/public/blog/tags/index.html +++ b/services/nuldoc/public/blog/tags/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/isucon/index.html b/services/nuldoc/public/blog/tags/isucon/index.html index c44aa5cc..46de16b5 100644 --- a/services/nuldoc/public/blog/tags/isucon/index.html +++ b/services/nuldoc/public/blog/tags/isucon/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/isucon/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「ISUCON」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/macos/index.html b/services/nuldoc/public/blog/tags/macos/index.html index 86182028..c58d8dd4 100644 --- a/services/nuldoc/public/blog/tags/macos/index.html +++ b/services/nuldoc/public/blog/tags/macos/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/macos/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「macOS」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/mncore-challenge/index.html b/services/nuldoc/public/blog/tags/mncore-challenge/index.html index be2dff30..bdf21530 100644 --- a/services/nuldoc/public/blog/tags/mncore-challenge/index.html +++ b/services/nuldoc/public/blog/tags/mncore-challenge/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/mncore-challenge/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「MN-Core Challenge」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/neovim/index.html b/services/nuldoc/public/blog/tags/neovim/index.html index 8975379c..1e8513e8 100644 --- a/services/nuldoc/public/blog/tags/neovim/index.html +++ b/services/nuldoc/public/blog/tags/neovim/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/neovim/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Neovim」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/note-to-self/index.html b/services/nuldoc/public/blog/tags/note-to-self/index.html index eb0b947c..f1651906 100644 --- a/services/nuldoc/public/blog/tags/note-to-self/index.html +++ b/services/nuldoc/public/blog/tags/note-to-self/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/note-to-self/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「備忘録」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/ouj/index.html b/services/nuldoc/public/blog/tags/ouj/index.html index 8f17ecdd..7b430224 100644 --- a/services/nuldoc/public/blog/tags/ouj/index.html +++ b/services/nuldoc/public/blog/tags/ouj/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/ouj/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「放送大学」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/perl/index.html b/services/nuldoc/public/blog/tags/perl/index.html index 1ef8343d..5f3476cc 100644 --- a/services/nuldoc/public/blog/tags/perl/index.html +++ b/services/nuldoc/public/blog/tags/perl/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/perl/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Perl」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/php/index.html b/services/nuldoc/public/blog/tags/php/index.html index f18c30c3..dbc138b3 100644 --- a/services/nuldoc/public/blog/tags/php/index.html +++ b/services/nuldoc/public/blog/tags/php/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/php/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/phpcon-nagoya/index.html b/services/nuldoc/public/blog/tags/phpcon-nagoya/index.html index c2796bba..843bb31f 100644 --- a/services/nuldoc/public/blog/tags/phpcon-nagoya/index.html +++ b/services/nuldoc/public/blog/tags/phpcon-nagoya/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/phpcon-nagoya/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス名古屋」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/phpcon-odawara/index.html b/services/nuldoc/public/blog/tags/phpcon-odawara/index.html index d52f5526..14690029 100644 --- a/services/nuldoc/public/blog/tags/phpcon-odawara/index.html +++ b/services/nuldoc/public/blog/tags/phpcon-odawara/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/phpcon-odawara/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス小田原」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/phpconfuk/index.html b/services/nuldoc/public/blog/tags/phpconfuk/index.html index cf6989a3..73ab67db 100644 --- a/services/nuldoc/public/blog/tags/phpconfuk/index.html +++ b/services/nuldoc/public/blog/tags/phpconfuk/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/phpconfuk/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス福岡」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/phpconkagawa/index.html b/services/nuldoc/public/blog/tags/phpconkagawa/index.html index acf6dc85..1d552c60 100644 --- a/services/nuldoc/public/blog/tags/phpconkagawa/index.html +++ b/services/nuldoc/public/blog/tags/phpconkagawa/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/phpconkagawa/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス香川」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/phpconokinawa/index.html b/services/nuldoc/public/blog/tags/phpconokinawa/index.html index cd11d6b1..a8075022 100644 --- a/services/nuldoc/public/blog/tags/phpconokinawa/index.html +++ b/services/nuldoc/public/blog/tags/phpconokinawa/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/phpconokinawa/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス沖縄」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/phperkaigi/index.html b/services/nuldoc/public/blog/tags/phperkaigi/index.html index de2fb902..d4d7cff3 100644 --- a/services/nuldoc/public/blog/tags/phperkaigi/index.html +++ b/services/nuldoc/public/blog/tags/phperkaigi/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/phperkaigi/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHPerKaigi」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/phpkansai/index.html b/services/nuldoc/public/blog/tags/phpkansai/index.html index 1763034e..090ad836 100644 --- a/services/nuldoc/public/blog/tags/phpkansai/index.html +++ b/services/nuldoc/public/blog/tags/phpkansai/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/phpkansai/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス関西」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/piet/index.html b/services/nuldoc/public/blog/tags/piet/index.html index 258bf828..0ae85b32 100644 --- a/services/nuldoc/public/blog/tags/piet/index.html +++ b/services/nuldoc/public/blog/tags/piet/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/piet/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Piet」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/python/index.html b/services/nuldoc/public/blog/tags/python/index.html index 92fe0b0b..7ed42261 100644 --- a/services/nuldoc/public/blog/tags/python/index.html +++ b/services/nuldoc/public/blog/tags/python/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/python/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Python」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/ruby/index.html b/services/nuldoc/public/blog/tags/ruby/index.html index d25a40b4..fc98ef2e 100644 --- a/services/nuldoc/public/blog/tags/ruby/index.html +++ b/services/nuldoc/public/blog/tags/ruby/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/ruby/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Ruby」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/rubykaigi/index.html b/services/nuldoc/public/blog/tags/rubykaigi/index.html index d276f893..e08543e9 100644 --- a/services/nuldoc/public/blog/tags/rubykaigi/index.html +++ b/services/nuldoc/public/blog/tags/rubykaigi/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/rubykaigi/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「RubyKaigi」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/rust/index.html b/services/nuldoc/public/blog/tags/rust/index.html index b672ba6c..d4af32ec 100644 --- a/services/nuldoc/public/blog/tags/rust/index.html +++ b/services/nuldoc/public/blog/tags/rust/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/rust/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Rust」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/scala/index.html b/services/nuldoc/public/blog/tags/scala/index.html index 4deaa800..e22ab835 100644 --- a/services/nuldoc/public/blog/tags/scala/index.html +++ b/services/nuldoc/public/blog/tags/scala/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/scala/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Scala」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/scalamatsuri/index.html b/services/nuldoc/public/blog/tags/scalamatsuri/index.html index 996c01bb..abe68c1d 100644 --- a/services/nuldoc/public/blog/tags/scalamatsuri/index.html +++ b/services/nuldoc/public/blog/tags/scalamatsuri/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/scalamatsuri/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「ScalaMatsuri」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/speedcubing/index.html b/services/nuldoc/public/blog/tags/speedcubing/index.html index 87311347..b8c258a6 100644 --- a/services/nuldoc/public/blog/tags/speedcubing/index.html +++ b/services/nuldoc/public/blog/tags/speedcubing/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/speedcubing/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「ルービックキューブ」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/trick/index.html b/services/nuldoc/public/blog/tags/trick/index.html index 3ca51d83..86e9c550 100644 --- a/services/nuldoc/public/blog/tags/trick/index.html +++ b/services/nuldoc/public/blog/tags/trick/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/trick/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「TRICK」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/vim/index.html b/services/nuldoc/public/blog/tags/vim/index.html index cdfbdaf8..2a555ba7 100644 --- a/services/nuldoc/public/blog/tags/vim/index.html +++ b/services/nuldoc/public/blog/tags/vim/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/vim/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Vim」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/wasm/index.html b/services/nuldoc/public/blog/tags/wasm/index.html index 4aaf7776..12b6bcc2 100644 --- a/services/nuldoc/public/blog/tags/wasm/index.html +++ b/services/nuldoc/public/blog/tags/wasm/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/wasm/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「WebAssembly」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/wireguard/index.html b/services/nuldoc/public/blog/tags/wireguard/index.html index ce3ae1b0..26add2d3 100644 --- a/services/nuldoc/public/blog/tags/wireguard/index.html +++ b/services/nuldoc/public/blog/tags/wireguard/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/wireguard/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「WireGuard」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/yaml/index.html b/services/nuldoc/public/blog/tags/yaml/index.html index 4b097421..d936e92c 100644 --- a/services/nuldoc/public/blog/tags/yaml/index.html +++ b/services/nuldoc/public/blog/tags/yaml/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/yaml/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「YAML」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/yapc/index.html b/services/nuldoc/public/blog/tags/yapc/index.html index 35a7e2a7..4f107163 100644 --- a/services/nuldoc/public/blog/tags/yapc/index.html +++ b/services/nuldoc/public/blog/tags/yapc/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/yapc/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「YAPC」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/blog/tags/zsh/index.html b/services/nuldoc/public/blog/tags/zsh/index.html index fbd2cd91..ee2263b2 100644 --- a/services/nuldoc/public/blog/tags/zsh/index.html +++ b/services/nuldoc/public/blog/tags/zsh/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/zsh/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Zsh」一覧|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/default/404.html b/services/nuldoc/public/default/404.html index 466c34d4..0cc57490 100644 --- a/services/nuldoc/public/default/404.html +++ b/services/nuldoc/public/default/404.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Page Not Found|nsfisis.dev</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/default/index.html b/services/nuldoc/public/default/index.html index b5bc01e6..51088ef7 100644 --- a/services/nuldoc/public/default/index.html +++ b/services/nuldoc/public/default/index.html @@ -15,7 +15,7 @@ <link rel="alternate" type="application/atom+xml" href="https://nsfisis.dev/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>nsfisis.dev</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/default/style.css b/services/nuldoc/public/default/style.css index eba86a34..4090151a 100644 --- a/services/nuldoc/public/default/style.css +++ b/services/nuldoc/public/default/style.css @@ -181,18 +181,18 @@ code { font-size: 0.9rem; } -.shiki code { +.codeblock code { background-color: unset; padding: 0; } /* https://github.com/shikijs/shiki/issues/3 */ -.shiki code { +.codeblock.numbered code { counter-reset: codeblock-line-number; counter-increment: codeblock-line-number 0; } -.numbered .shiki code .line::before { +.codeblock.numbered code .codeblock-line::before { content: counter(codeblock-line-number); counter-increment: codeblock-line-number; width: 2rem; @@ -280,7 +280,7 @@ h1 { .admonition { background-color: #f5f5f5; - border: 1px solid #d1d1d1; + border: 1px solid #ddd; padding: 1rem 1.5rem; margin: 1rem 0; } @@ -335,8 +335,8 @@ img { gap: 1rem; margin: 2rem 0; padding: 1rem 0; - border-top: 1px solid #d1d1d1; - border-bottom: 1px solid #d1d1d1; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; } .pagination-page { @@ -368,7 +368,7 @@ img { color: #fff; } -.pagination-elipsis { +.pagination-ellipsis { color: #999; } diff --git a/services/nuldoc/public/slides/404.html b/services/nuldoc/public/slides/404.html index 14a425ba..942c3508 100644 --- a/services/nuldoc/public/slides/404.html +++ b/services/nuldoc/public/slides/404.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Page Not Found|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> diff --git a/services/nuldoc/public/slides/slides/2023-01-18/phpstudy-tokyo-148/index.html b/services/nuldoc/public/slides/slides/2023-01-18/phpstudy-tokyo-148/index.html index e854837b..434bc263 100644 --- a/services/nuldoc/public/slides/slides/2023-01-18/phpstudy-tokyo-148/index.html +++ b/services/nuldoc/public/slides/slides/2023-01-18/phpstudy-tokyo-148/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>明日のあなたの役に立たない PHP コーディング技法~polyglot~ (PHP 勉強会@東京 第148 回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-02-15/phpstudy-tokyo-149/index.html b/services/nuldoc/public/slides/slides/2023-02-15/phpstudy-tokyo-149/index.html index 508f0688..cfa0c164 100644 --- a/services/nuldoc/public/slides/slides/2023-02-15/phpstudy-tokyo-149/index.html +++ b/services/nuldoc/public/slides/slides/2023-02-15/phpstudy-tokyo-149/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2023 のトークン問題でボツにした問題を供養する (PHP 勉強会@東京 第149 回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-03-15/phpstudy-tokyo-150/index.html b/services/nuldoc/public/slides/slides/2023-03-15/phpstudy-tokyo-150/index.html index 59736835..700d4b03 100644 --- a/services/nuldoc/public/slides/slides/2023-03-15/phpstudy-tokyo-150/index.html +++ b/services/nuldoc/public/slides/slides/2023-03-15/phpstudy-tokyo-150/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>明日のあなたの役に立たない PHP コーディング技法~細長い FizzBuzz を書く~ (PHP 勉強会@東京 第150 回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-03-24/phperkaigi-2023/index.html b/services/nuldoc/public/slides/slides/2023-03-24/phperkaigi-2023/index.html index c813dd2a..5060156d 100644 --- a/services/nuldoc/public/slides/slides/2023-03-24/phperkaigi-2023/index.html +++ b/services/nuldoc/public/slides/slides/2023-03-24/phperkaigi-2023/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>詳説「参照」PHP の参照を完全に理解する (PHPerKaigi 2023)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-03-25/phperkaigi-2023-tokens/index.html b/services/nuldoc/public/slides/slides/2023-03-25/phperkaigi-2023-tokens/index.html index 43f8929c..84eaf51b 100644 --- a/services/nuldoc/public/slides/slides/2023-03-25/phperkaigi-2023-tokens/index.html +++ b/services/nuldoc/public/slides/slides/2023-03-25/phperkaigi-2023-tokens/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPer チャレンジ解説 (デジタルサーカス株式会社) (PHPerKaigi 2023)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-04-12/phpstudy-tokyo-151/index.html b/services/nuldoc/public/slides/slides/2023-04-12/phpstudy-tokyo-151/index.html index a7ce2545..8d5b1891 100644 --- a/services/nuldoc/public/slides/slides/2023-04-12/phpstudy-tokyo-151/index.html +++ b/services/nuldoc/public/slides/slides/2023-04-12/phpstudy-tokyo-151/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>list でない array の末尾を探す (PHP 勉強会@東京 第151 回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-06-21/phpstudy-tokyo-153/index.html b/services/nuldoc/public/slides/slides/2023-06-21/phpstudy-tokyo-153/index.html index 0d33d707..e20b28b6 100644 --- a/services/nuldoc/public/slides/slides/2023-06-21/phpstudy-tokyo-153/index.html +++ b/services/nuldoc/public/slides/slides/2023-06-21/phpstudy-tokyo-153/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>テキストファイルの末尾には改行コードを入れよう (PHP 勉強会@東京 第153 回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-06-23/phpconfuk-2023-eve/index.html b/services/nuldoc/public/slides/slides/2023-06-23/phpconfuk-2023-eve/index.html index c23fcc3b..a6350f9c 100644 --- a/services/nuldoc/public/slides/slides/2023-06-23/phpconfuk-2023-eve/index.html +++ b/services/nuldoc/public/slides/slides/2023-06-23/phpconfuk-2023-eve/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>巨大なコードベースへ突撃するために (PHP カンファレンス福岡 2023 前夜祭 (非公式))|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-07-26/phpstudy-tokyo-154/index.html b/services/nuldoc/public/slides/slides/2023-07-26/phpstudy-tokyo-154/index.html index a6e55e61..f7550d6d 100644 --- a/services/nuldoc/public/slides/slides/2023-07-26/phpstudy-tokyo-154/index.html +++ b/services/nuldoc/public/slides/slides/2023-07-26/phpstudy-tokyo-154/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>言語間で比較するエラーの通知と処理 (PHP 勉強会@東京 第154 回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-08-24/phpstudy-tokyo-155/index.html b/services/nuldoc/public/slides/slides/2023-08-24/phpstudy-tokyo-155/index.html index a7b3ce47..b6443936 100644 --- a/services/nuldoc/public/slides/slides/2023-08-24/phpstudy-tokyo-155/index.html +++ b/services/nuldoc/public/slides/slides/2023-08-24/phpstudy-tokyo-155/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP 3.0 の処理系のソースを読んでみる (PHP 勉強会@東京 第155 回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2023-10-25/phpstudy-tokyo-157/index.html b/services/nuldoc/public/slides/slides/2023-10-25/phpstudy-tokyo-157/index.html index f39aab18..4ef5bc14 100644 --- a/services/nuldoc/public/slides/slides/2023-10-25/phpstudy-tokyo-157/index.html +++ b/services/nuldoc/public/slides/slides/2023-10-25/phpstudy-tokyo-157/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP コードを隔離された環境で安全に動かす (on WebAssembly) (PHP 勉強会@東京 第157 回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2024-01-24/phpstudy-tokyo-160/index.html b/services/nuldoc/public/slides/slides/2024-01-24/phpstudy-tokyo-160/index.html index e2f756c5..b98423a1 100644 --- a/services/nuldoc/public/slides/slides/2024-01-24/phpstudy-tokyo-160/index.html +++ b/services/nuldoc/public/slides/slides/2024-01-24/phpstudy-tokyo-160/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPStan の力で Algebraic Data Types を実現する (PHP 勉強会@東京 第160 回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2024-03-08/phperkaigi-2024/index.html b/services/nuldoc/public/slides/slides/2024-03-08/phperkaigi-2024/index.html index 91bf69e3..5e22750e 100644 --- a/services/nuldoc/public/slides/slides/2024-03-08/phperkaigi-2024/index.html +++ b/services/nuldoc/public/slides/slides/2024-03-08/phperkaigi-2024/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>WebAssembly を理解する 〜VM の作成を通して〜 (PHPerKaigi 2024)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2024-03-15/ya8-2024/index.html b/services/nuldoc/public/slides/slides/2024-03-15/ya8-2024/index.html index 17a01670..2214afb6 100644 --- a/services/nuldoc/public/slides/slides/2024-03-15/ya8-2024/index.html +++ b/services/nuldoc/public/slides/slides/2024-03-15/ya8-2024/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>CLI の PHP プログラムを限界まで高速化してみる (Ya8 2024)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2024-04-13/phpcon-odawara-2024/index.html b/services/nuldoc/public/slides/slides/2024-04-13/phpcon-odawara-2024/index.html index 42c7b62f..a2f125df 100644 --- a/services/nuldoc/public/slides/slides/2024-04-13/phpcon-odawara-2024/index.html +++ b/services/nuldoc/public/slides/slides/2024-04-13/phpcon-odawara-2024/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>来る新 JIT エンジンについて知った気になる (PHP カンファレンス小田原 2024)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2024-04-25/phpstudy-tokyo-163/index.html b/services/nuldoc/public/slides/slides/2024-04-25/phpstudy-tokyo-163/index.html index 654db9b4..f1ba2d66 100644 --- a/services/nuldoc/public/slides/slides/2024-04-25/phpstudy-tokyo-163/index.html +++ b/services/nuldoc/public/slides/slides/2024-04-25/phpstudy-tokyo-163/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Tracing JIT の発動条件 (PHP 勉強会@東京 第163回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2024-07-18/phpstudy-tokyo-166/index.html b/services/nuldoc/public/slides/slides/2024-07-18/phpstudy-tokyo-166/index.html index 569f1b97..1532ea37 100644 --- a/services/nuldoc/public/slides/slides/2024-07-18/phpstudy-tokyo-166/index.html +++ b/services/nuldoc/public/slides/slides/2024-07-18/phpstudy-tokyo-166/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2024 で発表した WebAssembly ランタイムのその後 (PHP 勉強会@東京 第166回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2024-10-30/phpstudy-tokyo-169/index.html b/services/nuldoc/public/slides/slides/2024-10-30/phpstudy-tokyo-169/index.html index 4ec2eeab..bff785ec 100644 --- a/services/nuldoc/public/slides/slides/2024-10-30/phpstudy-tokyo-169/index.html +++ b/services/nuldoc/public/slides/slides/2024-10-30/phpstudy-tokyo-169/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP で PHP を作る (縮小版) (PHP 勉強会@東京 第169回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2024-11-30/cohackpp/index.html b/services/nuldoc/public/slides/slides/2024-11-30/cohackpp/index.html index a80a5425..bdf9c0ef 100644 --- a/services/nuldoc/public/slides/slides/2024-11-30/cohackpp/index.html +++ b/services/nuldoc/public/slides/slides/2024-11-30/cohackpp/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>プログラミングマナー講座 (紅白ぺぱ合戦)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2025-02-22/phpcon-nagoya-2025/index.html b/services/nuldoc/public/slides/slides/2025-02-22/phpcon-nagoya-2025/index.html index 4cb8d1b2..b741f78c 100644 --- a/services/nuldoc/public/slides/slides/2025-02-22/phpcon-nagoya-2025/index.html +++ b/services/nuldoc/public/slides/slides/2025-02-22/phpcon-nagoya-2025/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP 処理系の garbage collection を理解する~メモリはいつ解放されるのか~ (PHP カンファレンス名古屋 2025)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2025-03-23/phperkaigi-2025/index.html b/services/nuldoc/public/slides/slides/2025-03-23/phperkaigi-2025/index.html index 91bf1206..3d44230f 100644 --- a/services/nuldoc/public/slides/slides/2025-03-23/phperkaigi-2025/index.html +++ b/services/nuldoc/public/slides/slides/2025-03-23/phperkaigi-2025/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPで作るPHP~セルフホストできる言語処理系を作ろう~ (PHPerKaigi 2025)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2025-04-12/phpcon-odawara-2025/index.html b/services/nuldoc/public/slides/slides/2025-04-12/phpcon-odawara-2025/index.html index ee64611a..e93f60c3 100644 --- a/services/nuldoc/public/slides/slides/2025-04-12/phpcon-odawara-2025/index.html +++ b/services/nuldoc/public/slides/slides/2025-04-12/phpcon-odawara-2025/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHP 8.x 時代のクラス設計(property promotion から property hooks まで) (PHP カンファレンス小田原 2025)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2025-07-26/techramen-25-conf/index.html b/services/nuldoc/public/slides/slides/2025-07-26/techramen-25-conf/index.html index a0c46ae7..4e4c3233 100644 --- a/services/nuldoc/public/slides/slides/2025-07-26/techramen-25-conf/index.html +++ b/services/nuldoc/public/slides/slides/2025-07-26/techramen-25-conf/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>セルフホスト可能なCコンパイラを2000行弱で書く (TechRAMEN 2025 Conference)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2025-10-29/phpstudy-tokyo-180/index.html b/services/nuldoc/public/slides/slides/2025-10-29/phpstudy-tokyo-180/index.html index 20204766..b1f98b9d 100644 --- a/services/nuldoc/public/slides/slides/2025-10-29/phpstudy-tokyo-180/index.html +++ b/services/nuldoc/public/slides/slides/2025-10-29/phpstudy-tokyo-180/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>浮動小数点数の半開区間で単一値を指定する (PHP 勉強会@東京 第180回)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/2025-11-24/phpconkagawa-2025/index.html b/services/nuldoc/public/slides/slides/2025-11-24/phpconkagawa-2025/index.html index 8d5124e8..b61519e2 100644 --- a/services/nuldoc/public/slides/slides/2025-11-24/phpconkagawa-2025/index.html +++ b/services/nuldoc/public/slides/slides/2025-11-24/phpconkagawa-2025/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Pure PHP で作る簡易 HTTP サーバ (PHP カンファレンス香川 2025)|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <link rel="stylesheet" href="/slides.css?h=4934be6a5e853e2cbd6e7aff310d5ec1"> diff --git a/services/nuldoc/public/slides/slides/index.html b/services/nuldoc/public/slides/slides/index.html index 868a8da4..8dfae6c1 100644 --- a/services/nuldoc/public/slides/slides/index.html +++ b/services/nuldoc/public/slides/slides/index.html @@ -15,7 +15,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/slides/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>スライド一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/style.css b/services/nuldoc/public/slides/style.css index eba86a34..4090151a 100644 --- a/services/nuldoc/public/slides/style.css +++ b/services/nuldoc/public/slides/style.css @@ -181,18 +181,18 @@ code { font-size: 0.9rem; } -.shiki code { +.codeblock code { background-color: unset; padding: 0; } /* https://github.com/shikijs/shiki/issues/3 */ -.shiki code { +.codeblock.numbered code { counter-reset: codeblock-line-number; counter-increment: codeblock-line-number 0; } -.numbered .shiki code .line::before { +.codeblock.numbered code .codeblock-line::before { content: counter(codeblock-line-number); counter-increment: codeblock-line-number; width: 2rem; @@ -280,7 +280,7 @@ h1 { .admonition { background-color: #f5f5f5; - border: 1px solid #d1d1d1; + border: 1px solid #ddd; padding: 1rem 1.5rem; margin: 1rem 0; } @@ -335,8 +335,8 @@ img { gap: 1rem; margin: 2rem 0; padding: 1rem 0; - border-top: 1px solid #d1d1d1; - border-bottom: 1px solid #d1d1d1; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; } .pagination-page { @@ -368,7 +368,7 @@ img { color: #fff; } -.pagination-elipsis { +.pagination-ellipsis { color: #999; } diff --git a/services/nuldoc/public/slides/tags/c/index.html b/services/nuldoc/public/slides/tags/c/index.html index 82a90137..43946dd0 100644 --- a/services/nuldoc/public/slides/tags/c/index.html +++ b/services/nuldoc/public/slides/tags/c/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/c/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「C」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/cohackpp/index.html b/services/nuldoc/public/slides/tags/cohackpp/index.html index 05fc6323..b882a93d 100644 --- a/services/nuldoc/public/slides/tags/cohackpp/index.html +++ b/services/nuldoc/public/slides/tags/cohackpp/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/cohackpp/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「紅白ぺぱ合戦」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/conference/index.html b/services/nuldoc/public/slides/tags/conference/index.html index f1785903..40197f63 100644 --- a/services/nuldoc/public/slides/tags/conference/index.html +++ b/services/nuldoc/public/slides/tags/conference/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/conference/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「カンファレンス」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/index.html b/services/nuldoc/public/slides/tags/index.html index 7572f17c..9335a6de 100644 --- a/services/nuldoc/public/slides/tags/index.html +++ b/services/nuldoc/public/slides/tags/index.html @@ -14,7 +14,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/php/index.html b/services/nuldoc/public/slides/tags/php/index.html index 2efade95..a5ab9e5d 100644 --- a/services/nuldoc/public/slides/tags/php/index.html +++ b/services/nuldoc/public/slides/tags/php/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/php/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/phpcon-nagoya/index.html b/services/nuldoc/public/slides/tags/phpcon-nagoya/index.html index 4e869002..8ba14ed3 100644 --- a/services/nuldoc/public/slides/tags/phpcon-nagoya/index.html +++ b/services/nuldoc/public/slides/tags/phpcon-nagoya/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpcon-nagoya/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス名古屋」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/phpcon-odawara/index.html b/services/nuldoc/public/slides/tags/phpcon-odawara/index.html index 0dca6844..a2df445d 100644 --- a/services/nuldoc/public/slides/tags/phpcon-odawara/index.html +++ b/services/nuldoc/public/slides/tags/phpcon-odawara/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpcon-odawara/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス小田原」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/phpconfuk/index.html b/services/nuldoc/public/slides/tags/phpconfuk/index.html index 3a4eea6b..0b286178 100644 --- a/services/nuldoc/public/slides/tags/phpconfuk/index.html +++ b/services/nuldoc/public/slides/tags/phpconfuk/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpconfuk/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス福岡」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/phpconkagawa/index.html b/services/nuldoc/public/slides/tags/phpconkagawa/index.html index e333165b..0c2a87f4 100644 --- a/services/nuldoc/public/slides/tags/phpconkagawa/index.html +++ b/services/nuldoc/public/slides/tags/phpconkagawa/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpconkagawa/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP カンファレンス香川」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/phperkaigi/index.html b/services/nuldoc/public/slides/tags/phperkaigi/index.html index e8801ce8..54306421 100644 --- a/services/nuldoc/public/slides/tags/phperkaigi/index.html +++ b/services/nuldoc/public/slides/tags/phperkaigi/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phperkaigi/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHPerKaigi」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/phpstudy-tokyo/index.html b/services/nuldoc/public/slides/tags/phpstudy-tokyo/index.html index 116640f0..0d102e79 100644 --- a/services/nuldoc/public/slides/tags/phpstudy-tokyo/index.html +++ b/services/nuldoc/public/slides/tags/phpstudy-tokyo/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpstudy-tokyo/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「PHP 勉強会@東京」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/techramen/index.html b/services/nuldoc/public/slides/tags/techramen/index.html index 7e5ef492..157484ca 100644 --- a/services/nuldoc/public/slides/tags/techramen/index.html +++ b/services/nuldoc/public/slides/tags/techramen/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/techramen/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「TechRAMEN」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/wasm/index.html b/services/nuldoc/public/slides/tags/wasm/index.html index cf981042..ebc40225 100644 --- a/services/nuldoc/public/slides/tags/wasm/index.html +++ b/services/nuldoc/public/slides/tags/wasm/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/wasm/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「WebAssembly」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/public/slides/tags/ya8/index.html b/services/nuldoc/public/slides/tags/ya8/index.html index 6b71674a..71fb0bc3 100644 --- a/services/nuldoc/public/slides/tags/ya8/index.html +++ b/services/nuldoc/public/slides/tags/ya8/index.html @@ -16,7 +16,7 @@ <link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/ya8/atom.xml"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>タグ「Ya8」一覧|nsfisis’ slides</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="list"> <header class="header"> diff --git a/services/nuldoc/static/_all/style.css b/services/nuldoc/static/_all/style.css index fff94cac..4090151a 100644 --- a/services/nuldoc/static/_all/style.css +++ b/services/nuldoc/static/_all/style.css @@ -181,18 +181,18 @@ code { font-size: 0.9rem; } -.shiki code { +.codeblock code { background-color: unset; padding: 0; } /* https://github.com/shikijs/shiki/issues/3 */ -.shiki code { +.codeblock.numbered code { counter-reset: codeblock-line-number; counter-increment: codeblock-line-number 0; } -.numbered .shiki code .line::before { +.codeblock.numbered code .codeblock-line::before { content: counter(codeblock-line-number); counter-increment: codeblock-line-number; width: 2rem; |
