diff options
Diffstat (limited to 'public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html')
| -rw-r--r-- | public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html | 70 |
1 files changed, 35 insertions, 35 deletions
diff --git a/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html b/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html index d7f71aa..10ef763 100644 --- a/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html +++ b/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html @@ -10,7 +10,7 @@ <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=17cf97a767ec5fb6e64967729f40f30a"> - <link rel="stylesheet" href="/hl.css?h=208c52e3b7c9db1cad782c5d30b4698f"> + <link rel="stylesheet" href="/hl.css?h=340e65ffd5c17713efc9107c06304f7b"> </head> <body class="single"> <header class="header"> @@ -78,26 +78,26 @@ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。 </p> - <pre class="highlight" language="php" linenumbering="unnumbered"><code><?php + <pre class="highlight" language="php" linenumbering="unnumbered"><code class="highlight"><span class="hljs-meta"><?php</span> -$π = $argv[1] ?? null; -if ($π === null) { -exit('No input.'); +$π = <span class="hljs-variable">$argv</span>[<span class="hljs-number">1</span>] ?? <span class="hljs-literal">null</span>; +<span class="hljs-keyword">if</span> ($π === <span class="hljs-literal">null</span>) { +<span class="hljs-keyword">exit</span>(<span class="hljs-string">'No input.'</span>); } -$π = trim($π); -if (!is_numeric($π)) { -exit('Invalid input.'); +$π = <span class="hljs-title function_ invoke__">trim</span>($π); +<span class="hljs-keyword">if</span> (!<span class="hljs-title function_ invoke__">is_numeric</span>($π)) { +<span class="hljs-keyword">exit</span>(<span class="hljs-string">'Invalid input.'</span>); } -$s = implode(array_map(chr(...), str_split($π, 2))); +<span class="hljs-variable">$s</span> = <span class="hljs-title function_ invoke__">implode</span>(<span class="hljs-title function_ invoke__">array_map</span>(<span class="hljs-title function_ invoke__">chr</span>(...), <span class="hljs-title function_ invoke__">str_split</span>($π, <span class="hljs-number">2</span>))); -preg_match('/(\x23.+?) /', $s, $m); -$t = $m[1] ?? ''; +<span class="hljs-title function_ invoke__">preg_match</span>(<span class="hljs-string">'/(\x23.+?) /'</span>, <span class="hljs-variable">$s</span>, <span class="hljs-variable">$m</span>); +<span class="hljs-variable">$t</span> = <span class="hljs-variable">$m</span>[<span class="hljs-number">1</span>] ?? <span class="hljs-string">''</span>; -if (md5($t) === '056e831a4146bf123e8ea16613303d2e') { -echo "Token: {$t}\n"; -} else { -echo "Failed.\n"; +<span class="hljs-keyword">if</span> (<span class="hljs-title function_ invoke__">md5</span>(<span class="hljs-variable">$t</span>) === <span class="hljs-string">'056e831a4146bf123e8ea16613303d2e'</span>) { +<span class="hljs-keyword">echo</span> <span class="hljs-string">"Token: <span class="hljs-subst">{$t}</span>\n"</span>; +} <span class="hljs-keyword">else</span> { +<span class="hljs-keyword">echo</span> <span class="hljs-string">"Failed.\n"</span>; }</code></pre> </section> @@ -107,14 +107,14 @@ echo "Failed.\n"; ソースを見るとわかるとおり、<code>$argv[1]</code>を参照している。それを<code>$π</code>なる変数に代入しているので、円周率を渡してみる。 </p> - <pre class="highlight" language="shell-session" linenumbering="unnumbered"><code>$ php Q.php 3.14 + <pre class="highlight" language="shell-session" linenumbering="unnumbered"><code class="highlight">$ php Q.php 3.14 Failed.</code></pre> <p> 失敗してしまった。精度を上げてみる。 </p> - <pre class="highlight" language="shell-session" linenumbering="unnumbered"><code>$ php Q.php 3.1415 + <pre class="highlight" language="shell-session" linenumbering="unnumbered"><code class="highlight">$ php Q.php 3.1415 Failed.</code></pre> <p> @@ -125,7 +125,7 @@ Failed.</code></pre> 最初にトークンが得られるのは、小数点以下 16 桁目まで入力したときで、こうなる。 </p> - <pre class="highlight" language="shell-session" linenumbering="unnumbered"><code>$ php Q.php 3.1415926535897932 + <pre class="highlight" language="shell-session" linenumbering="unnumbered"><code class="highlight">$ php Q.php 3.1415926535897932 Token: #YO</code></pre> <p> @@ -139,20 +139,20 @@ Token: #YO</code></pre> 短いので頭から追っていく。 </p> - <pre class="highlight" language="php" linenumbering="unnumbered"><code>$π = $argv[1] ?? null; - if ($π === null) { - exit('No input.'); + <pre class="highlight" language="php" linenumbering="unnumbered"><code class="highlight">$π = <span class="hljs-variable">$argv</span>[<span class="hljs-number">1</span>] ?? <span class="hljs-literal">null</span>; + <span class="hljs-keyword">if</span> ($π === <span class="hljs-literal">null</span>) { + <span class="hljs-keyword">exit</span>(<span class="hljs-string">'No input.'</span>); } - $π = trim($π); - if (!is_numeric($π)) { - exit('Invalid input.'); + $π = <span class="hljs-title function_ invoke__">trim</span>($π); + <span class="hljs-keyword">if</span> (!<span class="hljs-title function_ invoke__">is_numeric</span>($π)) { + <span class="hljs-keyword">exit</span>(<span class="hljs-string">'Invalid input.'</span>); }</code></pre> <p> 入力のバリデーション部分。数値のみ受け付ける。 </p> - <pre class="highlight" language="php" linenumbering="unnumbered"><code>$s = implode(array_map(chr(...), str_split($π, 2)));</code></pre> + <pre class="highlight" language="php" linenumbering="unnumbered"><code class="highlight"><span class="hljs-variable">$s</span> = <span class="hljs-title function_ invoke__">implode</span>(<span class="hljs-title function_ invoke__">array_map</span>(<span class="hljs-title function_ invoke__">chr</span>(...), <span class="hljs-title function_ invoke__">str_split</span>($π, <span class="hljs-number">2</span>)));</code></pre> <p> <code>$π</code>を 2 文字ごとに区切り (<code>str_split</code>)、数値を ASCII コードと見做して文字に変換 (<code>chr</code>) して結合 (<code>implode</code>) している。 @@ -162,13 +162,13 @@ Token: #YO</code></pre> 例えば、<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> - <pre class="highlight" language="php" linenumbering="unnumbered"><code>$π = '656667'; -$s = implode(array_map(chr(...), str_split($π, 2))); -echo $s; -// => ABC</code></pre> + <pre class="highlight" language="php" linenumbering="unnumbered"><code class="highlight">$π = <span class="hljs-string">'656667'</span>; +<span class="hljs-variable">$s</span> = <span class="hljs-title function_ invoke__">implode</span>(<span class="hljs-title function_ invoke__">array_map</span>(<span class="hljs-title function_ invoke__">chr</span>(...), <span class="hljs-title function_ invoke__">str_split</span>($π, <span class="hljs-number">2</span>))); +<span class="hljs-keyword">echo</span> <span class="hljs-variable">$s</span>; +<span class="hljs-comment">// => ABC</span></code></pre> - <pre class="highlight" language="php" linenumbering="unnumbered"><code>preg_match('/(\x23.+?) /', $s, $m); -$t = $m[1] ?? '';</code></pre> + <pre class="highlight" language="php" linenumbering="unnumbered"><code class="highlight"><span class="hljs-title function_ invoke__">preg_match</span>(<span class="hljs-string">'/(\x23.+?) /'</span>, <span class="hljs-variable">$s</span>, <span class="hljs-variable">$m</span>); +<span class="hljs-variable">$t</span> = <span class="hljs-variable">$m</span>[<span class="hljs-number">1</span>] ?? <span class="hljs-string">''</span>;</code></pre> <p> 正規表現でマッチングしている。<code>\x23</code>は<code>#</code>と同じであることに留意すると、この正規表現は「<code>#</code>から始まる 2 以上の長さ (含<code>#</code>) の文字列で、最初に現れるスペースまで」にマッチする。つまりこれは、PHPerKaigi におけるトークンである。 @@ -178,10 +178,10 @@ $t = $m[1] ?? '';</code></pre> なお、<code>#</code>を直接書いていないのは、<code>/#.+?) /</code>と書くと、<code>#.+?)</code>という意図せぬトークンが登録されてしまうからである。 </p> - <pre class="highlight" language="php" linenumbering="unnumbered"><code>if (md5($t) === '056e831a4146bf123e8ea16613303d2e') { -echo "Token: {$t}\n"; -} else { -echo "Failed.\n"; + <pre class="highlight" language="php" linenumbering="unnumbered"><code class="highlight"><span class="hljs-keyword">if</span> (<span class="hljs-title function_ invoke__">md5</span>(<span class="hljs-variable">$t</span>) === <span class="hljs-string">'056e831a4146bf123e8ea16613303d2e'</span>) { +<span class="hljs-keyword">echo</span> <span class="hljs-string">"Token: <span class="hljs-subst">{$t}</span>\n"</span>; +} <span class="hljs-keyword">else</span> { +<span class="hljs-keyword">echo</span> <span class="hljs-string">"Failed.\n"</span>; }</code></pre> <p> |
