aboutsummaryrefslogtreecommitdiffhomepage
path: root/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1
diff options
context:
space:
mode:
Diffstat (limited to 'public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1')
-rw-r--r--public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html70
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>&lt;?php
+ <pre class="highlight" language="php" linenumbering="unnumbered"><code class="highlight"><span class="hljs-meta">&lt;?php</span>
-$π = $argv[1] ?? null;
-if ($π === null) {
-exit(&apos;No input.&apos;);
+$π = <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">&#x27;No input.&#x27;</span>);
}
-$π = trim($π);
-if (!is_numeric($π)) {
-exit(&apos;Invalid input.&apos;);
+$π = <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">&#x27;Invalid input.&#x27;</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(&apos;/(\x23.+?) /&apos;, $s, $m);
-$t = $m[1] ?? &apos;&apos;;
+<span class="hljs-title function_ invoke__">preg_match</span>(<span class="hljs-string">&#x27;/(\x23.+?) /&#x27;</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">&#x27;&#x27;</span>;
-if (md5($t) === &apos;056e831a4146bf123e8ea16613303d2e&apos;) {
-echo &quot;Token: {$t}\n&quot;;
-} else {
-echo &quot;Failed.\n&quot;;
+<span class="hljs-keyword">if</span> (<span class="hljs-title function_ invoke__">md5</span>(<span class="hljs-variable">$t</span>) === <span class="hljs-string">&#x27;056e831a4146bf123e8ea16613303d2e&#x27;</span>) {
+<span class="hljs-keyword">echo</span> <span class="hljs-string">&quot;Token: <span class="hljs-subst">{$t}</span>\n&quot;</span>;
+} <span class="hljs-keyword">else</span> {
+<span class="hljs-keyword">echo</span> <span class="hljs-string">&quot;Failed.\n&quot;</span>;
}</code></pre>
</section>
@@ -107,14 +107,14 @@ echo &quot;Failed.\n&quot;;
ソースを見るとわかるとおり、<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(&apos;No input.&apos;);
+ <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">&#x27;No input.&#x27;</span>);
}
- $π = trim($π);
- if (!is_numeric($π)) {
- exit(&apos;Invalid input.&apos;);
+ $π = <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">&#x27;Invalid input.&#x27;</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>&apos;656667&apos;</code>だったとすると、<code>65</code>、<code>66</code>、<code>67</code>に対応した<code>&apos;A&apos;</code>、<code>&apos;B&apos;</code>、<code>&apos;C&apos;</code>へと変換され、<code>&apos;ABC&apos;</code>になる。
</p>
- <pre class="highlight" language="php" linenumbering="unnumbered"><code>$π = &apos;656667&apos;;
-$s = implode(array_map(chr(...), str_split($π, 2)));
-echo $s;
-// =&gt; ABC</code></pre>
+ <pre class="highlight" language="php" linenumbering="unnumbered"><code class="highlight">$π = <span class="hljs-string">&#x27;656667&#x27;</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">// =&gt; ABC</span></code></pre>
- <pre class="highlight" language="php" linenumbering="unnumbered"><code>preg_match(&apos;/(\x23.+?) /&apos;, $s, $m);
-$t = $m[1] ?? &apos;&apos;;</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">&#x27;/(\x23.+?) /&#x27;</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">&#x27;&#x27;</span>;</code></pre>
<p>
正規表現でマッチングしている。<code>\x23</code>は<code>#</code>と同じであることに留意すると、この正規表現は「<code>#</code>から始まる 2 以上の長さ (含<code>#</code>) の文字列で、最初に現れるスペースまで」にマッチする。つまりこれは、PHPerKaigi におけるトークンである。
@@ -178,10 +178,10 @@ $t = $m[1] ?? &apos;&apos;;</code></pre>
なお、<code>#</code>を直接書いていないのは、<code>/#.+?) /</code>と書くと、<code>#.+?)</code>という意図せぬトークンが登録されてしまうからである。
</p>
- <pre class="highlight" language="php" linenumbering="unnumbered"><code>if (md5($t) === &apos;056e831a4146bf123e8ea16613303d2e&apos;) {
-echo &quot;Token: {$t}\n&quot;;
-} else {
-echo &quot;Failed.\n&quot;;
+ <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">&#x27;056e831a4146bf123e8ea16613303d2e&#x27;</span>) {
+<span class="hljs-keyword">echo</span> <span class="hljs-string">&quot;Token: <span class="hljs-subst">{$t}</span>\n&quot;</span>;
+} <span class="hljs-keyword">else</span> {
+<span class="hljs-keyword">echo</span> <span class="hljs-string">&quot;Failed.\n&quot;</span>;
}</code></pre>
<p>