- 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。 + 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。 本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。
From 572cd70d9fc7baf4d86a633a3ab74c6d058a4de8 Mon Sep 17 00:00:00 2001
From: nsfisis
- 2022-04-09 から 2022-04-11 にかけて開催された、https://phperkaigi.jp/2022/[PHPerKaigi 2022] に、一般参加者として参加した。 弊社https://www.dgcircus.com/[デジタルサーカス株式会社] はダイヤモンドスポンサーとなっており、スポンサー枠のチケットを使わせていただいた。
+ 2022-04-09 から 2022-04-11 にかけて開催された、PHPerKaigi 2022 に、 一般参加者として参加した。 弊社デジタルサーカス株式会社はダイヤモンドスポンサーとなっており、 スポンサー枠のチケットを使わせていただいた。
@@ -75,7 +75,7 @@
- 多くの素晴らしいトークの中から、特におすすめのものを 5つ選んだ。是非聞いてほしい。引用部分は、リンク先プロポーザルから引用している。
+ 多くの素晴らしいトークの中から、特におすすめのものを 5つ選んだ。 是非聞いてほしい。引用部分は、リンク先プロポーザルから引用している。
@@ -178,7 +178,7 @@
- 今回は、PHPer チャレンジ用に弊社のトークン問題を 3題作成した。こちらについては別途記事にしているので、そちらを参照されたい。
+ 今回は、PHPer チャレンジ用に弊社のトークン問題を 3題作成した。 こちらについては別途記事にしているので、そちらを参照されたい。
- 1つ個人的な反省点としては、(中略) Discord しかりアンカンファレンスしかり「このイベントのこの瞬間にしかないコンテンツ」に触れずに、後から見返せる発表やスライドに注力してしまった、ということだ。発表の詳細な見直しはあとからできるのだから、今しかできないことを考えるべきだった。
+ 1つ個人的な反省点としては、(中略) Discord しかりアンカンファレンスしかり「このイベントのこの瞬間にしかないコンテンツ」に触れずに、 後から見返せる発表やスライドに注力してしまった、ということだ。 発表の詳細な見直しはあとからできるのだから、今しかできないことを考えるべきだった。
この反省を踏まえ、今年は積極的にほかの場 (公式の Discord サーバや、アンカンファレンス) にも参加した。
- なお、アンカンファレンスについては、1日目の終わりにhttps://fortee.jp/phperkaigi-2022/unconference/view/d332797a-8921-4706-a7e2-ee72640c9b5e[トークン問題の解説放送]もおこなった。
+ なお、アンカンファレンスについては、1日目の終わりにトークン問題の解説放送もおこなった。
diff --git a/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html b/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html
index 6aa732d..74e00f5 100644
--- a/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html
+++ b/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html
@@ -69,11 +69,15 @@
カンファレンスには参加できなかったものの、懇親会の LT で出題されたコードゴルフの問題が Twitter に流れてきたので、解いてみた。
- ツイート: https://twitter.com/m3m0r7/status/1563397620231712772
-
- 割と多くの言語のゴルフで使えるテクニック。
-
- PHP では、
- ただし、プログラムに 0 が渡されるとループを一度も回らないので、
@@ -167,7 +171,7 @@
- PHP では、
- 最後になりましたが、https://twitter.com/m3m0r7[めもりー] さん、楽しい問題をありがとうございました。
+ 最後になりましたが、めもりーさん、楽しい問題をありがとうございました。
- 結局これを通したい (私の中での) 最大の理由が、「自分の勤める会社が、これをやる会社であってほしい」というのがあり、↑にしても、感情ベースの理由しか出せていないというのが説得力に欠けている理由なのだと思いますが、寄付の報告が流れてきたり、OSS のフリーライドの話が流れてきたりするたびに、自尊心が毀損される、というか (これは大袈裟すぎる表現で、実際にはそこまで明確に傷ついているわけではありませんが)。
+ 結局これを通したい (私の中での) 最大の理由が、「自分の勤める会社が、これをやる会社であってほしい」というのがあり、 ↑にしても、感情ベースの理由しか出せていないというのが説得力に欠けている理由なのだと思いますが、 寄付の報告が流れてきたり、OSS のフリーライドの話が流れてきたりするたびに、自尊心が毀損される、というか (これは大袈裟すぎる表現で、実際にはそこまで明確に傷ついているわけではありませんが)。
@@ -91,7 +92,7 @@
- OSS を金銭的に支援したり、技術カンファレンスへ協賛したり (あるいは CTO がカンファレンスを年2で主催したり: iOSDC PHPerKaigi) といった行為は、コミュニティへの貢献であると同時に、社員に対する精神的福利厚生でもあると言えるでしょう (知らんけど)。これらは、技術や技術者を大切にする組織である、ということの、対外的にも対内的にも強力なメッセージなのです。
+ OSS を金銭的に支援したり、技術カンファレンスへ協賛したり (あるいは CTO がカンファレンスを年2で主催したり: iOSDC PHPerKaigi) といった行為は、コミュニティへの貢献であると同時に、社員に対する精神的福利厚生でもあると言えるでしょう (知らんけど)。 これらは、技術や技術者を大切にする組織である、ということの、対外的にも対内的にも強力なメッセージなのです。
@@ -102,7 +103,7 @@
- 最終的に社としての寄付まで漕ぎ着けられたのは、もちろん私の力ではなく役員の方々の決定によるものです。この場を借りて感謝申し上げます。
+ 最終的に社としての寄付まで漕ぎ着けられたのは、もちろん私の力ではなく役員の方々の決定によるものです。 この場を借りて感謝申し上げます。
- この記事は、普通の fizzbuzz を徐々に変形して最終形にしていく、という構成で書かれている。最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、 このページ にソースコードがあるので、そちらを先に見てほしい。
+ この記事は、普通の fizzbuzz を徐々に変形して最終形にしていく、という構成で書かれている。 最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、 このページ にソースコードがあるので、そちらを先に見てほしい。
- 備考: PHP には
- さて、PHP ではそもそもバックスラッシュを行継続に使うことができない。これにより、「3文字以上からなるトークンが一切使えない」という制約が課される。例えば、
@@ -242,7 +242,7 @@ c\
- また、2文字だと文字列がまともに書けないのも辛い。
-
-
-
- これで関数を呼び出している所は短くなった。では、
- というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という PHP 7.x までの仕様が利用できる。例えば、
- こうして簡単に文字列を作れる。なお、この仕様は 7.x 時点でも警告を受けるので、はじめに
厳選おすすめトーク
トークン問題の作成
まあ初カンファレンスだし、とお茶を濁しておこう。
- これにより、参加体験の質がはるかに向上した。特に Discord に関しては、登壇者ご本人による補足や、質問への回答などがおこなわれる (ことが多い) ため、特別な理由のない限り、発言はしないまでも参加はしておいたほうが良いと思われる。
+ これにより、参加体験の質がはるかに向上した。特に Discord に関しては、登壇者ご本人による補足や、 質問への回答などがおこなわれる (ことが多い) ため、特別な理由のない限り、発言はしないまでも参加はしておいたほうが良いと思われる。
- スライド: https://speakerdeck.com/memory1994/php-conference-okinawa-2022-extra?slide=3
- 指数表記
e を用いた指数表記で、大きな数を短く表す。このコードでは 10000、5000、2000、1000 を指数表記している。
+ 割と多くの言語のゴルフで使えるテクニック。 e を用いた指数表記で、大きな数を短く表す。 このコードでは 10000、5000、2000、1000 を指数表記している。
foreach や for の中身を1つの文に
foreach、for、if などの後ろには、通常 { を続けて複数の文を連ねるが、中身の文を1つにしてしまえば、{ と } を省略できる。C言語などでも使える。
+ foreach、for、if などの後ろには、 通常 { を続けて複数の文を連ねるが、中身の文を1つにしてしまえば、{ と } を省略できる。 C言語などでも使える。
$r に初期値を入れない
$r[] = …​ のような配列の末尾に追加する式を実行したとき、$r が未定義だった場合は $r を勝手に定義して空の配列で初期化してくれる。これを利用すると、$r = []; のような初期化が不要になる。
+ PHP では、$r[] = ...... のような配列の末尾に追加する式を実行したとき、 $r が未定義だった場合は $r を勝手に定義して空の配列で初期化してくれる。 これを利用すると、$r = []; のような初期化が不要になる。
$r が未定義になってしまい、implode() に渡すところでエラーになる。それを防ぐために $r ?? [] を使っている。
+ ただし、プログラムに 0 が渡されるとループを一度も回らないので、$r が未定義になってしまい、 implode() に渡すところでエラーになる。 それを防ぐために $r ?? [] を使っている。
PHP タグの外に文字列を置く
<?php ?> で囲われた部分の外側にある文字列は、そのまま出力される。今回のケースでは、先頭と末尾に必ず [ と ] を出力するので、そのまま書いてやればよい。
+ PHP では、<?php ?> で囲われた部分の外側にある文字列は、そのまま出力される。 今回のケースでは、先頭と末尾に必ず [ と ] を出力するので、そのまま書いてやればよい。
おわりに
おわりに
記事の構成について
<?php タグは除く)
@@ -106,7 +106,7 @@
<?php タグ以降のソースコードが、2 byte ごとに ラインフィード (LF) で区切られること
+ 厳密な定義: <?php タグ以降のソースコードが、2 byte ごとにラインフィード (LF) で区切られること
short_open_tag というオプションがあり、これを有効にするとファイル冒頭の <?php の代わりに <? を使うことができ、文字どおり1行2文字で書ける。ただ、このオプションはデフォルト off になっている環境が多いようなので、今回は使わないことにした。
+ 備考: PHP には short_open_tag というオプションがあり、 これを有効にするとファイル冒頭の <?php の代わりに <? を使うことができ、文字どおり1行2文字で書ける。 ただ、このオプションはデフォルト off になっている環境が多いようなので、今回は使わないことにした。
echo で出力することや、for でループすること、new でインスタンスを生成することができない。特に、出力は fizzbuzz をどんなアルゴリズムで実装しようとおこなわなければならないので、できないのは致命的である。
+ さて、PHP ではそもそもバックスラッシュを行継続に使うことができない。 これにより、「3文字以上からなるトークンが一切使えない」という制約が課される。 例えば、echo で出力することや、for でループすること、 new でインスタンスを生成することができない。 特に、出力は fizzbuzz をどんなアルゴリズムで実装しようとおこなわなければならないので、できないのは致命的である。
'' だけで 2文字使うので、「1文字の文字列リテラル」というものを書くことができない。PHP では文字列リテラル中に生の改行が書けるので
+ また、2文字だと文字列がまともに書けないのも辛い。'' だけで2文字使うので、 「1文字の文字列リテラル」というものを書くことができない。PHP では文字列リテラル中に生の改行が書けるので
$a
@@ -281,7 +281,7 @@ a'
for の排除for は、3文字もある長いキーワードである。こんなものは使えない。array_ 系の関数を使って、適当に置き換えるとしよう。
+ for は、3文字もある長いキーワードである。 こんなものは使えない。array_ 系の関数を使って、適当に置き換えるとしよう。
<?php
@@ -294,14 +294,14 @@ fn($i) =>
);array_walk や range、printf といった for よりも長いトークンが現れてしまったが、これは次節で直すことにする。なお、echo は文 (statement) であり式 (expression) ではないので、式である printf に置き換えた。
+ array_walk や range、printf といった for よりも長いトークンが現れてしまったが、これは次節で直すことにする。 なお、echo は文 (statement) であり式 (expression) ではないので、式である printf に置き換えた。
関数呼び出しの短縮
range、array_walk、printf は長すぎるのでどうにかせねばならない。ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。
+ range、array_walk、printf は長すぎるのでどうにかせねばならない。 ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。
<?php
@@ -318,7 +318,7 @@ fn($i) =>
);$r や $w や $p、また 'Fizz' や 'Buzz' はどうやって 1行2文字に収めるのか。次のテクニックへ移ろう。
+ これで関数を呼び出している所は短くなった。 では、$r や $w や $p、 また 'Fizz' や 'Buzz' はどうやって 1 行 2 文字に収めるのか。 次のテクニックへ移ろう。
Fizz という文字列が欲しければ、次のようにする。
+ というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という PHP 7.x までの仕様が利用できる。 例えば、 Fizz という文字列が欲しければ、次のようにする。
$f
@@ -348,7 +348,7 @@ fn($i) =>
;;@ 演算子を使って抑制してやるとよい。
+ こうして簡単に文字列を作れる。 なお、この仕様は 7.x 時点でも警告を受けるので、@ 演算子を使って抑制してやるとよい。
$f
@@ -373,7 +373,7 @@ F.
- ずばり、文字列同士のビット演算を使う。PHP では、文字列同士でビット演算 (&、|、^) をした場合、文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。
+ ずばり、文字列同士のビット演算を使う。 PHP では、文字列同士でビット演算 (&、|、^) をした場合、 文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。
$a = "12345";
@@ -398,7 +398,7 @@ F.
echo "$r\n";
- 実行すると、range が表示される。さて、PHP では文字列リテラル中に生の改行を直接書いてもよいのだった (「主な障害」の節を参照のこと)。書きかえてみよう。
+ 実行すると、range が表示される。 さて、PHP では文字列リテラル中に生の改行を直接書いてもよいのだった (「主な障害」の節を参照のこと)。 書きかえてみよう。
$x
@@ -438,11 +438,11 @@ o'
echo "$r\n";
- 1行あたり2文字で、range という文字列を生成することに成功した。他の必要な文字列にも、同様の処理をほどこす。
+ 1行あたり2文字で、range という文字列を生成することに成功した。 他の必要な文字列にも、同様の処理をほどこす。
- 備考: Buzz 中にある小文字の u は、このロジックだと non-printable な文字になってしまう。ここまでのテクニックを駆使すれば回避するのはそう難しくないので、考えてみてほしい。
+ 備考: Buzz 中にある小文字の u は、このロジックだと non-printable な文字になってしまう。 ここまでのテクニックを駆使すれば回避するのはそう難しくないので、考えてみてほしい。
- PHP は、スクリプト言語の中だとシンタックスシュガーが少ない (体感)。この挑戦は不可能に思われたが、PHP マニュアルとにらめっこしていたらなんとかなった。 + PHP は、スクリプト言語の中だとシンタックスシュガーが少ない (体感)。 この挑戦は不可能に思われたが、PHP マニュアルとにらめっこしていたらなんとかなった。
@@ -618,7 +618,7 @@ _!
- PHP では、バッククォートを使ってシェルを呼び出せる。これは
- なお、ここでは簡単のため出力に
@@ -697,7 +697,7 @@ ${
'}
- は変数で、中にはスペースとエスケープが入っている (
- これは、前掲したコマンドと同じだ。かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。Fizzbuzz のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう (試してないけど)。
+ これは、前掲したコマンドと同じだ。 かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。 Fizzbuzz のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう (試してないけど)。
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 e6d48a1..34ca597 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
@@ -59,7 +59,7 @@
- 2023 年 3 月 23 日から 25 日にかけて開催予定 (記事執筆時点) の、 PHPerKaigi 2023 において、昨年と同様に、弊社 デジタルサーカス株式会社 から、トークン問題を出題予定である。
+ 2023 年 3 月 23 日から 25 日にかけて開催予定 (記事執筆時点) の、 PHPerKaigi 2023 において、 昨年と同様に、弊社 デジタルサーカス株式会社 から、 トークン問題を出題予定である。
@@ -67,7 +67,7 @@
- すでに 2023 年用の問題は作成済みであるが、その制作過程の中でいくつかボツ問ができた。せっかくなので、PHPerKaigi 開催を待つ間に紹介しようと思う。
+ すでに 2023 年用の問題は作成済みであるが、その制作過程の中でいくつかボツ問ができた。 せっかくなので、PHPerKaigi 開催を待つ間に紹介しようと思う。
@@ -107,7 +107,7 @@ $π = trim($π);
- ソースを見るとわかるとおり、
-
- 例えば、
- 正規表現でマッチングしている。
- なお、
- 最初は真面目に円周率の計算プログラムを組んでいたのだが、いざ動かしてみるとやけに浅いところにあったので驚いた (ちなみに、それでも
-
- 管理者ユーザで作業すると危ないので、メインで使うユーザを作成する。
- 今の SSH セッションは閉じずに、ターミナルを別途開いて疎通確認する。セッションを閉じてしまうと、SSH の設定に不備があった場合に締め出しをくらう。
+ 今の SSH セッションは閉じずに、ターミナルを別途開いて疎通確認する。 セッションを閉じてしまうと、SSH の設定に不備があった場合に締め出しをくらう。
- (業務でなく) 個人だと数年ぶりのサーバセットアップで、これだけでも割と時間を食ってしまった。とはいえ式年遷宮は楽しいので、これからも定期的にやっていきたい。コンテナデプロイにしたい気持ちもあるのだが、色々実験したい関係上、本物のサーバも欲しくはある。次の式年遷宮では、手順の一部だけでも自動化したいところ。
+ (業務でなく) 個人だと数年ぶりのサーバセットアップで、これだけでも割と時間を食ってしまった。 とはいえ式年遷宮は楽しいので、これからも定期的にやっていきたい。 コンテナデプロイにしたい気持ちもあるのだが、色々実験したい関係上、本物のサーバも欲しくはある。 次の式年遷宮では、手順の一部だけでも自動化したいところ。
- 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。
+ 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。 本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。
余談2: 別解
shell_exec 関数と等価である。さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。
+ PHP では、バッククォートを使ってシェルを呼び出せる。 これは shell_exec 関数と等価である。 さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。
<?php
@@ -635,7 +635,7 @@ o\
`);printf をそのまま使っているが、実際には printf という文字列を合成して可変関数で呼び出す。
+ なお、ここでは簡単のため出力に printf をそのまま使っているが、 実際には printf という文字列を合成して可変関数で呼び出す。
chr(32) . chr(92))。シェルに渡されている文字列は次のようになる。
+ は変数で、中にはスペースとエスケープが入っている (chr(32) . chr(92))。 シェルに渡されている文字列は次のようになる。
e\
@@ -710,7 +710,7 @@ o\
3\はじめに
トークン入手方法
$argv[1] を参照している。それを $π なる変数に代入しているので、円周率を渡してみる。
+ ソースを見るとわかるとおり、$argv[1] を参照している。 それを $π なる変数に代入しているので、円周率を渡してみる。
$ php Q.php 3.14
@@ -158,11 +158,11 @@ $π = trim($π);
$s = implode(array_map(chr(...), str_split($π, 2)));$π を 2 文字ごとに区切り (str_split)、数値を ASCII コードと見做して文字に変換 (chr) して結合 (implode) している。
+ $π を 2 文字ごとに区切り (str_split)、 数値を ASCII コードと見做して文字に変換 (chr) して結合 (implode) している。
$π が '656667' だったとすると、65、66、67 に対応した 'A'、'B'、'C' へと変換され、'ABC' になる。
+ 例えば、$π が '656667' だったとすると、 65、66、67 に対応した 'A'、'B'、'C' へと変換され、'ABC' になる。
$π = '656667';
@@ -174,11 +174,11 @@ $π = trim($π);
$t = $m[1] ?? '';\x23 は # と同じであることに留意すると、この正規表現は「# から始まる 2 以上の長さ (含 #) の文字列で、最初に現れるスペースまで」にマッチする。つまりこれは、PHPerKaigi におけるトークンである。
+ 正規表現でマッチングしている。\x23 は # と同じであることに留意すると、 この正規表現は「# から始まる 2 以上の長さ (含 #) の文字列で、 最初に現れるスペースまで」にマッチする。つまりこれは、PHPerKaigi におけるトークンである。
# を直接書いていないのは、/#.+?) / と書くと、#.+?) という意図せぬトークンが登録されてしまうからである。
+ なお、# を直接書いていないのは、/#.+?) / と書くと、 #.+?) という意図せぬトークンが登録されてしまうからである。
if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
@@ -199,7 +199,7 @@ $π = trim($π);
M_PI や pi() では精度が足りない)。見つけたときは狂喜したものの、冷静になってみると大して面白くなかったのでボツになった。むしろ、100 万桁目くらいに埋まっていてくれたほうがよかったかもしれない。
+ 最初は真面目に円周率の計算プログラムを組んでいたのだが、いざ動かしてみるとやけに浅いところにあったので驚いた (ちなみに、それでも M_PI や pi() では精度が足りない)。 見つけたときは狂喜したものの、冷静になってみると大して面白くなかったのでボツになった。 むしろ、100 万桁目くらいに埋まっていてくれたほうがよかったかもしれない。
teika.key はローカルからサーバへの接続用、github2teika.key は、GitHub Actions からサーバへのデプロイ用。
+ teika.key はローカルからサーバへの接続用、github2teika.key は、 GitHub Actions からサーバへのデプロイ用。
ユーザを作成する
sudo グループに追加して sudo できるようにし、su で切り替え。
+ 管理者ユーザで作業すると危ないので、メインで使うユーザを作成する。 sudo グループに追加して sudo できるようにし、su で切り替え。
$ sudo adduser **********
@@ -179,7 +179,7 @@ $ sudo systemctl status sshdSSH で接続確認
@@ -297,7 +297,7 @@ $ make setup
$ ssh teika感想