aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/posts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2023-03-19 04:02:56 +0900
committernsfisis <nsfisis@gmail.com>2023-03-19 04:02:56 +0900
commit572cd70d9fc7baf4d86a633a3ab74c6d058a4de8 (patch)
tree01add3cfd42c164f78931eba0ca9e6b82423a9e7 /content/posts
parentdb3d51ddc421dad68abddb95d01ffdab440197d6 (diff)
downloadblog.nsfisis.dev-572cd70d9fc7baf4d86a633a3ab74c6d058a4de8.tar.gz
blog.nsfisis.dev-572cd70d9fc7baf4d86a633a3ab74c6d058a4de8.tar.zst
blog.nsfisis.dev-572cd70d9fc7baf4d86a633a3ab74c6d058a4de8.zip
fix(content): fix XML notations
Diffstat (limited to 'content/posts')
-rw-r--r--content/posts/2022-05-01/phperkaigi-2022.xml60
-rw-r--r--content/posts/2022-08-27/php-conference-okinawa-code-golf.xml52
-rw-r--r--content/posts/2022-08-31/support-for-communty-is-employee-benefits.xml102
-rw-r--r--content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml127
-rw-r--r--content/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1.xml331
-rw-r--r--content/posts/2022-10-28/setup-server-for-this-site.xml28
6 files changed, 329 insertions, 371 deletions
diff --git a/content/posts/2022-05-01/phperkaigi-2022.xml b/content/posts/2022-05-01/phperkaigi-2022.xml
index 621fcde..a3f11ef 100644
--- a/content/posts/2022-05-01/phperkaigi-2022.xml
+++ b/content/posts/2022-05-01/phperkaigi-2022.xml
@@ -20,11 +20,10 @@
<section xml:id="intro">
<title>はじめに</title>
<simpara>
- 2022-04-09 から 2022-04-11
- にかけて開催された、https://phperkaigi.jp/2022/[PHPerKaigi 2022]
- に、一般参加者として参加した。
- 弊社https://www.dgcircus.com/[デジタルサーカス株式会社]
- はダイヤモンドスポンサーとなっており、スポンサー枠のチケットを使わせていただいた。
+ 2022-04-09 から 2022-04-11 にかけて開催された、<link xl:href="https://phperkaigi.jp/2022/">PHPerKaigi 2022</link> に、
+ 一般参加者として参加した。
+ 弊社<link xl:href="https://www.dgcircus.com/">デジタルサーカス株式会社</link>はダイヤモンドスポンサーとなっており、
+ スポンサー枠のチケットを使わせていただいた。
</simpara>
<simpara>
昨年のレポートは<link xl:href="/posts/2021-03-30/phperkaigi-2021">こちら</link>。
@@ -35,21 +34,18 @@
<section xml:id="comments--great-sessions">
<title>厳選おすすめトーク</title>
<simpara>
- 多くの素晴らしいトークの中から、特におすすめのものを
- 5つ選んだ。是非聞いてほしい。引用部分は、リンク先プロポーザルから引用している。
+ 多くの素晴らしいトークの中から、特におすすめのものを 5つ選んだ。
+ 是非聞いてほしい。引用部分は、リンク先プロポーザルから引用している。
</simpara>
<simpara>
- <link xl:href="https://fortee.jp/phperkaigi-2022/proposal/ef8cf4ed-63fe-42f8-8145-b3e70054458b">予防に勝る防御なし
- - 堅牢なコードを導く様々な設計のヒント</link>
+ <link xl:href="https://fortee.jp/phperkaigi-2022/proposal/ef8cf4ed-63fe-42f8-8145-b3e70054458b">予防に勝る防御なし - 堅牢なコードを導く様々な設計のヒント</link>
</simpara>
<blockquote>
<simpara>
- PHP
- はバージョンを追う毎に型宣言、例外、表明、列挙型などの機能が大幅に強化され、堅牢なコードを書くための機能が充実してきました。それらの機能はどう使うと効果的なのでしょうか。
+ PHP はバージョンを追う毎に型宣言、例外、表明、列挙型などの機能が大幅に強化され、堅牢なコードを書くための機能が充実してきました。それらの機能はどう使うと効果的なのでしょうか。
</simpara>
<simpara>
- 本講演では PHP 8.1
- をベースにして、誤りを想定してチェックするのではなく、そもそも誤りにくい設計とはどのようなものか、つまり「予防」の観点を軸足に、堅牢なコードを導くための様々な設計のヒントをご紹介します。
+ 本講演では PHP 8.1 をベースにして、誤りを想定してチェックするのではなく、そもそも誤りにくい設計とはどのようなものか、つまり「予防」の観点を軸足に、堅牢なコードを導くための様々な設計のヒントをご紹介します。
</simpara>
</blockquote>
<simpara>
@@ -57,8 +53,7 @@
</simpara>
<blockquote>
<simpara>
- PHPを使ってるとよく遭遇する Fatal error / Parse error / Warning / Notice
- 理解していますか?<br/>
+ PHPを使ってるとよく遭遇する Fatal error / Parse error / Warning / Notice 理解していますか?<br/>
これらのエラー文を理解することで、すぐにエラーの原因に気付き適切に対象できる様になります!<br/>
またそれらを理解した上でのエラーハンドリングを学びましょう。
</simpara>
@@ -114,54 +109,48 @@
<section xml:id="comments--token-quizzes">
<title>トークン問題の作成</title>
<simpara>
- 今回は、PHPer チャレンジ用に弊社のトークン問題を
- 3題作成した。こちらについては<link xl:href="/posts/2022-04-09/phperkaigi-2022-tokens">別途記事にしている</link>ので、そちらを参照されたい。
+ 今回は、PHPer チャレンジ用に弊社のトークン問題を 3題作成した。
+ こちらについては<link xl:href="/posts/2022-04-09/phperkaigi-2022-tokens">別途記事にしている</link>ので、そちらを参照されたい。
</simpara>
</section>
<section xml:id="comments--phper-challenge">
<title>PHPer チャレンジ</title>
<simpara>
<link xl:href="https://fortee.jp/phperkaigi-2022/challenge">1位</link>になった。<br/>
- また、賞品として <link xl:href="https://www.amazon.co.jp/dp/B08MQNJC9Z">Echo Show 15</link>
- をいただいた。
+ また、賞品として <link xl:href="https://www.amazon.co.jp/dp/B08MQNJC9Z">Echo Show 15</link> をいただいた。
</simpara>
</section>
<section xml:id="comments--conference">
<title>カンファレンス全体への感想</title>
<simpara>
- <link xl:href="/posts/2021-03-30/phperkaigi-2021">去年の参加レポ</link>
- では、こんなことを書いた。
+ <link xl:href="/posts/2021-03-30/phperkaigi-2021">去年の参加レポ</link> では、こんなことを書いた。
</simpara>
<blockquote>
<simpara>
- 1つ個人的な反省点としては、(中略) Discord
- しかりアンカンファレンスしかり「このイベントのこの瞬間にしかないコンテンツ」に触れずに、後から見返せる発表やスライドに注力してしまった、ということだ。発表の詳細な見直しはあとからできるのだから、今しかできないことを考えるべきだった。<br/>
+ 1つ個人的な反省点としては、(中略) Discord しかりアンカンファレンスしかり「このイベントのこの瞬間にしかないコンテンツ」に触れずに、
+ 後から見返せる発表やスライドに注力してしまった、ということだ。
+ 発表の詳細な見直しはあとからできるのだから、今しかできないことを考えるべきだった。<br/>
まあ初カンファレンスだし、とお茶を濁しておこう。
</simpara>
</blockquote>
<simpara>
- この反省を踏まえ、今年は積極的にほかの場 (公式の Discord
- サーバや、アンカンファレンス) にも参加した。<br/>
- これにより、参加体験の質がはるかに向上した。特に Discord
- に関しては、登壇者ご本人による補足や、質問への回答などがおこなわれる
- (ことが多い)
- ため、特別な理由のない限り、発言はしないまでも参加はしておいたほうが良いと思われる。
+ この反省を踏まえ、今年は積極的にほかの場 (公式の Discord サーバや、アンカンファレンス) にも参加した。<br/>
+ これにより、参加体験の質がはるかに向上した。特に Discord に関しては、登壇者ご本人による補足や、
+ 質問への回答などがおこなわれる (ことが多い) ため、特別な理由のない限り、発言はしないまでも参加はしておいたほうが良いと思われる。
</simpara>
<simpara>
- なお、アンカンファレンスについては、1日目の終わりにhttps://fortee.jp/phperkaigi-2022/unconference/view/d332797a-8921-4706-a7e2-ee72640c9b5e[トークン問題の解説放送]もおこなった。
+ なお、アンカンファレンスについては、1日目の終わりに<link xl:href="https://fortee.jp/phperkaigi-2022/unconference/view/d332797a-8921-4706-a7e2-ee72640c9b5e">トークン問題の解説放送</link>もおこなった。
</simpara>
<simpara>
また、今年はオフラインとオンラインのハイブリッド開催であったが、去年の全オンラインと比べて、オンライン参加の体験が落ちていなかったのは、特筆すべきであろう。
- 今年は
- 3回目のワクチン接種が間に合わなかったこともあり現地参加は見送ったのだが、来年は是非オフラインで参加したい。
+ 今年は 3回目のワクチン接種が間に合わなかったこともあり現地参加は見送ったのだが、来年は是非オフラインで参加したい。
</simpara>
</section>
</section>
<section xml:id="next-year">
<title>そして来年へ……?</title>
<simpara>
- PHPerKaigi 2023 があるかどうか存じ上げないが、あるとすれば、次の
- 4つを目標としたい。
+ PHPerKaigi 2023 があるかどうか存じ上げないが、あるとすれば、次の 4つを目標としたい。
</simpara>
<itemizedlist>
<listitem>プロポーザルを出す</listitem>
@@ -173,8 +162,7 @@
<hr/>
</simpara>
<simpara>
- 最後になりましたが、PHPerKaigi
- のスタッフ、スポンサー、スピーカーのみなさん、素敵な時間をありがとうございました。
+ 最後になりましたが、PHPerKaigi のスタッフ、スポンサー、スピーカーのみなさん、素敵な時間をありがとうございました。
</simpara>
<simpara>
ではまた来年。
diff --git a/content/posts/2022-08-27/php-conference-okinawa-code-golf.xml b/content/posts/2022-08-27/php-conference-okinawa-code-golf.xml
index 581dcb4..a8bf577 100644
--- a/content/posts/2022-08-27/php-conference-okinawa-code-golf.xml
+++ b/content/posts/2022-08-27/php-conference-okinawa-code-golf.xml
@@ -20,18 +20,15 @@
<section xml:id="intro">
<title>はじめに</title>
<simpara>
- 本日 <link xl:href="https://phpcon.okinawa.jp/">PHP カンファレンス沖縄 2022</link>
- が開催された (らしい)。
+ 本日 <link xl:href="https://phpcon.okinawa.jp/">PHP カンファレンス沖縄 2022</link> が開催された (らしい)。
</simpara>
<simpara>
- カンファレンスには参加できなかったものの、懇親会の LT
- で出題されたコードゴルフの問題が Twitter に流れてきたので、解いてみた。
- </simpara>
- <simpara>
- ツイート: <link xl:href="https://twitter.com/m3m0r7/status/1563397620231712772">https://twitter.com/m3m0r7/status/1563397620231712772</link><br/>
- スライド:
- <link xl:href="https://speakerdeck.com/memory1994/php-conference-okinawa-2022-extra?slide=3">https://speakerdeck.com/memory1994/php-conference-okinawa-2022-extra?slide=3</link>
+ カンファレンスには参加できなかったものの、懇親会の LT で出題されたコードゴルフの問題が Twitter に流れてきたので、解いてみた。
</simpara>
+ <itemizedlist>
+ <listitem>ツイート: <link xl:href="https://twitter.com/m3m0r7/status/1563397620231712772">https://twitter.com/m3m0r7/status/1563397620231712772</link></listitem>
+ <listitem>スライド: <link xl:href="https://speakerdeck.com/memory1994/php-conference-okinawa-2022-extra?slide=3">https://speakerdeck.com/memory1994/php-conference-okinawa-2022-extra?slide=3</link></listitem>
+ </itemizedlist>
</section>
<section xml:id="solution">
<title>解</title>
@@ -79,52 +76,47 @@
<section xml:id="techniques--exponential-notation">
<title>指数表記</title>
<simpara>
- 割と多くの言語のゴルフで使えるテクニック。<literal>e</literal>
- を用いた指数表記で、大きな数を短く表す。このコードでは
- <literal>10000</literal>、<literal>5000</literal>、<literal>2000</literal>、<literal>1000</literal> を指数表記している。
+ 割と多くの言語のゴルフで使えるテクニック。
+ <literal>e</literal> を用いた指数表記で、大きな数を短く表す。
+ このコードでは <literal>10000</literal>、<literal>5000</literal>、<literal>2000</literal>、<literal>1000</literal> を指数表記している。
</simpara>
</section>
<section xml:id="techniques--shorten-loop">
<title>foreach や for の中身を1つの文に</title>
<simpara>
- <literal>foreach</literal>、<literal>for</literal>、<literal>if</literal> などの後ろには、通常 <literal>{</literal>
- を続けて複数の文を連ねるが、中身の文を1つにしてしまえば、<literal>{</literal> と <literal>}</literal>
- を省略できる。C言語などでも使える。
+ <literal>foreach</literal>、<literal>for</literal>、<literal>if</literal> などの後ろには、
+ 通常 <literal>{</literal> を続けて複数の文を連ねるが、中身の文を1つにしてしまえば、<literal>{</literal> と <literal>}</literal> を省略できる。
+ C言語などでも使える。
</simpara>
</section>
<section xml:id="techniques--omit-initialization">
<title>$r に初期値を入れない</title>
<simpara>
- PHP では、<literal>$r[] = &#8230;&#8203;</literal>
- のような配列の末尾に追加する式を実行したとき、<literal>$r</literal> が未定義だった場合は
- <literal>$r</literal>
- を勝手に定義して空の配列で初期化してくれる。これを利用すると、<literal>$r = [];</literal>
- のような初期化が不要になる。
+ PHP では、<literal>$r[] = ......</literal> のような配列の末尾に追加する式を実行したとき、
+ <literal>$r</literal> が未定義だった場合は <literal>$r</literal> を勝手に定義して空の配列で初期化してくれる。
+ これを利用すると、<literal>$r = [];</literal> のような初期化が不要になる。
</simpara>
<simpara>
- ただし、プログラムに 0 が渡されるとループを一度も回らないので、<literal>$r</literal>
- が未定義になってしまい、<literal>implode()</literal>
- に渡すところでエラーになる。それを防ぐために <literal>$r ?? []</literal> を使っている。
+ ただし、プログラムに 0 が渡されるとループを一度も回らないので、<literal>$r</literal> が未定義になってしまい、
+ <literal>implode()</literal> に渡すところでエラーになる。
+ それを防ぐために <literal>$r ?? []</literal> を使っている。
</simpara>
<simpara>
- もし 0 が渡されたケースを無視するなら、これが不要になるので 4
- バイト縮む。
+ もし 0 が渡されたケースを無視するなら、これが不要になるので 4 バイト縮む。
</simpara>
</section>
<section xml:id="techniques--put-text-outside-php-tag">
<title>PHP タグの外に文字列を置く</title>
<simpara>
- PHP では、<literal>&lt;?php</literal> <literal>?&gt;</literal>
- で囲われた部分の外側にある文字列は、そのまま出力される。今回のケースでは、先頭と末尾に必ず
- <literal>[</literal> と <literal>]</literal> を出力するので、そのまま書いてやればよい。
+ PHP では、<literal>&lt;?php</literal> <literal>?&gt;</literal> で囲われた部分の外側にある文字列は、そのまま出力される。
+ 今回のケースでは、先頭と末尾に必ず <literal>[</literal> と <literal>]</literal> を出力するので、そのまま書いてやればよい。
</simpara>
</section>
</section>
<section xml:id="outro">
<title>おわりに</title>
<simpara>
- 最後になりましたが、https://twitter.com/m3m0r7[めもりー]
- さん、楽しい問題をありがとうございました。
+ 最後になりましたが、<link xl:href="https://twitter.com/m3m0r7">めもりー</link>さん、楽しい問題をありがとうございました。
</simpara>
</section>
</article>
diff --git a/content/posts/2022-08-31/support-for-communty-is-employee-benefits.xml b/content/posts/2022-08-31/support-for-communty-is-employee-benefits.xml
index 02fbe93..19f30fc 100644
--- a/content/posts/2022-08-31/support-for-communty-is-employee-benefits.xml
+++ b/content/posts/2022-08-31/support-for-communty-is-employee-benefits.xml
@@ -3,7 +3,8 @@
<info>
<title>弊社の PHP Foundation への寄付に寄せて</title>
<abstract>
- 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。
+ 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。
+ 本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。
</abstract>
<revhistory>
<revision>
@@ -15,58 +16,57 @@
<section xml:id="intro">
<title>はじめに</title>
<simpara>
- <emphasis role="strong">注:
- これは私個人の意見であり、所属する組織を代表するものではありません。</emphasis>
- </simpara>
- <simpara>
- 先日、私の勤める <link xl:href="https://www.dgcircus.com/">デジタルサーカス株式会社</link> が
- <link xl:href="https://opencollective.com/phpfoundation">PHP Foundation</link> へ $2,000
- の寄付をおこないました。
- </simpara>
- <simpara>
- 記事: <link xl:href="https://www.dgcircus.com/news/581">https://www.dgcircus.com/news/581</link>
- </simpara>
- <simpara>
- 本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。
- </simpara>
-</section>
-<section xml:id="why">
- <title>なぜ?</title>
- <simpara>
- 組織としての寄付理由は前掲した記事に譲るとして、ここでは、私が社内でこの件を推進した理由について書くことにします。
- </simpara>
- <simpara>
- 当時の考えを端的にまとめた社内チャットの投稿があったので、それを引用します:
- </simpara>
- <blockquote>
+ <emphasis role="strong">注: これは私個人の意見であり、所属する組織を代表するものではありません。</emphasis>
+ </simpara>
+ <simpara>
+ 先日、私の勤める <link xl:href="https://www.dgcircus.com/">デジタルサーカス株式会社</link> が
+ <link xl:href="https://opencollective.com/phpfoundation">PHP Foundation</link> へ $2,000 の寄付をおこないました。
+ </simpara>
+ <simpara>
+ 記事: <link xl:href="https://www.dgcircus.com/news/581">https://www.dgcircus.com/news/581</link>
+ </simpara>
+ <simpara>
+ 本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。
+ </simpara>
+ </section>
+ <section xml:id="why">
+ <title>なぜ?</title>
+ <simpara>
+ 組織としての寄付理由は前掲した記事に譲るとして、ここでは、私が社内でこの件を推進した理由について書くことにします。
+ </simpara>
+ <simpara>
+ 当時の考えを端的にまとめた社内チャットの投稿があったので、それを引用します:
+ </simpara>
+ <blockquote>
+ <simpara>
+ 結局これを通したい (私の中での) 最大の理由が、「自分の勤める会社が、これをやる会社であってほしい」というのがあり、
+ ↑にしても、感情ベースの理由しか出せていないというのが説得力に欠けている理由なのだと思いますが、
+ 寄付の報告が流れてきたり、OSS のフリーライドの話が流れてきたりするたびに、自尊心が毀損される、というか
+ (これは大袈裟すぎる表現で、実際にはそこまで明確に傷ついているわけではありませんが)。
+ </simpara>
+ <simpara>
+ 追記: 「肩身が狭くなる」というのがより適切でした。
+ </simpara>
+ </blockquote>
+ <simpara>
+ ※文中の「↑にしても」は、ここに載せていない別の投稿を指しています。
+ </simpara>
+ <simpara>
+ OSS を金銭的に支援したり、技術カンファレンスへ協賛したり
+ (あるいは <link xl:href="https://twitter.com/tomzoh">CTO</link> がカンファレンスを年2で主催したり:
+ <link xl:href="https://iosdc.jp">iOSDC</link> <link xl:href="https://phperkaigi.jp">PHPerKaigi</link>)
+ といった行為は、コミュニティへの貢献であると同時に、社員に対する精神的福利厚生でもあると言えるでしょう (知らんけど)。
+ これらは、技術や技術者を大切にする組織である、ということの、対外的にも対内的にも強力なメッセージなのです。
+ </simpara>
<simpara>
- 結局これを通したい (私の中での)
- 最大の理由が、「自分の勤める会社が、これをやる会社であってほしい」というのがあり、↑にしても、感情ベースの理由しか出せていないというのが説得力に欠けている理由なのだと思いますが、寄付の報告が流れてきたり、OSS
- のフリーライドの話が流れてきたりするたびに、自尊心が毀損される、というか
- (これは大袈裟すぎる表現で、実際にはそこまで明確に傷ついているわけではありませんが)。
+ 以上が、私が社内で寄付の件を進めた (かなり私的な) 理由です。
</simpara>
+ </section>
+ <section xml:id="outro">
+ <title>おわりに</title>
<simpara>
- 追記: 「肩身が狭くなる」というのがより適切でした。
+ 最終的に社としての寄付まで漕ぎ着けられたのは、もちろん私の力ではなく役員の方々の決定によるものです。
+ この場を借りて感謝申し上げます。
</simpara>
- </blockquote>
- <simpara>
- ※文中の「↑にしても」は、ここに載せていない別の投稿を指しています。
- </simpara>
- <simpara>
- OSS を金銭的に支援したり、技術カンファレンスへ協賛したり (あるいは
- <link xl:href="https://twitter.com/tomzoh">CTO</link> がカンファレンスを年2で主催したり:
- <link xl:href="https://iosdc.jp">iOSDC</link> <link xl:href="https://phperkaigi.jp">PHPerKaigi</link>)
- といった行為は、コミュニティへの貢献であると同時に、社員に対する精神的福利厚生でもあると言えるでしょう
- (知らんけど)。これらは、技術や技術者を大切にする組織である、ということの、対外的にも対内的にも強力なメッセージなのです。
- </simpara>
- <simpara>
- 以上が、私が社内で寄付の件を進めた (かなり私的な) 理由です。
- </simpara>
-</section>
-<section xml:id="outro">
- <title>おわりに</title>
- <simpara>
- 最終的に社としての寄付まで漕ぎ着けられたのは、もちろん私の力ではなく役員の方々の決定によるものです。この場を借りて感謝申し上げます。
- </simpara>
-</section>
+ </section>
</article>
diff --git a/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml b/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml
index d828554..59ca8be 100644
--- a/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml
+++ b/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml
@@ -22,8 +22,8 @@
<section xml:id="intro">
<title>記事の構成について</title>
<simpara>
- この記事は、普通の fizzbuzz
- を徐々に変形して最終形にしていく、という構成で書かれている。最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、
+ この記事は、普通の fizzbuzz を徐々に変形して最終形にしていく、という構成で書かれている。
+ 最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、
<link xl:href="https://gist.github.com/nsfisis/04c227d5a419867472a0b23a83ad2919#file-fizzbuzz-php-2-letters-per-line-and-supports-php-8-x-without-warnings">このページ</link>
にソースコードがあるので、そちらを先に見てほしい。
</simpara>
@@ -38,8 +38,7 @@
1行あたりの文字数は2文字までに収めること (ただし <literal>&lt;?php</literal> タグは除く)
<itemizedlist>
<listitem>
- 厳密な定義: <literal>&lt;?php</literal> タグ以降のソースコードが、2 byte ごとに
- ラインフィード (LF) で区切られること
+ 厳密な定義: <literal>&lt;?php</literal> タグ以降のソースコードが、2 byte ごとにラインフィード (LF) で区切られること
</listitem>
</itemizedlist>
</listitem>
@@ -55,11 +54,10 @@
<listitem>標準的なインストール構成の PHP で実現できること (デフォルトで有効になっていない拡張等を使わないこと)</listitem>
</itemizedlist>
<simpara>
- 備考: PHP には <literal>short_open_tag</literal>
- というオプションがあり、これを有効にするとファイル冒頭の <literal>&lt;?php</literal>
- の代わりに <literal>&lt;?</literal>
- を使うことができ、文字どおり1行2文字で書ける。ただ、このオプションはデフォルト
- off になっている環境が多いようなので、今回は使わないことにした。
+ 備考: PHP には <literal>short_open_tag</literal> というオプションがあり、
+ これを有効にするとファイル冒頭の <literal>&lt;?php</literal> の代わりに <literal>&lt;?</literal>
+ を使うことができ、文字どおり1行2文字で書ける。
+ ただ、このオプションはデフォルト off になっている環境が多いようなので、今回は使わないことにした。
</simpara>
</section>
<section xml:id="problems">
@@ -152,15 +150,14 @@
バックスラッシュを使った行継続がトークンを区切らない、というのがポイントだ。
</simpara>
<simpara>
- さて、PHP
- ではそもそもバックスラッシュを行継続に使うことができない。これにより、「3文字以上からなるトークンが一切使えない」という制約が課される。例えば、<literal>echo</literal>
- で出力することや、<literal>for</literal> でループすること、<literal>new</literal>
- でインスタンスを生成することができない。特に、出力は fizzbuzz
- をどんなアルゴリズムで実装しようとおこなわなければならないので、できないのは致命的である。
+ さて、PHP ではそもそもバックスラッシュを行継続に使うことができない。
+ これにより、「3文字以上からなるトークンが一切使えない」という制約が課される。
+ 例えば、<literal>echo</literal> で出力することや、<literal>for</literal> でループすること、
+ <literal>new</literal> でインスタンスを生成することができない。
+ 特に、出力は fizzbuzz をどんなアルゴリズムで実装しようとおこなわなければならないので、できないのは致命的である。
</simpara>
<simpara>
- 当然、名前が3文字以上ある関数も使えない。なお、標準 PHP
- の範囲内において、名前が 2文字以下の関数は以下のとおりである:
+ 当然、名前が3文字以上ある関数も使えない。なお、標準 PHP の範囲内において、名前が 2文字以下の関数は以下のとおりである:
</simpara>
<itemizedlist>
<listitem>
@@ -177,8 +174,7 @@
(環境によって多少は変わるかも)
</simpara>
<simpara>
- 2文字の関数を定義しまくった拡張モジュールを用意しておいて <literal>dl()</literal>
- で読み込む行為は、レギュレーションで定めた
+ 2文字の関数を定義しまくった拡張モジュールを用意しておいて <literal>dl()</literal> で読み込む行為は、レギュレーションで定めた
</simpara>
<blockquote>
<itemizedlist>
@@ -186,13 +182,11 @@
</itemizedlist>
</blockquote>
<simpara>
- に反する
- (というより、「それだとおもしろくもなんともないので、このルールを足した」というのが正しい)。
+ に反する (というより、「それだとおもしろくもなんともないので、このルールを足した」というのが正しい)。
</simpara>
<simpara>
- また、2文字だと文字列がまともに書けないのも辛い。<literal>''</literal> だけで
- 2文字使うので、「1文字の文字列リテラル」というものを書くことができない。PHP
- では文字列リテラル中に生の改行が書けるので
+ また、2文字だと文字列がまともに書けないのも辛い。<literal>''</literal> だけで2文字使うので、
+ 「1文字の文字列リテラル」というものを書くことができない。PHP では文字列リテラル中に生の改行が書けるので
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -226,16 +220,14 @@
]]>
</programlisting>
<simpara>
- 素直に書いた fizzbuzz
- とは言い難いが、このくらいは普通だということにしておかないと、この先がやっていられないので許してほしい。
+ 素直に書いた fizzbuzz とは言い難いが、このくらいは普通だということにしておかないと、この先がやっていられないので許してほしい。
</simpara>
</section>
<section xml:id="commentary--remove-keywords">
<title><literal>for</literal> の排除</title>
<simpara>
- <literal>for</literal>
- は、3文字もある長いキーワードである。こんなものは使えない。<literal>array_</literal>
- 系の関数を使って、適当に置き換えるとしよう。
+ <literal>for</literal> は、3文字もある長いキーワードである。
+ こんなものは使えない。<literal>array_</literal> 系の関数を使って、適当に置き換えるとしよう。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -250,18 +242,16 @@
]]>
</programlisting>
<simpara>
- <literal>array_walk</literal> や <literal>range</literal>、<literal>printf</literal> といった <literal>for</literal>
- よりも長いトークンが現れてしまったが、これは次節で直すことにする。なお、<literal>echo</literal>
- は文 (statement) であり式 (expression) ではないので、式である <literal>printf</literal>
- に置き換えた。
+ <literal>array_walk</literal> や <literal>range</literal>、<literal>printf</literal> といった
+ <literal>for</literal> よりも長いトークンが現れてしまったが、これは次節で直すことにする。
+ なお、<literal>echo</literal> は文 (statement) であり式 (expression) ではないので、式である <literal>printf</literal> に置き換えた。
</simpara>
</section>
<section xml:id="commentary--shorten-function-invocation">
<title>関数呼び出しの短縮</title>
<simpara>
- <literal>range</literal>、<literal>array_walk</literal>、<literal>printf</literal>
- は長すぎるのでどうにかせねばならない。ここで、PHP
- の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。
+ <literal>range</literal>、<literal>array_walk</literal>、<literal>printf</literal> は長すぎるのでどうにかせねばならない。
+ ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -280,9 +270,10 @@
]]>
</programlisting>
<simpara>
- これで関数を呼び出している所は短くなった。では、<literal>$r</literal> や <literal>$w</literal> や
- <literal>$p</literal>、また <literal>'Fizz'</literal> や <literal>'Buzz'</literal> はどうやって
- 1行2文字に収めるのか。次のテクニックへ移ろう。
+ これで関数を呼び出している所は短くなった。
+ では、<literal>$r</literal> や <literal>$w</literal> や <literal>$p</literal>、
+ また <literal>'Fizz'</literal> や <literal>'Buzz'</literal> はどうやって 1 行 2 文字に収めるのか。
+ 次のテクニックへ移ろう。
</simpara>
</section>
<section xml:id="commentary--incompatible-solution">
@@ -296,9 +287,8 @@
</itemizedlist>
</blockquote>
<simpara>
- というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という
- PHP 7.x までの仕様が利用できる。例えば、 <literal>Fizz</literal>
- という文字列が欲しければ、次のようにする。
+ というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という PHP 7.x までの仕様が利用できる。
+ 例えば、 <literal>Fizz</literal> という文字列が欲しければ、次のようにする。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -311,8 +301,8 @@
]]>
</programlisting>
<simpara>
- こうして簡単に文字列を作れる。なお、この仕様は 7.x
- 時点でも警告を受けるので、<literal>@</literal> 演算子を使って抑制してやるとよい。
+ こうして簡単に文字列を作れる。
+ なお、この仕様は 7.x 時点でも警告を受けるので、<literal>@</literal> 演算子を使って抑制してやるとよい。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -328,8 +318,7 @@
]]>
</programlisting>
<simpara>
- むしろ、このことがわかっていたからこそ PHP 8.x
- での動作を要件に課したところがある。
+ むしろ、このことがわかっていたからこそ PHP 8.x での動作を要件に課したところがある。
</simpara>
</section>
<section xml:id="commentary--shorten-string-literals">
@@ -338,9 +327,9 @@
実際に使った手法の説明に移る。
</simpara>
<simpara>
- ずばり、文字列同士のビット演算を使う。PHP では、文字列同士でビット演算
- (<literal>&amp;</literal>、<literal>|</literal>、<literal>^</literal>)
- をした場合、文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。
+ ずばり、文字列同士のビット演算を使う。
+ PHP では、文字列同士でビット演算 (<literal>&amp;</literal>、<literal>|</literal>、<literal>^</literal>) をした場合、
+ 文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -369,9 +358,9 @@
]]>
</programlisting>
<simpara>
- 実行すると、<literal>range</literal> が表示される。さて、PHP
- では文字列リテラル中に生の改行を直接書いてもよいのだった
- (「主な障害」の節を参照のこと)。書きかえてみよう。
+ 実行すると、<literal>range</literal> が表示される。
+ さて、PHP では文字列リテラル中に生の改行を直接書いてもよいのだった (「主な障害」の節を参照のこと)。
+ 書きかえてみよう。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -415,12 +404,12 @@
]]>
</programlisting>
<simpara>
- 1行あたり2文字で、<literal>range</literal>
- という文字列を生成することに成功した。他の必要な文字列にも、同様の処理をほどこす。
+ 1行あたり2文字で、<literal>range</literal> という文字列を生成することに成功した。
+ 他の必要な文字列にも、同様の処理をほどこす。
</simpara>
<simpara>
- 備考: <literal>Buzz</literal> 中にある小文字の <literal>u</literal> は、このロジックだと non-printable
- な文字になってしまう。ここまでのテクニックを駆使すれば回避するのはそう難しくないので、考えてみてほしい。
+ 備考: <literal>Buzz</literal> 中にある小文字の <literal>u</literal> は、このロジックだと non-printable な文字になってしまう。
+ ここまでのテクニックを駆使すれば回避するのはそう難しくないので、考えてみてほしい。
</simpara>
</section>
</section>
@@ -586,9 +575,8 @@
<section xml:id="outro">
<title>感想など</title>
<simpara>
- PHP は、スクリプト言語の中だとシンタックスシュガーが少ない
- (体感)。この挑戦は不可能に思われたが、PHP
- マニュアルとにらめっこしていたらなんとかなった。
+ PHP は、スクリプト言語の中だとシンタックスシュガーが少ない (体感)。
+ この挑戦は不可能に思われたが、PHP マニュアルとにらめっこしていたらなんとかなった。
</simpara>
<simpara>
みんなもプログラムを細長くしよう。
@@ -597,11 +585,10 @@
<section xml:id="alternative-solution">
<title>余談2: 別解</title>
<simpara>
- PHP では、バッククォートを使ってシェルを呼び出せる。これは <literal>shell_exec</literal>
- 関数と等価である。さて、PHP
- ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える
- (当然だが、呼び出されるシェルに依存する。Bash
- なら大丈夫だろう。知らんけど)。
+ PHP では、バッククォートを使ってシェルを呼び出せる。
+ これは <literal>shell_exec</literal> 関数と等価である。
+ さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える
+ (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -620,8 +607,8 @@
]]>
</programlisting>
<simpara>
- なお、ここでは簡単のため出力に <literal>printf</literal> をそのまま使っているが、実際には
- <literal>printf</literal> という文字列を合成して可変関数で呼び出す。
+ なお、ここでは簡単のため出力に <literal>printf</literal> をそのまま使っているが、
+ 実際には <literal>printf</literal> という文字列を合成して可変関数で呼び出す。
</simpara>
<simpara>
ただし、これでは
@@ -681,8 +668,8 @@
]]>
</literallayout>
<simpara>
- は変数で、中にはスペースとエスケープが入っている
- (<literal>chr(32) . chr(92)</literal>)。シェルに渡されている文字列は次のようになる。
+ は変数で、中にはスペースとエスケープが入っている (<literal>chr(32) . chr(92)</literal>)。
+ シェルに渡されている文字列は次のようになる。
</simpara>
<literallayout class="monospaced">
<![CDATA[
@@ -697,9 +684,9 @@
]]>
</literallayout>
<simpara>
- これは、前掲したコマンドと同じだ。かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。Fizzbuzz
- のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう
- (試してないけど)。
+ これは、前掲したコマンドと同じだ。
+ かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。
+ Fizzbuzz のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう (試してないけど)。
</simpara>
<simpara>
ということでこれは別解ということにしておく。
diff --git a/content/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1.xml b/content/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1.xml
index f53d339..7bfbbd7 100644
--- a/content/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1.xml
+++ b/content/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1.xml
@@ -19,177 +19,170 @@
<section xml:id="intro">
<title>はじめに</title>
<simpara>
- 2023 年 3 月 23 日から 25 日にかけて開催予定 (記事執筆時点)
- の、 <link xl:href="https://phperkaigi.jp/2023/">PHPerKaigi 2023</link>
- において、昨年と同様に、弊社 <link xl:href="https://www.dgcircus.com/">デジタルサーカス株式会社</link>
- から、トークン問題を出題予定である。
- </simpara>
- <simpara>
- 昨年のトークン問題の記事はこちら:
- <link xl:href="/posts/2022-04-09/phperkaigi-2022-tokens">PHPerKaigi 2022
- トークン問題の解説</link>
- </simpara>
- <simpara>
- すでに 2023
- 年用の問題は作成済みであるが、その制作過程の中でいくつかボツ問ができた。せっかくなので、PHPerKaigi
- 開催を待つ間に紹介しようと思う。
- </simpara>
- <simpara>
- 10 月から 2 月まで、毎月 1 記事ずつ公開していく予定 (忘れていなければ)。
- </simpara>
-</section>
-<section xml:id="quiz">
- <title>問題</title>
- <simpara>
- 注意: これはボツ問なので、得られたトークンを PHPerKaigi
- で入力してもポイントにはならない。
- </simpara>
- <programlisting language="php" linenumbering="unnumbered">
- <![CDATA[
- <?php
+ 2023 年 3 月 23 日から 25 日にかけて開催予定 (記事執筆時点) の、
+ <link xl:href="https://phperkaigi.jp/2023/">PHPerKaigi 2023</link> において、
+ 昨年と同様に、弊社 <link xl:href="https://www.dgcircus.com/">デジタルサーカス株式会社</link> から、
+ トークン問題を出題予定である。
+ </simpara>
+ <simpara>
+ 昨年のトークン問題の記事はこちら: <link xl:href="/posts/2022-04-09/phperkaigi-2022-tokens">PHPerKaigi 2022 トークン問題の解説</link>
+ </simpara>
+ <simpara>
+ すでに 2023 年用の問題は作成済みであるが、その制作過程の中でいくつかボツ問ができた。
+ せっかくなので、PHPerKaigi 開催を待つ間に紹介しようと思う。
+ </simpara>
+ <simpara>
+ 10 月から 2 月まで、毎月 1 記事ずつ公開していく予定 (忘れていなければ)。
+ </simpara>
+ </section>
+ <section xml:id="quiz">
+ <title>問題</title>
+ <simpara>
+ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。
+ </simpara>
+ <programlisting language="php" linenumbering="unnumbered">
+ <![CDATA[
+ <?php
- $π = $argv[1] ?? null;
- if ($π === null) {
- exit('No input.');
- }
- $π = trim($π);
- if (!is_numeric($π)) {
- exit('Invalid input.');
- }
+ $π = $argv[1] ?? null;
+ if ($π === null) {
+ exit('No input.');
+ }
+ $π = trim($π);
+ if (!is_numeric($π)) {
+ exit('Invalid input.');
+ }
- $s = implode(array_map(chr(...), str_split($π, 2)));
+ $s = implode(array_map(chr(...), str_split($π, 2)));
- preg_match('/(\x23.+?) /', $s, $m);
- $t = $m[1] ?? '';
+ preg_match('/(\x23.+?) /', $s, $m);
+ $t = $m[1] ?? '';
- if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
- echo "Token: {$t}\n";
- } else {
- echo "Failed.\n";
- }
- ]]>
- </programlisting>
-</section>
-<section xml:id="how-to-obtain-token">
- <title>トークン入手方法</title>
- <simpara>
- ソースを見るとわかるとおり、<literal>$argv[1]</literal> を参照している。それを <literal>$π</literal>
- なる変数に代入しているので、円周率を渡してみる。
- </simpara>
- <programlisting language="shell-session" linenumbering="unnumbered">
- <![CDATA[
- $ php Q.php 3.14
- Failed.
- ]]>
- </programlisting>
- <simpara>
- 失敗してしまった。精度を上げてみる。
- </simpara>
- <programlisting language="shell-session" linenumbering="unnumbered">
- <![CDATA[
- $ php Q.php 3.1415
- Failed.
- ]]>
- </programlisting>
- <simpara>
- だめだった。これを成功するまで繰り返す。
- </simpara>
- <simpara>
- 最初にトークンが得られるのは、小数点以下 16
- 桁目まで入力したときで、こうなる。
- </simpara>
- <programlisting language="shell-session" linenumbering="unnumbered">
- <![CDATA[
- $ php Q.php 3.1415926535897932
- Token: #YO
- ]]>
- </programlisting>
- <simpara>
- めでたくトークン「<literal>#YO</literal>」が手に入った。
- </simpara>
-</section>
-<section xml:id="commentary">
- <title>解説</title>
- <simpara>
- 短いので頭から追っていく。
- </simpara>
- <programlisting language="php" linenumbering="unnumbered">
- <![CDATA[
- $π = $argv[1] ?? null;
- if ($π === null) {
- exit('No input.');
- }
- $π = trim($π);
- if (!is_numeric($π)) {
- exit('Invalid input.');
- }
- ]]>
- </programlisting>
- <simpara>
- 入力のバリデーション部分。数値のみ受け付ける。
- </simpara>
- <programlisting language="php" linenumbering="unnumbered">
- <![CDATA[
- $s = implode(array_map(chr(...), str_split($π, 2)));
- ]]>
- </programlisting>
- <simpara>
- <literal>$π</literal> を 2 文字ごとに区切り (<literal>str_split</literal>)、数値を ASCII
- コードと見做して文字に変換 (<literal>chr</literal>) して結合 (<literal>implode</literal>) している。
- </simpara>
- <simpara>
- 例えば、<literal>$π</literal> が <literal>'656667'</literal> だったとすると、<literal>65</literal>、<literal>66</literal>、<literal>67</literal> に対応した
- <literal>'A'</literal>、<literal>'B'</literal>、<literal>'C'</literal> へと変換され、<literal>'ABC'</literal> になる。
- </simpara>
- <programlisting language="php" linenumbering="unnumbered">
- <![CDATA[
- $π = '656667';
- $s = implode(array_map(chr(...), str_split($π, 2)));
- echo $s;
- // => ABC
- ]]>
- </programlisting>
- <programlisting language="php" linenumbering="unnumbered">
- <![CDATA[
- preg_match('/(\x23.+?) /', $s, $m);
- $t = $m[1] ?? '';
- ]]>
- </programlisting>
- <simpara>
- 正規表現でマッチングしている。<literal>\x23</literal> は <literal>#</literal>
- と同じであることに留意すると、この正規表現は「<literal>#</literal> から始まる 2
- 以上の長さ (含 <literal>#</literal>)
- の文字列で、最初に現れるスペースまで」にマッチする。つまりこれは、PHPerKaigi
- におけるトークンである。
- </simpara>
- <simpara>
- なお、<literal>#</literal> を直接書いていないのは、<literal>/#.+?) /</literal> と書くと、<literal>#.+?)</literal>
- という意図せぬトークンが登録されてしまうからである。
- </simpara>
- <programlisting language="php" linenumbering="unnumbered">
- <![CDATA[
- if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
- echo "Token: {$t}\n";
- } else {
- echo "Failed.\n";
- }
- ]]>
- </programlisting>
- <simpara>
- 最後にトークンのハッシュ値を見て、想定解かどうかを確認する。
- </simpara>
-</section>
-<section xml:id="outro">
- <title>おわりに</title>
- <simpara>
- 円周率を何桁も計算して ASCII
- コード経由で文字列化すれば、トークンっぽいものがどこかで出てくるのではないか、と考えて生まれた作品。
- </simpara>
- <simpara>
- 最初は真面目に円周率の計算プログラムを組んでいたのだが、いざ動かしてみるとやけに浅いところにあったので驚いた
- (ちなみに、それでも <literal>M_PI</literal> や <literal>pi()</literal>
- では精度が足りない)。見つけたときは狂喜したものの、冷静になってみると大して面白くなかったのでボツになった。むしろ、100
- 万桁目くらいに埋まっていてくれたほうがよかったかもしれない。
- </simpara>
-</section>
+ if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
+ echo "Token: {$t}\n";
+ } else {
+ echo "Failed.\n";
+ }
+ ]]>
+ </programlisting>
+ </section>
+ <section xml:id="how-to-obtain-token">
+ <title>トークン入手方法</title>
+ <simpara>
+ ソースを見るとわかるとおり、<literal>$argv[1]</literal> を参照している。
+ それを <literal>$π</literal> なる変数に代入しているので、円周率を渡してみる。
+ </simpara>
+ <programlisting language="shell-session" linenumbering="unnumbered">
+ <![CDATA[
+ $ php Q.php 3.14
+ Failed.
+ ]]>
+ </programlisting>
+ <simpara>
+ 失敗してしまった。精度を上げてみる。
+ </simpara>
+ <programlisting language="shell-session" linenumbering="unnumbered">
+ <![CDATA[
+ $ php Q.php 3.1415
+ Failed.
+ ]]>
+ </programlisting>
+ <simpara>
+ だめだった。これを成功するまで繰り返す。
+ </simpara>
+ <simpara>
+ 最初にトークンが得られるのは、小数点以下 16 桁目まで入力したときで、こうなる。
+ </simpara>
+ <programlisting language="shell-session" linenumbering="unnumbered">
+ <![CDATA[
+ $ php Q.php 3.1415926535897932
+ Token: #YO
+ ]]>
+ </programlisting>
+ <simpara>
+ めでたくトークン「<literal>#YO</literal>」が手に入った。
+ </simpara>
+ </section>
+ <section xml:id="commentary">
+ <title>解説</title>
+ <simpara>
+ 短いので頭から追っていく。
+ </simpara>
+ <programlisting language="php" linenumbering="unnumbered">
+ <![CDATA[
+ $π = $argv[1] ?? null;
+ if ($π === null) {
+ exit('No input.');
+ }
+ $π = trim($π);
+ if (!is_numeric($π)) {
+ exit('Invalid input.');
+ }
+ ]]>
+ </programlisting>
+ <simpara>
+ 入力のバリデーション部分。数値のみ受け付ける。
+ </simpara>
+ <programlisting language="php" linenumbering="unnumbered">
+ <![CDATA[
+ $s = implode(array_map(chr(...), str_split($π, 2)));
+ ]]>
+ </programlisting>
+ <simpara>
+ <literal>$π</literal> を 2 文字ごとに区切り (<literal>str_split</literal>)、
+ 数値を ASCII コードと見做して文字に変換 (<literal>chr</literal>) して結合 (<literal>implode</literal>) している。
+ </simpara>
+ <simpara>
+ 例えば、<literal>$π</literal> が <literal>'656667'</literal> だったとすると、
+ <literal>65</literal>、<literal>66</literal>、<literal>67</literal> に対応した
+ <literal>'A'</literal>、<literal>'B'</literal>、<literal>'C'</literal> へと変換され、<literal>'ABC'</literal> になる。
+ </simpara>
+ <programlisting language="php" linenumbering="unnumbered">
+ <![CDATA[
+ $π = '656667';
+ $s = implode(array_map(chr(...), str_split($π, 2)));
+ echo $s;
+ // => ABC
+ ]]>
+ </programlisting>
+ <programlisting language="php" linenumbering="unnumbered">
+ <![CDATA[
+ preg_match('/(\x23.+?) /', $s, $m);
+ $t = $m[1] ?? '';
+ ]]>
+ </programlisting>
+ <simpara>
+ 正規表現でマッチングしている。<literal>\x23</literal> は <literal>#</literal> と同じであることに留意すると、
+ この正規表現は「<literal>#</literal> から始まる 2 以上の長さ (含 <literal>#</literal>) の文字列で、
+ 最初に現れるスペースまで」にマッチする。つまりこれは、PHPerKaigi におけるトークンである。
+ </simpara>
+ <simpara>
+ なお、<literal>#</literal> を直接書いていないのは、<literal>/#.+?) /</literal> と書くと、
+ <literal>#.+?)</literal> という意図せぬトークンが登録されてしまうからである。
+ </simpara>
+ <programlisting language="php" linenumbering="unnumbered">
+ <![CDATA[
+ if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
+ echo "Token: {$t}\n";
+ } else {
+ echo "Failed.\n";
+ }
+ ]]>
+ </programlisting>
+ <simpara>
+ 最後にトークンのハッシュ値を見て、想定解かどうかを確認する。
+ </simpara>
+ </section>
+ <section xml:id="outro">
+ <title>おわりに</title>
+ <simpara>
+ 円周率を何桁も計算して ASCII コード経由で文字列化すれば、トークンっぽいものがどこかで出てくるのではないか、と考えて生まれた作品。
+ </simpara>
+ <simpara>
+ 最初は真面目に円周率の計算プログラムを組んでいたのだが、いざ動かしてみるとやけに浅いところにあったので驚いた
+ (ちなみに、それでも <literal>M_PI</literal> や <literal>pi()</literal> では精度が足りない)。
+ 見つけたときは狂喜したものの、冷静になってみると大して面白くなかったのでボツになった。
+ むしろ、100 万桁目くらいに埋まっていてくれたほうがよかったかもしれない。
+ </simpara>
+ </section>
</article>
diff --git a/content/posts/2022-10-28/setup-server-for-this-site.xml b/content/posts/2022-10-28/setup-server-for-this-site.xml
index b388b36..e4df1b6 100644
--- a/content/posts/2022-10-28/setup-server-for-this-site.xml
+++ b/content/posts/2022-10-28/setup-server-for-this-site.xml
@@ -54,8 +54,8 @@
]]>
</programlisting>
<simpara>
- <literal>teika.key</literal> はローカルからサーバへの接続用、<literal>github2teika.key</literal>
- は、GitHub Actions からサーバへのデプロイ用。
+ <literal>teika.key</literal> はローカルからサーバへの接続用、<literal>github2teika.key</literal> は、
+ GitHub Actions からサーバへのデプロイ用。
</simpara>
</section>
<section xml:id="preparation--ssh-config">
@@ -85,8 +85,8 @@
<section xml:id="basic-setup--user">
<title>ユーザを作成する</title>
<simpara>
- 管理者ユーザで作業すると危ないので、メインで使うユーザを作成する。<literal>sudo</literal>
- グループに追加して <literal>sudo</literal> できるようにし、<literal>su</literal> で切り替え。
+ 管理者ユーザで作業すると危ないので、メインで使うユーザを作成する。
+ <literal>sudo</literal> グループに追加して <literal>sudo</literal> できるようにし、<literal>su</literal> で切り替え。
</simpara>
<programlisting language="shell-session" linenumbering="unnumbered">
<![CDATA[
@@ -148,9 +148,8 @@
<section xml:id="basic-setup--ssh-connect">
<title>SSH で接続確認</title>
<simpara>
- 今の SSH
- セッションは閉じずに、ターミナルを別途開いて疎通確認する。セッションを閉じてしまうと、SSH
- の設定に不備があった場合に締め出しをくらう。
+ 今の SSH セッションは閉じずに、ターミナルを別途開いて疎通確認する。
+ セッションを閉じてしまうと、SSH の設定に不備があった場合に締め出しをくらう。
</simpara>
<programlisting language="shell-session" linenumbering="unnumbered">
<![CDATA[
@@ -179,8 +178,7 @@
<section xml:id="basic-setup--ssh-key-for-github">
<title>GitHub 用の SSH 鍵</title>
<simpara>
- GitHub に置いてある private リポジトリをサーバから clone したいので、SSH
- 鍵を生成して置いておく。
+ GitHub に置いてある private リポジトリをサーバから clone したいので、SSH 鍵を生成して置いておく。
</simpara>
<programlisting language="shell-session" linenumbering="unnumbered">
<![CDATA[
@@ -189,8 +187,7 @@
]]>
</programlisting>
<simpara>
- <link xl:href="https://github.com/settings/ssh">GitHub の設定画面</link>
- から、この公開鍵を追加する。
+ <link xl:href="https://github.com/settings/ssh">GitHub の設定画面</link> から、この公開鍵を追加する。
</simpara>
<programlisting language="shell-session" linenumbering="unnumbered">
<![CDATA[
@@ -235,8 +232,7 @@
<section xml:id="site-hosting-setup--dns">
<title>DNS に IP アドレスを登録する</title>
<simpara>
- このサーバは固定の IP アドレスがあるので、<literal>A</literal>
- レコードに直接入れるだけで済んだ。
+ このサーバは固定の IP アドレスがあるので、<literal>A</literal> レコードに直接入れるだけで済んだ。
</simpara>
</section>
<section xml:id="site-hosting-setup--install-softwares">
@@ -301,8 +297,10 @@
<section xml:id="outro">
<title>感想</title>
<simpara>
- (業務でなく)
- 個人だと数年ぶりのサーバセットアップで、これだけでも割と時間を食ってしまった。とはいえ式年遷宮は楽しいので、これからも定期的にやっていきたい。コンテナデプロイにしたい気持ちもあるのだが、色々実験したい関係上、本物のサーバも欲しくはある。次の式年遷宮では、手順の一部だけでも自動化したいところ。
+ (業務でなく) 個人だと数年ぶりのサーバセットアップで、これだけでも割と時間を食ってしまった。
+ とはいえ式年遷宮は楽しいので、これからも定期的にやっていきたい。
+ コンテナデプロイにしたい気持ちもあるのだが、色々実験したい関係上、本物のサーバも欲しくはある。
+ 次の式年遷宮では、手順の一部だけでも自動化したいところ。
</simpara>
</section>
</article>