PHPerKaigi 2022に参加していろいろわからないことがあったので調べたりして

今年は4/9(土)夜~11(月)という楽しい日程だった。土曜日は前夜祭で夜からとはいえ、1日目・2日目は割と朝から晩までずっとセッションが続くパワフルな展開で、見てるだけなのになかなか大変だった。実際仕事の日よりつかれた。

そのせいで普段なら全時間帯どれかのセッションを見るところ、今回は所々休憩入れつつ見た。のであまりツイートもしてないと思ったのだが、それでもツイート数二位とのことで景品をいただいたり。

Discordもいいけど、みんなもっとツイートしよう。

さて本題、見たセッションの簡単な感想と、わからなくて調べたこと

今年はツイートも(自分の気分的には)だいぶ少なく、後から振り返ってもどういう感想を抱いたか忘れてたりもするので、感想はいつもよりさらに簡単めに、で、セッション聞いててわからなくて調べたことなんかがあるところでは、それを書いていくスタイルにしてみる。

見たセッションぜんぶではないです。

Datadog APM で始める Laravel アプリケーションのパフォーマンスチューニング

スライドはこちら

LaravelでEloquentのアクセサ内でリレーションからデータ引いてクエリ実行しちゃったりするとN+1問題起きやすかったりするけど、開発中に気付けなかったときにどうするか、そこでDatadog APMでアプリケーションパフォーマンス監視です、みたいな話。

Datadog APMの紹介に終わらずそれを使ってどういうフローで対応していくか、みたいなところも抑えられていてよかった。

なおこんなことを呟いていたが、よく考えると俺もアクセサでリレーションにアクセスしてたわ。とはいえ、hasXxx()的なのをアクセサにはしない。そこはメソッドじゃないと。

ちなみに今確認してて気付いたんだけど、Laravelのアクセサ、9からメソッド名ベースじゃなくなってたし、protectedで書く形になってた。まあpublicの意味がないのは元々だけど。

Eloquent:ミューテタ/キャスト 9.x Laravel

予防に勝る防御なし - 堅牢なコードを導く様々な設計のヒント

スライドはこちらから

わざわざ語るまでもないいい話なんだが一点だけ気になってて、findAll()DateTimeRangeを直接使うんじゃなくて、開始・終了のどちらがinclusiveでexclusiveかを持った派生型を作ってそれを受け取る形の方がぜったいわかりやすいと思うんだがどうだろう。

PHPとGraphQL

スライドはこちら

興味はあるけどなかなか使う機会がなくてよくわからないGraphQLの話。俺はそんなのばっかり。今まで特にピンと来なかったのは、サーバサイドでどうするかなんだけど、このセッションではそっちの視点からの説明もあってとても「わかった」感じになった。

サーバサイドは、REST APIでやるよりちょっと面倒そう。そこをショートカットできるあれこれもあるみたいだけど、銀の弾丸がある感じではなさそうなので、やっぱりトレードオフなのかなと。どういう場合にGraphQLにメリットが大きいか、みたいなところの話もあって、いい話だった。

また、この話に出てきた"Relay"というのがわからなかったので調べたが、これはクライアントサイドのGraphQLライブラリらしい。Apolloはよく聞くけど、同じ系統のもののようだ。こんなこと呟いてたけどアーキテクチャ関係なさそう。

BASE大規模リアーキテクチャリング モジュラモノリスを中心に据えた中長期的なアーキテクチャ戦略について

スライドはこちらから

話にも勢いがあったいい話だった。感想書くほど詳しくないので割愛。スライド内によさげな本がいくつも出てきて、こういうのは好き。とりあえず「LeanとDevOpsの科学」が気になる。

【視聴者参加型】PHP この記号はなんでしょう?【高速 LT クイズ】

スライドはこちらから

感想というかなんというか。後半のネタ問題を除いた5問中、2問しか解けなかった……。PHPバージョンと累乗はさすがにわかったんだけど、ほかは。もうちょっと時間かければ行けたと思うんだけど。

CakePHP Fixture Factories の登場によって変化する、PHPプロジェクトにおけるテストフィクスチャ管理の選択肢

スライドはこちらから

2日目はもう頭が回ってなかった。このセッションは、前半はテストのフィクスチャの概要の話、後半はCakePHP用のLaravelのファクトリみたいなのの話だったんだけど、前半でいろいろ混乱してしまった。

Fresh FixtureとShared Fixtureというパターンがあるようなのだが、いまいち後者のイメージが湧かない。その前に話に出ていたInline Setup, Delegated Setup, Implicit Setupがそれぞれテストメソッド内で直接必要なクラスのコンストラクタを呼び出すことで、専用の作成メソッド経由で呼び出すことで、setUp()から暗黙的に呼び出すことで、いずれにしても「直接クラスのコンストラクタを叩いてフィクスチャを作成する」もので、それらのようなパターンがFresh Fixtureだというところをしっかり把握できていればもうちょっと理解できたと思うが、リアルタイムではできなかった。

Shared Fixtureというのは、こちらの元ネタページを読んでみればなんということはない、Fresh Fixtureがテストごとに別々のインスタンスを使うことに対して、Shared Fixtureはテストで同じインスタンスを共有する、というパターンのようだ。

Shared Fixture at XUnitPatterns.com

ということで、以下のツイートは完全な誤解であった。

カオナビでのチーム開発の舞台裏

スライドはこちらから

よいセッションだったのだがそれはともかくとして、本題とは別のところがやたら気になってしまった。チーム7、8人で1年かかる「機能」を実装する際のチーム開発の課題の話だったんだけど、その規模の「機能」ってなんなんだ、と思ってしまって。

7、8人年って、テーブル100超えみたいな規模のシステムが一からできる規模だと思うんで、大規模サービスとはいえ一つの機能でそのレベルってどういう感じなんだろう、みたいなところばかり気になった。

テストコードの DRY と DAMP

スライドはこちらから

テストコードではコードの重複に対して、プロダクションコードとは違う見方も必要だよ的な話で、とてもいいトークでした。

すごい個人的な感想(ほかもそう)で、最近関連するようなことを考えていたので。というのも、テストコードでプロダクションコードと同等のコードでフィクスチャを作成していて、それがバグっていたためにテストあったのにバグが防げない、みたいなことがあって。

そこは単純にDAMPで、変にDRYにせずに静的に書けばまあよかったんだけど、単純にそれだけじゃなくて、たとえばコードレビューするときに人が同じようなコードの共通化していたとき、どう説明して指摘すればいいかな、みたいなことをちょっといろいろ考えてて、とはいえ答えも出てないのでこの話はここまで。

来年

そろそろツイートだけじゃなくしっかり参加したいので、次はスピーカーで参加したいところ。

去年は一応セッション応募(本名名義で)はしてたんだけど落ちて、今年は応募すらできなかった。来年は応募して、受かって話すのを目標に。

TridactylでAmazonの商品ページのURLを正規化してコピーする

2022-05-04追記。JavaScriptコード修正した。location.hrefやめてdocument.querySelector('link[rel=canonical]').hrefから取るように。


js で自由にJavaScriptを書ける。その結果を composite して、 yank につなげる。それを bindurlキーバインド設定すればいい。

bindurl https://www.amazon.co.jp/ ya composite js (m = document.querySelector('link[rel=canonical]').href.match(/^(https:\/\/[^/]+).*(\/dp\/\w+)/)) && m[1] + m[2] | yank

これで、Amazon.co.jpya でコピーできる。正規表現は雑なので各自調整してください。

こういうことを手軽にできるのがTridactylのいいところ。

VirtualBoxでVM起動時に「The VM session was closed before any attempt to power it on.」というエラーメッセージが出た場合

仮想マシン"..."のセッションを開けませんでした。

The VM session was closed before any attempt to power it on.

終了コード : E_FAIL (0x80004005)
コンポーネント: SessionMachine
インターフェース: ISession {c0447716-ff5a-4795-b57a-ecd5fffa18a4}

こんな感じのエラーの場合、おそらく原因は一つではないが、一つの可能性として、既存の別のVirtualBoxのプロセスが終了しきっておらず、VMのファイルを掴んでいる、という場合があるようだ。

その場合既存のVirtualBoxのプロセスを強制終了するなどで、VMを起動させられるかもしれない。

今回はVagrantで何度か再起動などしている最中に発生した。

ちなみに、「仮想マシン"..."のセッションを開けませんでした。」や終了コードのE_FAIL (0x80004005)は汎用的なメッセージのようで、これで検索しても見当違いの情報しか見当たらない。まあ、The VM ...でも大差なかったが。

Tridactylとか使ってて、フォーカス当たると要素内でスクロールしてしまい困る場合

overflow: hiddenなのが原因なので、Stylusなど使って、overflow: clipにしてしまおう。

hidden

(中略)内容はプログラム的に (例えば、 offsetLeft のようなプロパティの値を設定する方法などで) スクロールすることができます(中略)

clip

(中略)clip と hidden の違いは、 clip キーワードがプログラム的なスクロールも含め、すべてのスクロールを禁止することです。

overflow - CSS: カスケーディングスタイルシート | MDN

という感じで、Tridactylのjkのスクロールがプログラム的だからスクロールしちゃう、ということらしい。

たとえばDuckDuckGoの検索結果のタイトルなんかは、以下のような感じで対処できる。

.result__title,
.result__a {
    overflow: clip;
}

まあそもそもoverflow: hidden使ってる個所の99%は、overflow: clipにするべきっぽいので、世のデザイナさんなんとかしてください。まあ、最近増えた値っぽいが。

PHPカンファレンス2021のMySQL関係のセッション2つがめちゃくちゃよかった

2021-10-09追記。「MySQLとインデックスとPHPer」のスライドのリンク間違っていました。修正済みです。


今回はいろいろ忙しいし書くつもりなかったけど、めちゃくちゃいいセッションが2つあったので、その感想だけ手短に書く。

PHPer が知るべき MySQL クエリチューニング

PHPer が知るべき MySQL クエリチューニング by まみー | トーク | PHP Conference Japan 2021 #phpcon #phpcon2021 #php - fortee.jp

アーカイブ

スライド

チューニング自体の話もあるんだけど、それだけじゃなくて、どう監視していくか、そもそもどう事前に防ぐか、みたいな話で、なんというか取り組み方がとにかくすごい。それだけでもよいセッションだったけど、最終的にクエリチューニングの話から、ユーザにつなげて行ったのがさらによかった。よくないクエリを書きそうになったとき、に限らず新しいクエリを書くとき、そもそもそのクエリはなぜ必要なのか、誰がどうして必要としているのか、その根本にまで迫って考えよう、みたいな。とにかく登壇者の方の姿勢がすごくて、感動した。単純に感動したレベルで言うと、今まで見てきたセッションの中でもいちばんかも。今スライド見直してみると、これもなかなかわかりやすくてよい。

MySQLとインデックスとPHPer -PHPが本職でもMySQLを手懐けるために-

MySQLとインデックスとPHPer -PHPが本職でもMySQLを手懐けるために- by yoku0825 | トーク | PHP Conference Japan 2021 #phpcon #phpcon2021 #php - fortee.jp

アーカイブ

スライド

前日に上述のセッションがあって、こっちは楽しめるかなとちょっと不安になったが、心配なかった。前にもこの方のセッションは見たことがあるけど、そのときもよかった。内容としては同じMySQLのチューニング周りの話、とはいっても打って変って、とにかく直接的に技術的な話。かつ、なかなか高レベルで、でもわかりやすいという。インデックスの話なんだけど、インデックスは連想配列(というかハッシュテーブル?)と考える、複合インデックスは連想配列のネストと。その上で、JOINやWHERE, ORDER BYやLIMITの処理を手続き方に置き換えて考える、というその流れを学べたのが非常によかった。さらに練習問題を、登壇者自身が解いていくその思考の流れを見ることができたのは、本当に貴重な体験だった。

このセッションはスライドだけじゃなく、動画で見て! わかってる人が、どういう順番でクエリを見ていくのか、という視点の流れを再現してくれててめっちゃ勉強になるから。


もちろん、ほかにもよいセッションはいろいろあった。

SymfonyとDoctrineで簡単クリーンアーキテクチャ 〜プロトタイピングにこそクリーンなTDDが活きた話〜 by 角田 一平, たなかひさてる | トーク | PHP Conference Japan 2021 #phpcon #phpcon2021 #php - fortee.jp

このセッションの最後の、クリーンアーキテクチャアーキテクチャではなくてメタアーキテクチャだという話はとても興味深かったし、

PHPで書いて覚える非同期処理 by Ryo Tomidokoro | トーク | PHP Conference Japan 2021 #phpcon #phpcon2021 #php - fortee.jp

これまたわかりやすく、面白い話だった。

三井住友銀行SMBCダイレクトに最近ログインできなくなった場合

エラーコード:PC-CECEE04-09000-E
ただいまお取り扱いできません。恐れ入りますが、しばらくお待ちになってからアクセスしてください。

というエラーが出た場合、おそらくブラウザに保存してあるSMBCダイレクトのアカウント情報を削除すればログインできる。

追記: パスワードマネージャ系の自動入力でログインできない場合もある模様

原因としては同様に、埋めちゃいけないところを埋めてるだけだと思うので、自動入力の方法を修正するとかで行けるかと。

技術的な解説

7/5にリニューアルしたらしいが、その関係か、ログインフォームのコントロールのnameが変わった。

だけであれば、保存しているユーザ名が使えないだけで済むのだが、なんと、

  1. 既存のコントロールと同じnameの隠しコントロールがHTML内に残っている。
  2. ブラウザによって1の隠しコントロールに値が埋め込まれてPOSTされた場合に、上記のエラーになる。

という面白仕様になってしまったようだ。

このため、ブラウザにパスワード以外のアカウント情報も保存している場合にログインできなくなっていると思われる。

各メーカーの無線LANルータのサポート期間を調べてみた(が、あまりわからなかった)

エレコムの無線LANルータの脆弱性の件で、発売から3年半ちょいのルータのサポートが切れているのを見て驚いたので、各メーカーのサポート期間についてちょっと調べてみた。

関連: 無線LANルーターなどネットワーク製品の一部における脆弱性に関して - 最新情報 - セキュリティ情報|ELECOM

すでに調べている人はいるもので、INTERNET Watchに以下のような情報が。

Wi-Fiルーターのサポート期間っていつまで? 国内メーカー4社に聞いてみた - INTERNET Watch

弊社では完売から7年が経過した製品を「サポート終了」と定義しています。基本的にサポート終了となった製品には対策版ファームウェアを提供することはありません。

アイ・オー・データNEC, エレコムバッファローと国内の有名所は抑えているのでこれ見るだけでいいかと思いきや、ちゃんとサポート期間を答えていたのはNECだけだったので、追加で軽く調べてみた。

アイ・オー・データJVNをざっと調べた感じ、ファームウェアアップデートが提供されず、使わないでくださいとなっていた場合がなかったので割愛。

バッファローは、今年(2021年)4月に見つかった脆弱性のある機種がすべてサポート終了になっていた。だがここにリストアップされている無線LANルータはすべて発売から15年以上経っているものだった。

【更新】ルーター等の一部商品におけるデバッグオプションの脆弱性とその対処方法 | バッファロー

15年以上は厳しいようだが、それなりの期間のアップデートを期待できそうではある。じっさい、昔使っていたルータは、今確認してみたら発売から10年以上経過しているのに、今年ファームウェアのアップデートがされていた。

次替えるときは10年期待できるかもしれないバッファロー、7年ほぼ確実に期待できるNECを選ぶつもり。