aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/posts
diff options
context:
space:
mode:
Diffstat (limited to 'content/posts')
-rw-r--r--content/posts/2021-03-30/phperkaigi-2021.xml212
-rw-r--r--content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml38
-rw-r--r--content/posts/2021-10-02/ruby-then-keyword-and-case-in.xml14
-rw-r--r--content/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre.xml40
-rw-r--r--content/posts/2022-04-09/phperkaigi-2022-tokens.xml47
-rw-r--r--content/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal.xml15
-rw-r--r--content/posts/2022-05-01/phperkaigi-2022.xml16
-rw-r--r--content/posts/2022-08-27/php-conference-okinawa-code-golf.xml24
-rw-r--r--content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml47
-rw-r--r--content/posts/2022-10-28/setup-server-for-this-site.xml12
-rw-r--r--content/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3.xml153
11 files changed, 220 insertions, 398 deletions
diff --git a/content/posts/2021-03-30/phperkaigi-2021.xml b/content/posts/2021-03-30/phperkaigi-2021.xml
index ea9fb37..3cfbb0b 100644
--- a/content/posts/2021-03-30/phperkaigi-2021.xml
+++ b/content/posts/2021-03-30/phperkaigi-2021.xml
@@ -44,15 +44,9 @@
<simpara>Rails のプロジェクトを PHPer のメンバのみでメンテ →他のメンバもわかる
PHP にリプレースを検討</simpara>
<itemizedlist>
- <listitem>
- <simpara>サーバレス</simpara>
- </listitem>
- <listitem>
- <simpara>サーバ・インフラの管理が不要</simpara>
- </listitem>
- <listitem>
- <simpara>アプリケーションコードの知識だけで保守可能</simpara>
- </listitem>
+ <listitem>サーバレス</listitem>
+ <listitem>サーバ・インフラの管理が不要</listitem>
+ <listitem>アプリケーションコードの知識だけで保守可能</listitem>
</itemizedlist>
<simpara>ゼロベースで作れる案件が (Railsの件とは別に)
あるため、そちらで試験的に導入?</simpara>
@@ -87,18 +81,10 @@ web サービスを作る具体的なイメージがまだ見えない (注: す
<simpara>サーチコンソール 「カバレッジ」の「除外」
多すぎるのは問題→クロールバジェットを浪費している</simpara>
<itemizedlist>
- <listitem>
- <simpara>クエリの順番を決める</simpara>
- </listitem>
- <listitem>
- <simpara>空の値のルールを決めておく</simpara>
- </listitem>
- <listitem>
- <simpara>リダイレクトすればインデックスはうまくいく</simpara>
- </listitem>
- <listitem>
- <simpara>リンクが存在する限りクロールはされる</simpara>
- </listitem>
+ <listitem>クエリの順番を決める</listitem>
+ <listitem>空の値のルールを決めておく</listitem>
+ <listitem>リダイレクトすればインデックスはうまくいく</listitem>
+ <listitem>リンクが存在する限りクロールはされる</listitem>
</itemizedlist>
<simpara>リニューアル前のURL</simpara>
<simpara>インデックスは移行される
@@ -119,50 +105,32 @@ web サービスを作る具体的なイメージがまだ見えない (注: す
<simpara>知覚可能 操作可能 理解可能 堅牢 ちゃんとしたHTMLを書く
(閉じタグ・入れ子構造など)</simpara>
<itemizedlist>
- <listitem>
- <simpara>標準の HTML を適切に使う</simpara>
- </listitem>
- <listitem>
- <simpara>WAI-ARIA</simpara>
- </listitem>
- <listitem>
- <simpara>キーボードフレンドリー</simpara>
- </listitem>
- <listitem>
- <simpara>マシンフレンドリー</simpara>
- </listitem>
- <listitem>
- <simpara>SEOフレンドリー</simpara>
- </listitem>
+ <listitem>標準の HTML を適切に使う</listitem>
+ <listitem>WAI-ARIA</listitem>
+ <listitem>キーボードフレンドリー</listitem>
+ <listitem>マシンフレンドリー</listitem>
+ <listitem>SEOフレンドリー</listitem>
</itemizedlist>
<simpara>button タグ →キーボード h1 タグ →スクリーンリーダー・クローラ a タグ</simpara>
<simpara>WAI-ARIA HTML では表現できないセマンティクスを追加する</simpara>
<itemizedlist>
<listitem>
- <simpara>ロール</simpara>
+ ロール
<itemizedlist>
- <listitem>
- <simpara>何をするのか?</simpara>
- </listitem>
- <listitem>
- <simpara>ユーザーアクションによって変化しない</simpara>
- </listitem>
+ <listitem>何をするのか?</listitem>
+ <listitem>ユーザーアクションによって変化しない</listitem>
</itemizedlist>
</listitem>
<listitem>
- <simpara>プロパティ</simpara>
+ プロパティ
<itemizedlist>
- <listitem>
- <simpara>関連づけられたデータ</simpara>
- </listitem>
+ <listitem>関連づけられたデータ</listitem>
</itemizedlist>
</listitem>
<listitem>
- <simpara>ステート</simpara>
+ ステート
<itemizedlist>
- <listitem>
- <simpara>現在の状態</simpara>
- </listitem>
+ <listitem>現在の状態</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
@@ -193,37 +161,23 @@ web サービスを作る具体的なイメージがまだ見えない (注: す
* ネイティブコードにコンパイルされる言語である必要がある</simpara>
<simpara>Filesystem in USEr space (FUSE)</simpara>
<itemizedlist>
- <listitem>
- <simpara>特定の C の関数を呼ぶことで filesystem が作れる</simpara>
- </listitem>
- <listitem>
- <simpara>FFI を持つ言語なら FUSE が使える</simpara>
- </listitem>
+ <listitem>特定の C の関数を呼ぶことで filesystem が作れる</listitem>
+ <listitem>FFI を持つ言語なら FUSE が使える</listitem>
</itemizedlist>
<simpara>SSHFS / s3fs / Docker Desktop</simpara>
<simpara>Linux 以外でも使える</simpara>
<itemizedlist>
- <listitem>
- <simpara>dokany (on Windows)</simpara>
- </listitem>
- <listitem>
- <simpara>osxfuse</simpara>
- </listitem>
+ <listitem>dokany (on Windows)</listitem>
+ <listitem>osxfuse</listitem>
</itemizedlist>
<simpara>VFS: システムコールが呼ばれると、ファイルシステムによってコール FUSE:
カーネル空間からユーザ空間へ通信</simpara>
<simpara>高レベルなラッパで型をつける</simpara>
<simpara>PHP 以外では Wordpress を FUSE にマウントする実装がある (C, Python など)</simpara>
<itemizedlist>
- <listitem>
- <simpara>grep できる</simpara>
- </listitem>
- <listitem>
- <simpara>sed できる</simpara>
- </listitem>
- <listitem>
- <simpara>編集できる</simpara>
- </listitem>
+ <listitem>grep できる</listitem>
+ <listitem>sed できる</listitem>
+ <listitem>編集できる</listitem>
</itemizedlist>
</blockquote>
<simpara>期待通りの興味深い発表だった。FUSE
@@ -239,15 +193,9 @@ web サービスを作る具体的なイメージがまだ見えない (注: す
<simpara>ATDD</simpara>
<blockquote>
<itemizedlist>
- <listitem>
- <simpara>ユーザーストーリー</simpara>
- </listitem>
- <listitem>
- <simpara>ユニットテスト</simpara>
- </listitem>
- <listitem>
- <simpara>CI/CD</simpara>
- </listitem>
+ <listitem>ユーザーストーリー</listitem>
+ <listitem>ユニットテスト</listitem>
+ <listitem>CI/CD</listitem>
</itemizedlist>
<simpara>ユーザストーリーの受け入れ条件が曖昧になりがち
デグレチェックがユニットレベルでは収まらない場合、手動で同じシナリオをテストしている</simpara>
@@ -256,49 +204,31 @@ web サービスを作る具体的なイメージがまだ見えない (注: す
開発チーム支援(コーディング前・コーディング中)/製品批評(コーディング後)</simpara>
<itemizedlist>
<listitem>
- <simpara>Q1: 技術面 &amp; チーム支援</simpara>
+ Q1: 技術面 &amp; チーム支援
<itemizedlist>
- <listitem>
- <simpara>TDD</simpara>
- </listitem>
- <listitem>
- <simpara>ユニットテストなど</simpara>
- </listitem>
+ <listitem>TDD</listitem>
+ <listitem>ユニットテストなど</listitem>
</itemizedlist>
</listitem>
<listitem>
- <simpara>Q2: ビジネス面 &amp; チーム支援</simpara>
+ Q2: ビジネス面 &amp; チーム支援
<itemizedlist>
- <listitem>
- <simpara>ATDD</simpara>
- </listitem>
- <listitem>
- <simpara>ビジネス面の受け入れテストで駆動する</simpara>
- </listitem>
+ <listitem>ATDD</listitem>
+ <listitem>ビジネス面の受け入れテストで駆動する</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
<simpara>Agile Alliance ユーザストーリーのスキルレベルを高める</simpara>
<simpara>テストピラミッド</simpara>
<itemizedlist>
+ <listitem>UI Tests</listitem>
+ <listitem>Service Tests</listitem>
+ <listitem>Unit Tests</listitem>
+ <listitem>異なる粒度のテストを書く</listitem>
<listitem>
- <simpara>UI Tests</simpara>
- </listitem>
- <listitem>
- <simpara>Service Tests</simpara>
- </listitem>
- <listitem>
- <simpara>Unit Tests</simpara>
- </listitem>
- <listitem>
- <simpara>異なる粒度のテストを書く</simpara>
- </listitem>
- <listitem>
- <simpara>高レベルになるほど、持つべきテストは少なくなる</simpara>
+ 高レベルになるほど、持つべきテストは少なくなる
<itemizedlist>
- <listitem>
- <simpara>ピラミッド型になる</simpara>
- </listitem>
+ <listitem>ピラミッド型になる</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
@@ -309,15 +239,9 @@ web サービスを作る具体的なイメージがまだ見えない (注: す
<simpara>外部品質・内部品質</simpara>
<simpara>バーティカルスライスのデリバリー</simpara>
<itemizedlist>
- <listitem>
- <simpara>cucumber</simpara>
- </listitem>
- <listitem>
- <simpara>gauge</simpara>
- </listitem>
- <listitem>
- <simpara>behat</simpara>
- </listitem>
+ <listitem>cucumber</listitem>
+ <listitem>gauge</listitem>
+ <listitem>behat</listitem>
</itemizedlist>
<simpara>ユビキタス言語 手動テストもspecに書く 自動化は可能だがコスパが悪い
失敗することがわかっているテスト(レッドテスト)はCIから外す
@@ -334,15 +258,9 @@ web サービスを作る具体的なイメージがまだ見えない (注: す
<simpara>型のある世界で生きてきた身として大いに楽しみにしていた発表。</simpara>
<blockquote>
<itemizedlist>
- <listitem>
- <simpara>PHPStan</simpara>
- </listitem>
- <listitem>
- <simpara>Phan</simpara>
- </listitem>
- <listitem>
- <simpara>Psalm</simpara>
- </listitem>
+ <listitem>PHPStan</listitem>
+ <listitem>Phan</listitem>
+ <listitem>Psalm</listitem>
</itemizedlist>
<simpara>autoload も認識できる bootstrapFiles</simpara>
<simpara>編集箇所と利用箇所を CI でチェック ルールレベルを徐々に引き上げていく
@@ -408,22 +326,16 @@ text markup * automation</simpara>
<simpara>PHP8 でエラーレベルの引き上げ</simpara>
<itemizedlist>
<listitem>
- <simpara>捕捉すべきもの</simpara>
+ 捕捉すべきもの
<itemizedlist>
- <listitem>
- <simpara>recoverable</simpara>
- </listitem>
+ <listitem>recoverable</listitem>
</itemizedlist>
</listitem>
<listitem>
- <simpara>捕捉すべきでないもの</simpara>
+ 捕捉すべきでないもの
<itemizedlist>
- <listitem>
- <simpara>unrecoverable</simpara>
- </listitem>
- <listitem>
- <simpara>開発時に対処できるもの</simpara>
- </listitem>
+ <listitem>unrecoverable</listitem>
+ <listitem>開発時に対処できるもの</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
@@ -435,25 +347,19 @@ text markup * automation</simpara>
<listitem>
<simpara></simpara>
<itemizedlist>
- <listitem>
- <simpara>本番で起きてはいけない</simpara>
- </listitem>
+ <listitem>本番で起きてはいけない</listitem>
</itemizedlist>
</listitem>
<listitem>
<simpara></simpara>
<itemizedlist>
- <listitem>
- <simpara>本番で起きてはいけない →生じないのだから捕捉もしない</simpara>
- </listitem>
+ <listitem>本番で起きてはいけない →生じないのだから捕捉もしない</listitem>
</itemizedlist>
</listitem>
<listitem>
<simpara></simpara>
<itemizedlist>
- <listitem>
- <simpara>起こるかもしれないので本番環境でも考慮する</simpara>
- </listitem>
+ <listitem>起こるかもしれないので本番環境でも考慮する</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
@@ -524,12 +430,8 @@ private のみ * 依存関係の制御が困難</simpara>
<simpara>アーキテクチャテスト
クラスの依存関係や実装ルールをコードとして表現し、自動テスト化する</simpara>
<itemizedlist>
- <listitem>
- <simpara>deptrac</simpara>
- </listitem>
- <listitem>
- <simpara>phpat</simpara>
- </listitem>
+ <listitem>deptrac</listitem>
+ <listitem>phpat</listitem>
</itemizedlist>
<simpara>Independent Core Layer Pattern</simpara>
<simpara>アーキテクチャテストの失敗 * 実装誤り * or アーキテクチャが適切でない *
diff --git a/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml b/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml
index f212b7c..4ee22fe 100644
--- a/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml
+++ b/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml
@@ -53,15 +53,15 @@ std::cout &lt;&lt; "Hello, World!" &lt;&lt; std::endl;
<blockquote>
<itemizedlist>
<listitem>
- <simpara>the identifiers that are keywords cannot be used for other purposes;</simpara>
+ the identifiers that are keywords cannot be used for other purposes;
<itemizedlist>
<listitem>
- <simpara>The only place they can be used as non-keywords is in an
- attribute-token. (e.g. [[private]] is a valid attribute) (since C++11)</simpara>
- </listitem>
- </itemizedlist>
- </listitem>
-</itemizedlist>
+ The only place they can be used as non-keywords is in an
+ attribute-token. (e.g. [[private]] is a valid attribute) (since C++11)
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </itemizedlist>
</blockquote>
<simpara>キーワードでも属性として指定する場合は非キーワードとして使えるらしい。
実際にやってみる。</simpara>
@@ -91,24 +91,12 @@ std::cout &lt;&lt; "Hello, World!" &lt;&lt; std::endl;
(参考:
<link xl:href="https://timsong-cpp.github.io/cppwp/n4659/lex.digraph">同ドラフト</link>)</simpara>
<itemizedlist>
- <listitem>
- <simpara><literal>&lt;%</literal> → <literal>{</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>%&gt;</literal> → <literal>}</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>&lt;:</literal> → <literal>[</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>:&gt;</literal> → <literal>]</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>%:</literal> → <literal>#</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>%:%:</literal> → <literal>##</literal></simpara>
- </listitem>
+ <listitem><literal>&lt;%</literal> → <literal>{</literal></listitem>
+ <listitem><literal>%&gt;</literal> → <literal>}</literal></listitem>
+ <listitem><literal>&lt;:</literal> → <literal>[</literal></listitem>
+ <listitem><literal>:&gt;</literal> → <literal>]</literal></listitem>
+ <listitem><literal>%:</literal> → <literal>#</literal></listitem>
+ <listitem><literal>%:%:</literal> → <literal>##</literal></listitem>
</itemizedlist>
<simpara>「<literal>identifier</literal>
の構文上の要件を満たさないような代替トークン」はこれらが当てはまると思われる。</simpara>
diff --git a/content/posts/2021-10-02/ruby-then-keyword-and-case-in.xml b/content/posts/2021-10-02/ruby-then-keyword-and-case-in.xml
index 4176c67..2901e44 100644
--- a/content/posts/2021-10-02/ruby-then-keyword-and-case-in.xml
+++ b/content/posts/2021-10-02/ruby-then-keyword-and-case-in.xml
@@ -177,19 +177,13 @@ end</programlisting>
<title>まとめ</title>
<itemizedlist>
<listitem>
- <simpara><literal>if</literal> や <literal>case</literal> の条件の後ろには <literal>then</literal>、<literal>;</literal>、改行のいずれかが必要</simpara>
+ <literal>if</literal> や <literal>case</literal> の条件の後ろには <literal>then</literal>、<literal>;</literal>、改行のいずれかが必要
<itemizedlist>
- <listitem>
- <simpara>通常は改行しておけばよい</simpara>
- </listitem>
+ <listitem>通常は改行しておけばよい</listitem>
</itemizedlist>
</listitem>
- <listitem>
- <simpara>3.0 で入る予定の <literal>case</literal> - <literal>in</literal> でも <literal>then</literal> 等が必要になる</simpara>
- </listitem>
- <listitem>
- <simpara>Ruby の構文を正確に知るには (現状) <literal>parse.y</literal> を直接読めばよい</simpara>
- </listitem>
+ <listitem>3.0 で入る予定の <literal>case</literal> - <literal>in</literal> でも <literal>then</literal> 等が必要になる</listitem>
+ <listitem>Ruby の構文を正確に知るには (現状) <literal>parse.y</literal> を直接読めばよい</listitem>
</itemizedlist>
</section>
</article>
diff --git a/content/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre.xml b/content/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre.xml
index ed7f03f..dc3843b 100644
--- a/content/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre.xml
+++ b/content/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre.xml
@@ -28,15 +28,9 @@
<literal>:help</literal>
に説明があるが、この記事のタイトルにある2つを含めた以下のイベントには、その違いについて説明がない。</simpara>
<itemizedlist>
- <listitem>
- <simpara><literal>BufRead</literal>/<literal>BufReadPost</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>BufWrite</literal>/<literal>BufWritePre</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>BufAdd</literal>/<literal>BufCreate</literal></simpara>
- </listitem>
+ <listitem><literal>BufRead</literal>/<literal>BufReadPost</literal></listitem>
+ <listitem><literal>BufWrite</literal>/<literal>BufWritePre</literal></listitem>
+ <listitem><literal>BufAdd</literal>/<literal>BufCreate</literal></listitem>
</itemizedlist>
<simpara>このうち、<literal>BufAdd</literal>/<literal>BufCreate</literal> に関しては、<literal>:help BufCreate</literal> に</simpara>
<blockquote>
@@ -90,39 +84,27 @@ to |EncodingChanged|.</literallayout>
<simpara>記事タイトルについて言えば、どちらも変わらないので好きな方を使えばよい。あえて言えば、次のようになるだろう。</simpara>
<itemizedlist>
<listitem>
- <simpara><literal>BufAdd</literal>/<literal>BufCreate</literal></simpara>
+ <literal>BufAdd</literal>/<literal>BufCreate</literal>
<itemizedlist>
- <listitem>
- <simpara>→ <literal>BufCreate</literal> は歴史的な理由により (<literal>`for historic reasons'')
- 存在しているため、新しい方 (`BufAdd</literal>) を使う</simpara>
- </listitem>
+ <listitem>→ <literal>BufCreate</literal> は歴史的な理由により ("for historic reasons") 存在しているため、新しい方 (<literal>BufAdd</literal>) を使う</listitem>
</itemizedlist>
</listitem>
<listitem>
- <simpara><literal>BufRead</literal>/<literal>BufReadPost</literal></simpara>
+ <literal>BufRead</literal>/<literal>BufReadPost</literal>
<itemizedlist>
- <listitem>
- <simpara>→ <literal>BufReadPre</literal> との対称性のため、あるいは <literal>BufWritePost</literal>
- との対称性のため <literal>BufReadPost</literal> を使う</simpara>
- </listitem>
+ <listitem>→ <literal>BufReadPre</literal> との対称性のため、あるいは <literal>BufWritePost</literal> との対称性のため <literal>BufReadPost</literal> を使う</listitem>
</itemizedlist>
</listitem>
<listitem>
- <simpara><literal>BufWrite</literal>/<literal>BufWritePre</literal></simpara>
+ <literal>BufWrite</literal>/<literal>BufWritePre</literal>
<itemizedlist>
- <listitem>
- <simpara>→ <literal>BufWritePost</literal> との対称性のため、あるいは <literal>BufReadPre</literal>
- との対称性のため <literal>BufWritePre</literal> を使う</simpara>
- </listitem>
+ <listitem>→ <literal>BufWritePost</literal> との対称性のため、あるいは <literal>BufReadPre</literal> との対称性のため <literal>BufWritePre</literal> を使う</listitem>
</itemizedlist>
</listitem>
<listitem>
- <simpara><literal>FileEncoding</literal>/<literal>EncodingChanged</literal></simpara>
+ <literal>FileEncoding</literal>/<literal>EncodingChanged</literal>
<itemizedlist>
- <listitem>
- <simpara>→ <literal>FileEncoding</literal> は <literal>`Obsolete''
- と明言されているので、`EncodingChanged</literal> を使う</simpara>
-</listitem>
+ <listitem>→ <literal>FileEncoding</literal> は <literal>`Obsolete'' と明言されているので、`EncodingChanged</literal> を使う</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
diff --git a/content/posts/2022-04-09/phperkaigi-2022-tokens.xml b/content/posts/2022-04-09/phperkaigi-2022-tokens.xml
index b0c749b..0f5d7be 100644
--- a/content/posts/2022-04-09/phperkaigi-2022-tokens.xml
+++ b/content/posts/2022-04-09/phperkaigi-2022-tokens.xml
@@ -141,27 +141,13 @@
<simpara>実行結果はこちら: <link xl:href="https://ideone.com/22VWmb">https://ideone.com/22VWmb</link></simpara>
<simpara>それぞれの絵文字で表された関数が、各命令に対応している。</simpara>
<itemizedlist>
- <listitem>
- <simpara><literal>$👉</literal>: <literal>&gt;</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>$👈</literal>: <literal>&lt;</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>$👍</literal>: <literal>+</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>$👎</literal>: <literal>-</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>$📝</literal>: <literal>.</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>$🤡</literal>: <literal>[</literal></simpara>
- </listitem>
- <listitem>
- <simpara><literal>$🎪</literal>: <literal>]</literal></simpara>
- </listitem>
+ <listitem><literal>$👉</literal>: <literal>&gt;</literal></listitem>
+ <listitem><literal>$👈</literal>: <literal>&lt;</literal></listitem>
+ <listitem><literal>$👍</literal>: <literal>+</literal></listitem>
+ <listitem><literal>$👎</literal>: <literal>-</literal></listitem>
+ <listitem><literal>$📝</literal>: <literal>.</literal></listitem>
+ <listitem><literal>$🤡</literal>: <literal>[</literal></listitem>
+ <listitem><literal>$🎪</literal>: <literal>]</literal></listitem>
</itemizedlist>
<simpara><literal>,</literal> (入力) に対応する関数はない
(このプログラムでは使わないので用意していない)。</simpara>
@@ -286,20 +272,11 @@ assert(10 === +(![].+!![]));</programlisting>
<title>ヒント</title>
<simpara>次に、ソースコードに書いてあるヒントを読んでいく。</simpara>
<itemizedlist>
- <listitem>
- <simpara><literal>N</literal> それ自体は、42 や 8128
- といったような特別な意味を持たず、ランダムに決められている</simpara>
- </listitem>
- <listitem>
- <simpara><literal>$token</literal> の各要素は、1文字を表す</simpara>
- </listitem>
- <listitem>
- <simpara>1文字は 5x5 のセルからなる</simpara>
- </listitem>
- <listitem>
- <simpara>出力されるのは、完全な PHPer トークンである</simpara>
- </listitem>
-</itemizedlist>
+ <listitem><literal>N</literal> それ自体は、42 や 8128 といったような特別な意味を持たず、ランダムに決められている</listitem>
+ <listitem><literal>$token</literal> の各要素は、1文字を表す</listitem>
+ <listitem>1文字は 5x5 のセルからなる</listitem>
+ <listitem>出力されるのは、完全な PHPer トークンである</listitem>
+ </itemizedlist>
<simpara>ここで、PHPer トークンは必ず <literal>#</literal> 記号から始まることを思いだすと、
<literal>$token</literal> の最初の数字 <literal>0x14B499C</literal> は、変換の結果 <literal>#</literal>
になるのではないかと予想される (なお、このことは、リポジトリの README
diff --git a/content/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal.xml b/content/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal.xml
index e05b51f..0acaad5 100644
--- a/content/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal.xml
+++ b/content/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal.xml
@@ -46,17 +46,10 @@
<title>プログラム</title>
<simpara>全体の流れは次のようになっている。</simpara>
<orderedlist numeration="arabic">
- <listitem>
- <simpara>フォントファイルを読み込む</simpara>
- </listitem>
- <listitem>
- <simpara>コマンドライン引数を Shift-JIS に変換する (フォントが Shift-JIS
- 基準で並んでいるため)</simpara>
- </listitem>
- <listitem>
- <simpara>1文字ずつレンダリングしていく</simpara>
- </listitem>
-</orderedlist>
+ <listitem>フォントファイルを読み込む</listitem>
+ <listitem>コマンドライン引数を Shift-JIS に変換する (フォントが Shift-JIS 基準で並んでいるため)</listitem>
+ <listitem>1文字ずつレンダリングしていく</listitem>
+ </orderedlist>
<simpara><literal>big-clock-mode</literal> が Go 製なので、今回も Go で書いた。 PNG
が標準ライブラリにあったり、Shift-JIS
のエンコーディングが準標準ライブラリにあったりしたのは助かった。</simpara>
diff --git a/content/posts/2022-05-01/phperkaigi-2022.xml b/content/posts/2022-05-01/phperkaigi-2022.xml
index 1ef2a29..106b1db 100644
--- a/content/posts/2022-05-01/phperkaigi-2022.xml
+++ b/content/posts/2022-05-01/phperkaigi-2022.xml
@@ -112,18 +112,10 @@
<simpara>PHPerKaigi 2023 があるかどうか存じ上げないが、あるとすれば、次の
4つを目標としたい。</simpara>
<itemizedlist>
- <listitem>
- <simpara>プロポーザルを出す</simpara>
- </listitem>
- <listitem>
- <simpara>PHPer チャレンジのトークン問題を 5題作成する</simpara>
- </listitem>
- <listitem>
- <simpara>現地に行く</simpara>
- </listitem>
- <listitem>
- <simpara>PHPer チャレンジで圧勝する</simpara>
- </listitem>
+ <listitem>プロポーザルを出す</listitem>
+ <listitem>PHPer チャレンジのトークン問題を 5題作成する</listitem>
+ <listitem>現地に行く</listitem>
+ <listitem>PHPer チャレンジで圧勝する</listitem>
</itemizedlist>
<simpara><hr/></simpara>
<simpara>最後になりましたが、PHPerKaigi
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 6c9305b..660b4ad 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
@@ -31,24 +31,12 @@
<title>解</title>
<simpara>細かいレギュレーションは不明だったので、勝手に定めた。</simpara>
<itemizedlist>
- <listitem>
- <simpara>コマンドライン引数の第1引数で受けとる</simpara>
- </listitem>
- <listitem>
- <simpara>結果は標準出力に出す</simpara>
- </listitem>
- <listitem>
- <simpara>コンマの直後にはスペースを1つ置く</simpara>
- </listitem>
- <listitem>
- <simpara>末尾コンマは禁止</simpara>
- </listitem>
- <listitem>
- <simpara>数字でないものは入ってこないものとする</simpara>
- </listitem>
- <listitem>
- <simpara>負数は入ってこないものとする</simpara>
- </listitem>
+ <listitem>コマンドライン引数の第1引数で受けとる</listitem>
+ <listitem>結果は標準出力に出す</listitem>
+ <listitem>コンマの直後にはスペースを1つ置く</listitem>
+ <listitem>末尾コンマは禁止</listitem>
+ <listitem>数字でないものは入ってこないものとする</listitem>
+ <listitem>負数は入ってこないものとする</listitem>
</itemizedlist>
<simpara>書いたものがこちら:</simpara>
<programlisting language="php" linenumbering="unnumbered">[&lt;?php $n=$argv[1];foreach([1e4,5e3,2e3,1e3,500,100,50,10,5,1]as$x)for(;$n&gt;=$x;$n-=$x)$r[]=$x;echo implode(', ',$r??[]);?&gt;]</programlisting>
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 5cb5d93..32c88e8 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
@@ -31,35 +31,24 @@
<simpara>PHP で、次のような制約の下に fizzbuzz を書いた。</simpara>
<itemizedlist>
<listitem>
- <simpara>1行あたりの文字数は2文字までに収めること (ただし <literal>&lt;?php</literal> タグは除く)</simpara>
+ 1行あたりの文字数は2文字までに収めること (ただし <literal>&lt;?php</literal> タグは除く)
<itemizedlist>
<listitem>
- <simpara>厳密な定義: <literal>&lt;?php</literal> タグ以降のソースコードが、2 byte ごとに
- ラインフィード (LF) で区切られること</simpara>
+ 厳密な定義: <literal>&lt;?php</literal> タグ以降のソースコードが、2 byte ごとに
+ ラインフィード (LF) で区切られること
</listitem>
</itemizedlist>
</listitem>
+ <listitem>スペースやタブを使用しないこと</listitem>
<listitem>
- <simpara>スペースやタブを使用しないこと</simpara>
- </listitem>
- <listitem>
- <simpara>ループのアンロールをしないこと</simpara>
+ ループのアンロールをしないこと
<itemizedlist>
- <listitem>
- <simpara>100 回ループの代わりに 100 回コードをコピペ、というのは禁止</simpara>
- </listitem>
+ <listitem>100 回ループの代わりに 100 回コードをコピペ、というのは禁止</listitem>
</itemizedlist>
</listitem>
- <listitem>
- <simpara>PHP 7.4〜8.1 で動作すること</simpara>
- </listitem>
- <listitem>
- <simpara>実行時に Notice や Warning が出ないこと</simpara>
- </listitem>
- <listitem>
- <simpara>標準的なインストール構成の PHP で実現できること
- (デフォルトで有効になっていない拡張等を使わないこと)</simpara>
-</listitem>
+ <listitem>PHP 7.4〜8.1 で動作すること</listitem>
+ <listitem>実行時に Notice や Warning が出ないこと</listitem>
+ <listitem>標準的なインストール構成の PHP で実現できること (デフォルトで有効になっていない拡張等を使わないこと)</listitem>
</itemizedlist>
<simpara>備考: PHP には <literal>short_open_tag</literal>
というオプションがあり、これを有効にするとファイル冒頭の <literal>&lt;?php</literal>
@@ -159,13 +148,13 @@
の範囲内において、名前が 2文字以下の関数は以下のとおりである:</simpara>
<itemizedlist>
<listitem>
- <simpara><literal>_</literal>: <literal>gettext</literal> のエイリアス</simpara>
+ <literal>_</literal>: <literal>gettext</literal> のエイリアス
</listitem>
<listitem>
- <simpara><literal>dl</literal>: 拡張モジュールをロードする</simpara>
+ <literal>dl</literal>: 拡張モジュールをロードする
</listitem>
<listitem>
- <simpara><literal>pi</literal>: 円周率を返す</simpara>
+ <literal>pi</literal>: 円周率を返す
</listitem>
</itemizedlist>
<simpara>(環境によって多少は変わるかも)</simpara>
@@ -173,9 +162,7 @@
で読み込む行為は、レギュレーションで定めた</simpara>
<blockquote>
<itemizedlist>
- <listitem>
- <simpara>標準的なインストール構成の PHP で実現できること
- (デフォルトで有効になっていない拡張等を使わないこと)</simpara>
+ <listitem>標準的なインストール構成の PHP で実現できること (デフォルトで有効になっていない拡張等を使わないこと)
</listitem>
</itemizedlist>
</blockquote>
@@ -264,9 +251,7 @@
<simpara>今回使ったテクニックを説明する前に、余談として、文字列リテラルの短縮法として今回採用しなかったものを紹介する。</simpara>
<blockquote>
<itemizedlist>
- <listitem>
- <simpara>PHP 7.4〜8.1 で動作すること</simpara>
- </listitem>
+ <listitem>PHP 7.4〜8.1 で動作すること</listitem>
</itemizedlist>
</blockquote>
<simpara>というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という
@@ -570,9 +555,7 @@
<simpara>ただし、これでは</simpara>
<blockquote>
<itemizedlist>
- <listitem>
- <simpara>スペースやタブを使用しないこと</simpara>
- </listitem>
+ <listitem>スペースやタブを使用しないこと</listitem>
</itemizedlist>
</blockquote>
<simpara>に違反してしまう。スペースが使えないと引数とコマンドを区切れない。これは困った。</simpara>
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 6521029..388238b 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
@@ -86,15 +86,9 @@
<programlisting language="shell-session" linenumbering="unnumbered">$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
$ sudo vi /etc/ssh/sshd_config</programlisting>
<itemizedlist>
- <listitem>
- <simpara><literal>Port</literal> を変更</simpara>
- </listitem>
- <listitem>
- <simpara><literal>PermitRootLogin</literal> を <literal>no</literal> に</simpara>
- </listitem>
- <listitem>
- <simpara><literal>PasswordAuthentication</literal> を <literal>no</literal> に</simpara>
- </listitem>
+ <listitem><literal>Port</literal> を変更</listitem>
+ <listitem><literal>PermitRootLogin</literal> を <literal>no</literal> に</listitem>
+ <listitem><literal>PasswordAuthentication</literal> を <literal>no</literal> に</listitem>
</itemizedlist>
<simpara>そして設定を反映。</simpara>
<programlisting language="shell-session" linenumbering="unnumbered">$ sudo systemctl restart sshd
diff --git a/content/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3.xml b/content/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3.xml
index cd65047..6356597 100644
--- a/content/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3.xml
+++ b/content/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3.xml
@@ -16,25 +16,32 @@
</revision>
</revhistory>
</info>
- <section xml:id="_はじめに">
+ <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 記事ずつ公開していく予定 (忘れていなければ → 忘れていたので 12 月公開予定だった記事を今書いている)。</simpara>
+ <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 記事ずつ公開していく予定 (忘れていなければ → 忘れていたので 12 月公開予定だった記事を今書いている)。
+ </simpara>
<itemizedlist>
- <listitem>
- <simpara>その 1 はこちら: <link xl:href="/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/">PHPerKaigi 2023: ボツになったトークン問題 その 1</link></simpara>
- </listitem>
- <listitem>
- <simpara>その 2 はこちら: <link xl:href="/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/">PHPerKaigi 2023: ボツになったトークン問題 その 2</link></simpara>
- </listitem>
+ <listitem>その 1 はこちら: <link xl:href="/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/">PHPerKaigi 2023: ボツになったトークン問題 その 1</link></listitem>
+ <listitem>その 2 はこちら: <link xl:href="/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/">PHPerKaigi 2023: ボツになったトークン問題 その 2</link></listitem>
</itemizedlist>
</section>
- <section xml:id="_問題">
+ <section xml:id="quiz">
<title>問題</title>
- <simpara>注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。</simpara>
+ <simpara>
+ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。
+ </simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
<?php
@@ -151,27 +158,33 @@
}
]]>
</programlisting>
- <simpara>"Catchline" と名付けた作品。実行するとトークン <literal>#base64_decode('SGVsbG8sIFdvcmxkIQ==')</literal> が得られる。</simpara>
- <simpara>トークンは PHP の式になっていて、評価すると <literal>Hello, World!</literal> という文字列になる。PHPer チャレンジのトークンには空白を含められないという制約があるが、こういった形でトークンにすれば回避できる。</simpara>
+ <simpara>
+ "Catchline" と名付けた作品。実行するとトークン <literal>#base64_decode('SGVsbG8sIFdvcmxkIQ==')</literal> が得られる。
+ </simpara>
+ <simpara>
+ トークンは PHP の式になっていて、評価すると <literal>Hello, World!</literal> という文字列になる。PHPer チャレンジのトークンには空白を含められないという制約があるが、こういった形でトークンにすれば回避できる。
+ </simpara>
</section>
<section xml:id="_解説">
<title>解説</title>
<section xml:id="_概要">
<title>概要</title>
- <simpara>例外が発生した行数にデータをエンコードし、それを <literal>catch</literal> で捕まえて表示している。</simpara>
+ <simpara>
+ 例外が発生した行数にデータをエンコードし、それを <literal>catch</literal> で捕まえて表示している。
+ </simpara>
</section>
<section xml:id="_例外オブジェクトの連鎖">
<title>例外オブジェクトの連鎖</title>
- <simpara><link xl:href="https://www.php.net/class.Exception"><literal>Exception</literal></link> や <link xl:href="https://www.php.net/class.Error"><literal>Error</literal></link> には <literal>$previous</literal> というプロパティがあり、コンストラクタの第3引数から渡すことができる。主に 2つの用法がある:</simpara>
+ <simpara>
+ <link xl:href="https://www.php.net/class.Exception"><literal>Exception</literal></link> や <link xl:href="https://www.php.net/class.Error"><literal>Error</literal></link> には <literal>$previous</literal> というプロパティがあり、コンストラクタの第3引数から渡すことができる。主に 2つの用法がある:
+ </simpara>
<itemizedlist>
- <listitem>
- <simpara>エラーを処理している途中に起こった別のエラーに、元のエラー情報を含める</simpara>
- </listitem>
- <listitem>
- <simpara>内部エラーをラップして作られたエラーに、内部エラーの情報を含める</simpara>
- </listitem>
+ <listitem>エラーを処理している途中に起こった別のエラーに、元のエラー情報を含める</listitem>
+ <listitem>内部エラーをラップして作られたエラーに、内部エラーの情報を含める</listitem>
</itemizedlist>
- <simpara>このうち 1つ目のケースは、 <literal>finally</literal> 節の中でエラーを投げると PHP 処理系が勝手に <literal>$previous</literal> を設定してくれる。</simpara>
+ <simpara>
+ このうち 1つ目のケースは、 <literal>finally</literal> 節の中でエラーを投げると PHP 処理系が勝手に <literal>$previous</literal> を設定してくれる。
+ </simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
<?php
@@ -190,11 +203,15 @@
}
]]>
</programlisting>
- <simpara>この知識を元に、トークンの出力部を解析してみる。</simpara>
+ <simpara>
+ この知識を元に、トークンの出力部を解析してみる。
+ </simpara>
</section>
<section xml:id="_出力部の解析">
<title>出力部の解析</title>
- <simpara>出力部をコメントや改行を追加して再掲する:</simpara>
+ <simpara>
+ 出力部をコメントや改行を追加して再掲する:
+ </simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
<?php
@@ -208,19 +225,29 @@
}
]]>
</programlisting>
- <simpara>出力をおこなう <literal>catch</literal> 節を見てみると、 <literal>Throwable::getPrevious()</literal> を呼び出してエラーチェインを辿り、 <literal>Throwable::getLine()</literal> でエラーが発生した行数を取得している。その行数に <literal>23</literal> なるマジックナンバーを足し、フォーマット指定子 <literal>%c</literal> で出力している。</simpara>
- <simpara>フォーマット指定子 <literal>%c</literal> は、整数を ASCII コード<footnote>RAS syndrome</footnote> と見做して印字する。トークン <literal>#base64_decode('SGVsbG8sIFdvcmxkIQ==')</literal> の <literal>b</literal> であれば、ASCII コード <literal>98</literal> なので、75 行目で発生したエラー、</simpara>
+ <simpara>
+ 出力をおこなう <literal>catch</literal> 節を見てみると、 <literal>Throwable::getPrevious()</literal> を呼び出してエラーチェインを辿り、 <literal>Throwable::getLine()</literal> でエラーが発生した行数を取得している。その行数に <literal>23</literal> なるマジックナンバーを足し、フォーマット指定子 <literal>%c</literal> で出力している。
+ </simpara>
+ <simpara>
+ フォーマット指定子 <literal>%c</literal> は、整数を ASCII コード<footnote>RAS syndrome</footnote> と見做して印字する。トークン <literal>#base64_decode('SGVsbG8sIFdvcmxkIQ==')</literal> の <literal>b</literal> であれば、ASCII コード <literal>98</literal> なので、75 行目で発生したエラー、
+ </simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
1, 20 => 0 / 0,
]]>
</programlisting>
- <simpara>によって表現されている。エラーを起こす方法はいろいろと考えられるが、今回はゼロ除算を使った。</simpara>
- <simpara>それでは、エラーチェインを作る箇所、関数 <literal>f()</literal> を見ていく。</simpara>
+ <simpara>
+ によって表現されている。エラーを起こす方法はいろいろと考えられるが、今回はゼロ除算を使った。
+ </simpara>
+ <simpara>
+ それでは、エラーチェインを作る箇所、関数 <literal>f()</literal> を見ていく。
+ </simpara>
</section>
<section xml:id="_データ構成部の解析">
<title>データ構成部の解析</title>
- <simpara><literal>f()</literal> の定義を再掲する (エラーオブジェクトの行数を利用しているので、一部分だけ抜き出すと値が変わることに注意):</simpara>
+ <simpara>
+ <literal>f()</literal> の定義を再掲する (エラーオブジェクトの行数を利用しているので、一部分だけ抜き出すと値が変わることに注意):
+ </simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
function f(int $i) {
@@ -245,7 +272,9 @@
}
]]>
</programlisting>
- <simpara>前述のように、 <literal>finally</literal> 節でエラーを投げると PHP 処理系が <literal>$previous</literal> を設定する。ここでは、エラーを繋げるために <literal>f()</literal> を再帰呼び出ししている。最初に <literal>f()</literal> を呼び出している箇所を確認すると、</simpara>
+ <simpara>
+ 前述のように、 <literal>finally</literal> 節でエラーを投げると PHP 処理系が <literal>$previous</literal> を設定する。ここでは、エラーを繋げるために <literal>f()</literal> を再帰呼び出ししている。最初に <literal>f()</literal> を呼び出している箇所を確認すると、
+ </simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
<?php
@@ -260,41 +289,41 @@
}
]]>
</programlisting>
- <simpara><literal>f()</literal> には <literal>111 / 3</literal> で <literal>37</literal> が渡されることがわかる。そこから 1 ずつ減らして再帰呼び出ししていき、0 より小さくなったら <literal>f()</literal> を引数なしで呼び出す。引数の数が足りないと呼び出しに失敗するので、再帰はここで止まる。</simpara>
- <simpara>エラーチェインは、最後に発生したエラーを先頭とした単方向連結リストになっているので、順に</simpara>
+ <simpara>
+ <literal>f()</literal> には <literal>111 / 3</literal> で <literal>37</literal> が渡されることがわかる。そこから 1 ずつ減らして再帰呼び出ししていき、0 より小さくなったら <literal>f()</literal> を引数なしで呼び出す。引数の数が足りないと呼び出しに失敗するので、再帰はここで止まる。
+ </simpara>
+ <simpara>
+ エラーチェインは、最後に発生したエラーを先頭とした単方向連結リストになっているので、順に
+ </simpara>
<orderedlist numeration="arabic">
- <listitem>
- <simpara><literal>f()</literal> の引数が足りないことによる呼び出し失敗</simpara>
- </listitem>
- <listitem>
- <simpara><literal>f(0)</literal> の呼び出しで発生したゼロ除算</simpara>
- </listitem>
- <listitem>
- <simpara><literal>f(1)</literal> の呼び出しで発生したゼロ除算</simpara>
- </listitem>
- <listitem>
- <simpara>&#8230;&#8203;</simpara>
- </listitem>
- <listitem>
- <simpara><literal>f(37)</literal> の呼び出しで発生したゼロ除算</simpara>
- </listitem>
+ <listitem><literal>f()</literal> の引数が足りないことによる呼び出し失敗</listitem>
+ <listitem><literal>f(0)</literal> の呼び出しで発生したゼロ除算</listitem>
+ <listitem><literal>f(1)</literal> の呼び出しで発生したゼロ除算</listitem>
+ <listitem>…</listitem>
+ <listitem><literal>f(37)</literal> の呼び出しで発生したゼロ除算</listitem>
</orderedlist>
- <simpara>となっている。出力の際は <literal>catch</literal> したエラーの <literal>getPrevious()</literal> から処理を始めるので、1 番目の <literal>f()</literal> によるエラーは無視され、 <literal>f(0)</literal> によるエラー、 <literal>f(1)</literal> によるエラー、 <literal>f(2)</literal> によるエラー、と出力が進む。</simpara>
- <simpara><literal>f()</literal> に <literal>0</literal> を渡したときは 12 行目にある <literal>match</literal> の <literal>0</literal> でゼロ除算が起こるので、行数が 12 となったエラーが投げられる。出力部ではこれに 23 を足した数を ASCII コードとして表示しているのだった。 <literal>12 + 23</literal> は <literal>35</literal>、ASCII コードでは <literal>#</literal> である。これがトークンの 1文字目にあたる。</simpara>
+ <simpara>
+ となっている。出力の際は <literal>catch</literal> したエラーの <literal>getPrevious()</literal> から処理を始めるので、1 番目の <literal>f()</literal> によるエラーは無視され、 <literal>f(0)</literal> によるエラー、 <literal>f(1)</literal> によるエラー、 <literal>f(2)</literal> によるエラー、と出力が進む。
+ </simpara>
+ <simpara>
+ <literal>f()</literal> に <literal>0</literal> を渡したときは 12 行目にある <literal>match</literal> の <literal>0</literal> でゼロ除算が起こるので、行数が 12 となったエラーが投げられる。出力部ではこれに 23 を足した数を ASCII コードとして表示しているのだった。 <literal>12 + 23</literal> は <literal>35</literal>、ASCII コードでは <literal>#</literal> である。これがトークンの 1文字目にあたる。
+ </simpara>
</section>
</section>
- <section xml:id="_おわりに">
+ <section xml:id="outro">
<title>おわりに</title>
- <simpara>「行数」というのはトークン文字列をデコードする対象として優れている。</simpara>
+ <simpara>
+ 「行数」というのはトークン文字列をデコードする対象として優れている。
+ </simpara>
<itemizedlist>
- <listitem>
- <simpara>トークンの一部や全部が陽に現れない</simpara>
- </listitem>
- <listitem>
- <simpara><literal>__LINE__</literal> で容易に取得できる</simpara>
- </listitem>
+ <listitem>トークンの一部や全部が陽に現れない</listitem>
+ <listitem><literal>__LINE__</literal> で容易に取得できる</listitem>
</itemizedlist>
- <simpara>しかし、こういった「変な」プログラムを何度も読んだり書いたりしていると、 <literal>__LINE__</literal> を使うのはあまりにありきたりで退屈になる。では、他に行数を取得する手段はないか。こうして <literal>Throwable</literal> を思いつき、続けてエラーオブジェクトには <literal>$previous</literal> があることを思い出した。</simpara>
- <simpara>今回エラーを投げるのにゼロ除算を用いたのは、それがエラーを投げる最も短いコードだと考えたからである。もし 3バイト未満で <literal>Throwable</literal> なオブジェクトを投げる手段をご存じのかたがいらっしゃれば、ぜひご教示いただきたい。……と締める予定だったのだが、<literal>0/0</literal> のところを存在しない定数にすれば、簡単に 1バイトを達成できた。ゼロ除算している箇所はちょうど 26 箇所あるので、アルファベットにでもしておけば意味ありげで良かったかもしれない。</simpara>
+ <simpara>
+ しかし、こういった「変な」プログラムを何度も読んだり書いたりしていると、 <literal>__LINE__</literal> を使うのはあまりにありきたりで退屈になる。では、他に行数を取得する手段はないか。こうして <literal>Throwable</literal> を思いつき、続けてエラーオブジェクトには <literal>$previous</literal> があることを思い出した。
+ </simpara>
+ <simpara>
+ 今回エラーを投げるのにゼロ除算を用いたのは、それがエラーを投げる最も短いコードだと考えたからである。もし 3バイト未満で <literal>Throwable</literal> なオブジェクトを投げる手段をご存じのかたがいらっしゃれば、ぜひご教示いただきたい。……と締める予定だったのだが、<literal>0/0</literal> のところを存在しない定数にすれば、簡単に 1バイトを達成できた。ゼロ除算している箇所はちょうど 26 箇所あるので、アルファベットにでもしておけば意味ありげで良かったかもしれない。
+ </simpara>
</section>
</article>