[{"data":1,"prerenderedAt":307},["ShallowReactive",2],{"$ft6jtkd6xhw3c":3,"$febu4g7ey84yb":264},{"featured":4,"latest":129,"categories":228},[5,15,23,33,43,53,63,71,81,91,101,109,120],{"slug":6,"title":7,"date":8,"excerpt":9,"image":10,"categories":11},"comparison-of-javascript-date-libraries","JavaScriptの日時ライブラリを比較してみた","2021-07-28T22:39:19","ネイティブJavaScriptで日時を取り扱う場合、ビルトインされているDateオブジェクトを使うことになるのだが、このDateオブジェクトは取り扱いにクセが多く、直感的に日時を操作できない点でも有名である。そこで、専…",null,[12],{"slug":13,"name":14},"development","開発関連",{"slug":16,"title":17,"date":18,"excerpt":19,"image":20,"categories":21},"monster-hunter-rise-skill-simulator","モンハンライズのスキルシミュレータを作ってみた！","2021-06-28T20:24:52","コラムで連載していたNintendo Switch版『モンスターハンターライズ』のスキルシミュレータ開発がやっと一段落して一通り完了した。いやぁ、記事書きながら同時並行で開発すると思っていた以上に時間がかかるもんだなぁ…","\u002Fassets\u002Fuploads\u002F2021\u002F06\u002Fmhrss_v100.png",[22],{"slug":13,"name":14},{"slug":24,"title":25,"date":26,"excerpt":27,"image":28,"categories":29},"tastewp","無料でWordPressサイトを複数作成できるWEBサービス「TasteWP」","2021-03-25T20:21:59","私が日本語翻訳に協力しているWEBサービス「TasteWP」について紹介しようと思う。 https:\u002F\u002Ftastewp.com このサービス、サインアップすることなく無料で自分用のWordPressサイトを作れるとい…","\u002Fassets\u002Fuploads\u002F2021\u002F03\u002FTasteWP_screenshot.png",[30],{"slug":31,"name":32},"wordpress","WordPress関連",{"slug":34,"title":35,"date":36,"excerpt":37,"image":38,"categories":39},"wp-ignitor-plugin-to-conceal-wordpress-site","WordPressサイトを秘匿化するプラグイン「WP Ignitor」","2021-01-19T15:28:21","以前「WordPressサイトを徹底的に秘匿化する」という記事で、WordPress建てのサイトを秘匿化する方法を取り上げたのだが、あれをサイト構築時に毎度実施するとなるととても労力が必要であった。そこで、もっとお手軽…","\u002Fassets\u002Fuploads\u002F2021\u002F01\u002Fbanner-1554x500-1.png",[40],{"slug":41,"name":42},"wp-ignitor","WPイグナイタ",{"slug":44,"title":45,"date":46,"excerpt":47,"image":48,"categories":49},"manual-about-svg-japan","インタラクティブな日本地図を生成するJSプラグイン「SVG Japan」","2020-11-16T21:19:58","各都道府県をそれぞれ選択・クリック可能なインタラクティブな日本地図を生成するネイティブJavaScript建てのプラグイン「SVG Japan」を作ったので、その紹介と使い方をまとめておく。ちなみにソースコードはgit…","\u002Fassets\u002Fuploads\u002F2020\u002F11\u002Fsvg-japan.png",[50],{"slug":51,"name":52},"svg-japan","SVG Japan",{"slug":54,"title":55,"date":56,"excerpt":57,"image":58,"categories":59},"what-is-forkor","Made a shortened URL app called Forkor","2020-07-07T22:27:01","What’s Forkor? Forkor is a service that provides a shortened URL feature that allows you to redirect any…","\u002Fassets\u002Fuploads\u002F2020\u002F07\u002Fforkor.png",[60],{"slug":61,"name":62},"forkor","Forkor",{"slug":64,"title":65,"date":66,"excerpt":67,"image":68,"categories":69},"challenge-to-conceal-the-wordpress-site","WordPressサイトを徹底的に秘匿化する","2020-02-02T23:59:58","私は自分の個人サイトをはじめ、仕事でもWordPressサイトを運用している。WordPressは気軽にサイトを立ち上げられてカスタマイズも簡単な、素晴らしいオープンソースなのだが、世界中で使われまくっているその知名度…","\u002Fassets\u002Fuploads\u002F2020\u002F02\u002Fshutterstock_1878005929.jpg",[70],{"slug":31,"name":32},{"slug":72,"title":73,"date":74,"excerpt":75,"image":76,"categories":77},"released-the-sloth","Released the Sloth of mobile-first CSS micro framework!","2019-04-16T18:04:25","I released the “Sloth” that is mobile-first CSS micro framework. I have long used frontend framewo…","\u002Fassets\u002Fuploads\u002F2019\u002F04\u002Fsloth_doc_head.png",[78],{"slug":79,"name":80},"sloth","Sloth",{"slug":82,"title":83,"date":84,"excerpt":85,"image":86,"categories":87},"jquery-timeline","jQuery.Timeline version2 – full documentation","2019-03-04T20:40:48","Plugin Overview The jQuery.Timeline plugin provides you two types of the horizontal timeline. You can create a…","\u002Fassets\u002Fuploads\u002F2019\u002F03\u002Fjquery.timeline_v2.jpg",[88],{"slug":89,"name":90},"jqtl","jQuery.Timeline",{"slug":92,"title":93,"date":94,"excerpt":95,"image":10,"categories":96},"optimize-browser-cache-of-static-resources","更新されたJS、CSS、画像のみブラウザキャッシュを破棄して読み込ませる","2018-01-31T15:47:47","WEBサービスの保守や開発をやっていると、JavaScriptやスタイルシート、画像などの静的リソースを更新した際、しばしば「確認したけど、更新されてないよ」とか云われて、「ブラウザのキャッシュを消してからもう一度見て…",[97,100],{"slug":98,"name":99},"codes","コード集",{"slug":13,"name":14},{"slug":102,"title":103,"date":104,"excerpt":105,"image":106,"categories":107},"jquery-timeline-v1","2種類の横型タイムラインを簡単に作成できる「jQuery.Timeline」をリリース","2017-05-29T14:55:46","現在開発しているサービスで利用するべく、横型タイムラインを生成できるjQueryプラグインを自作したので、そこだけ単独でリリースしてみた。 ソースコード等はGitHubの方にリリースしてあるので、興味のある方は、そち…","\u002Fassets\u002Fuploads\u002F2017\u002F05\u002Fjquery_timeline_image.png",[108],{"slug":89,"name":90},{"slug":110,"title":111,"date":112,"excerpt":113,"image":114,"categories":115},"10_php_tips_for_developers","PHP開発者が心得ておくべき10の鉄則","2016-01-11T18:38:09","PHPだけに限った話ではないが、プログラミングを行うに当たって、心得て、準備しておくと失敗が劇的に減る事柄をまとめてある良い記事を見つけたので、私なりの解釈で意訳しつつ、経験則を踏まえてあらためてまとめてみた。 オリジナ…","\u002Fassets\u002Fuploads\u002F2016\u002F01\u002Feyecatch-php-10-tips.jpg",[116,119],{"slug":117,"name":118},"column","コラム",{"slug":13,"name":14},{"slug":121,"title":122,"date":123,"excerpt":124,"image":125,"categories":126},"custom-database-tables","Custom DataBase Tables","2015-11-24T02:29:34","You can create the new own table freely in the your WordPress database via this plugin. Then, you can make the management of table or (as view or entry or edit) data in a simple user interface.\\nAlso,","\u002Fassets\u002Fuploads\u002F2016\u002F02\u002Fcdbt-overview.png",[127],{"slug":128,"name":122},"cdbt",[130,138,149,161,173,183,192,200,203,206,214,221],{"slug":131,"title":132,"date":133,"excerpt":134,"image":10,"categories":135},"script-to-check-vulnerable-php-version","PHP脆弱性バージョン確認用スクリプト","2026-10-23T23:04:43","2026年10月に公表されたPHPの脆弱性「CVE-2026-109618／CVE-2026-109619（通称「php2shell」）」は、未認証のリモートコード実行につながる PHP公式がWebリクエストを処理する全…",[136,137],{"slug":98,"name":99},{"slug":13,"name":14},{"slug":139,"title":140,"date":141,"excerpt":142,"image":143,"categories":144},"pulllog_launched","ガチャ履歴を記録・分析できるWebサービス「PullLog」","2025-08-22T13:05:30","このたび、新しい個人開発サービスとして 「PullLog（プルログ）」 をリリースした。 URLはこちら https:\u002F\u002Fpulllog.net PullLogとは？ PullLogは、ソーシャルゲームのガチャ履歴を記録…","\u002Fassets\u002Fuploads\u002F2025\u002F08\u002Fpulllog_stats_jp.png",[145,148],{"slug":146,"name":147},"industries","プロダクト",{"slug":13,"name":14},{"slug":150,"title":151,"date":152,"excerpt":153,"image":154,"categories":155},"mockapi-php-openapi-schema-generation","モックAPIのレスポンスから OpenAPI 3.0 スキーマを自動生成するPHPツール","2025-04-17T09:31:52","私自身がそうなのですが、OpenAPI仕様書を毎回手作業で書いていて「面倒だな」と思ったことはありませんか？ そんな（私と）あなたにぴったりのツールがあります。 レスポンスの例さえ用意すれば、OpenAPI 3.0 スキ…","\u002Fassets\u002Fuploads\u002F2025\u002F04\u002Fswaggerui-preview.png",[156,159,160],{"slug":157,"name":158},"mockapi-php","MockAPI-PHP",{"slug":146,"name":147},{"slug":13,"name":14},{"slug":162,"title":163,"date":164,"excerpt":165,"image":166,"categories":167},"ambient_playlist_customize","Ambientでメメントモリのラメントプレイヤーを作る","2023-11-30T17:32:39","「Ambient」の最新バージョン 1.2.0で実装した「疑似フェーダー」機能を使って、ソーシャルゲーム「メメントモリ」のYouTube公式チャンネルで公開されているMVを集約したラメント専用プレイヤーを作ってみた。 ラ…","\u002Fassets\u002Fuploads\u002F2023\u002F11\u002Fambient_mememori_1.png",[168,171,172],{"slug":169,"name":170},"ambient","Ambient",{"slug":146,"name":147},{"slug":13,"name":14},{"slug":174,"title":175,"date":176,"excerpt":177,"image":178,"categories":179},"released_ambient_demo_version","Ambientメディアプレイヤーのクラウド版デモを公開","2023-11-22T13:47:36","つい先日「Ambient」の最新バージョン 1.1.0をリリースして、それに合わせてクラウド版デモサイトも公開してみた。 なお、クラウド版デモでローカルのホストコンピュータのメディアを再生するには、そのメディアファイルも…","\u002Fassets\u002Fuploads\u002F2023\u002F10\u002FAmbientMediaPlayer-typologo.png",[180,181,182],{"slug":169,"name":170},{"slug":146,"name":147},{"slug":13,"name":14},{"slug":184,"title":185,"date":186,"excerpt":187,"image":178,"categories":188},"ambient-media-player","YouTubeと自分のPC内メディアを同時に再生できるメディアプレイヤーを作ってみた","2023-10-20T00:00:25","私はよくPCで何か作業をするときには音楽を垂れ流していることが多い。 そういう時にかける曲は、手持ちのアルバムCD等からPCに取り込んだ音源だったり、さらにはYouTubeの動画だったりとメディアや再生環境がバラバラだ。…",[189,190,191],{"slug":169,"name":170},{"slug":146,"name":147},{"slug":13,"name":14},{"slug":193,"title":194,"date":195,"excerpt":196,"image":197,"categories":198},"what-is-the-sunorhc","Sunorhc is a date-time library for JavaScript","2021-08-25T22:55:55","Sunorhc is a lightweight library for handling dates and times for JavaScript. The library wraps a native JavaS…","\u002Fassets\u002Fuploads\u002F2021\u002F08\u002Fshutterstock_1091212919_resized.jpg",[199],{"slug":13,"name":14},{"slug":6,"title":7,"date":8,"excerpt":9,"image":10,"categories":201},[202],{"slug":13,"name":14},{"slug":16,"title":17,"date":18,"excerpt":19,"image":20,"categories":204},[205],{"slug":13,"name":14},{"slug":207,"title":208,"date":209,"excerpt":210,"image":211,"categories":212},"mhrise-skill-simulator-creation-chapter-12","モンスターハンターライズのスキルシミュレータを作ってみる！ 第12回","2021-06-21T13:11:46","今回は「マイセット登録」と護石データの「エクスポート／インポート」機能の追加をしていく。折り良く（悪く？）「FF7リメイク・インターグレード」や「FORTNITEシーズン7」が出たこともあって、そっちをプレイしてたらこ…","\u002Fassets\u002Fuploads\u002F2021\u002F04\u002Fb6ca09e9a7f6faf27641f62dabe64c6ff97b4f326aa478379e3c112aa28eb9ab.jpg",[213],{"slug":117,"name":118},{"slug":215,"title":216,"date":217,"excerpt":218,"image":211,"categories":219},"mhrise-skill-simulator-creation-chapter-11","モンスターハンターライズのスキルシミュレータを作ってみる！ 第11回","2021-06-07T14:52:31","さて、今回はユーザー個別データの管理部分を開発していく予定だが、まずその前にやっておくことがある。 新スキル「風雷合一」に対応する Ver.3.0の大型無料アップデートで追加された新スキルに「風雷合一」というのがある…",[220],{"slug":117,"name":118},{"slug":222,"title":223,"date":224,"excerpt":225,"image":211,"categories":226},"mhrise-skill-simulator-creation-chapter-10","モンスターハンターライズのスキルシミュレータを作ってみる！ 第10回","2021-06-02T00:29:10","今回は、護石管理画面の作成だ。この護石管理では、ユーザーごとに護石の登録を行う機能と、登録した護石を削除する機能を持つ仕様になる。この画面から登録した護石データはデータベースに格納するので、フロントエンド側からのリクエス…",[227],{"slug":117,"name":118},[229,231,233,237,239,240,241,242,243,245,248,249,251,253,255,259,262],{"slug":169,"name":170,"count":230},3,{"slug":128,"name":122,"count":232},7,{"slug":234,"name":235,"count":236},"csnp","Custom Sticky Notes",2,{"slug":61,"name":62,"count":238},1,{"slug":89,"name":90,"count":230},{"slug":157,"name":158,"count":238},{"slug":79,"name":80,"count":238},{"slug":51,"name":52,"count":238},{"slug":31,"name":32,"count":244},37,{"slug":246,"name":247,"count":238},"wpqt","WP Qiita",{"slug":41,"name":42,"count":238},{"slug":98,"name":99,"count":250},17,{"slug":117,"name":118,"count":252},29,{"slug":146,"name":147,"count":254},5,{"slug":256,"name":257,"count":258},"lifelog","ライフログ",64,{"slug":260,"name":261,"count":236},"uncategorized","未分類",{"slug":13,"name":14,"count":263},46,{"type":265,"post":266},"post",{"slug":131,"title":132,"date":133,"excerpt":134,"image":10,"categories":267,"modified":270,"html":271,"tags":272,"related":279,"prev":303,"next":10},[268,269],{"slug":98,"name":99},{"slug":13,"name":14},"2026-11-02T23:35:53","\n\u003Cp>2026年10月に公表されたPHPの脆弱性「CVE-2026-109618／CVE-2026-109619（通称「php2shell」）」は、未認証のリモートコード実行につながる \u003Ca href=\"https:\u002F\u002Fwww.php.net\u002Farchive\u002F2026.php#2026-10-21-5\">PHP公式がWebリクエストを処理する全環境に即時更新を推奨する\u003C\u002Fa> 程に影響範囲の大きい脆弱性だった。\n世の中の約70%ぐらいのWebサービスがPHPで動いているとのことで、Webサービスの運営各社が緊急メンテを実施して対応にあたる一大イベントになったが、その例に漏れず自前の零細サービスを運営している私個人も対応に追われた次第だ。\u003C\u002Fp>\n\u003Cp>ちなみに、同時にNode.jsの脆弱性も明るみになって、そっちも同時に対応することになったのだが、一挙に両方対応できたので結果的に見ればタイミングが良かったと言えなくもない。\u003C\u002Fp>\n\u003Cp>──で、今回PHPのバージョンを最新パッチ適応版である下記のバージョンに更新する必要があった。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>PHP 8.2.35\u003C\u002Fli>\n\u003Cli>PHP 8.3.36\u003C\u002Fli>\n\u003Cli>PHP 8.4.27\u003C\u002Fli>\n\u003Cli>PHP 8.5.12\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>私は自分のブログサイトの他に複数の零細Webサービスを運営していて、ステージング環境や開発環境等のサブドメインを含めると対応が必要な FQDN が10個以上ある。\n基本、Webサーバー側の PHP CLI のバージョンは FQDN をホストしているサーバーで \u003Ccode>php -v\u003C\u002Fcode> でバージョン確認すれば良く、サーバーホスティングしている環境についてはホスティング元の会社のメンテナンス後にPHPバージョンが正しく変更されているかの最終確認をするだけの手間で済んだ。\nただ、この \u003Ccode>php -v\u003C\u002Fcode> で確認できるのはサーバー側の PHP の \u003Cstrong>CLI版\u003C\u002Fstrong> のバージョンであり、\u003Cstrong>FQDNのWeb側 PHP がそのバージョンで動作している保証にはならない\u003C\u002Fstrong> のだ。\nこれを確認するには、各FQDNのドキュメントルート等に \u003Ccode>&lt;? phpinfo() ?&gt;\u003C\u002Fcode> のようなバージョンを確認できる PHP ファイルを作成して、それに直接アクセスする必要がある。しかも確認後はそのファイルを残すとそこから別の攻撃を受ける可能性が高いので、確実に削除しないといけない。確認するFQDN数が多い私にとっては非常に面倒だ。\nなので、それらを一気に自動でやってくれるシェルスクリプトを作ってみた。\u003C\u002Fp>\n\u003Cp>まず、PHPバージョンの確認を行うヘルスチェック用PHPファイル \u003Ccode>helthcheck.php\u003C\u002Fcode> を作成する。\n\u003Ccode>phpinfo()\u003C\u002Fcode> は環境変数やパスなども表示してしまい危険なため、PHPのバージョン確認に特化したファイルにしている。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">&#x3C;?\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">php\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">header\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'Content-Type: text\u002Fplain; charset=UTF-8'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">header\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'Cache-Control: no-store'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'PHP: '\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">PHP_VERSION\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'SAPI: '\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">PHP_SAPI\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>これを、サーバ側のホームディレクトリ直下の \u003Ccode>~\u002Ftest\u002Fhelthcheck.php\u003C\u002Fcode> へ配置し、同じ階層に \u003Ccode>~\u002Ftest\u002Fcheck-web-php.sh\u003C\u002Fcode> のシェルスクリプトを新規作成する（\u003Ccode>chmod a+x check-web-php.sh\u003C\u002Fcode> で実行権限を付ける）。シェルスクリプトの内容は下記の通り。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#!\u002Fusr\u002Fbin\u002Fenv bash\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">set\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -Eeuo\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> pipefail\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">umask\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 077\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># ---- 設定欄：同じ添字のFQDNとドキュメントルートが1組 ----\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">FQDNS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  'fqdn1.com'\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  'fqdn2.com'\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  'sub1.fqdn2.com'\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">DOCUMENT_ROOTS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"\u002Fvar\u002Fwww\u002Fhtml\u002Ffqdn1.com\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"\u002Fvar\u002Fwww\u002Fhtml\u002Ffqdn2.com\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$HOME\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002Fpublic_html\u002Fsub1.fqdn2.com\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 実際の公開ディレクトリへ修正する。URLは https:\u002F\u002FFQDN\u002F一時ファイル名.php。\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">PHP_SOURCE\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$HOME\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002Ftest\u002Fhelthcheck.php\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">REPORT_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$HOME\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002Ftest\u002Freports\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">EXPECTED_PHP_VERSION\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'8.4.27'\u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"> # 完全一致。版の判定が不要なら空文字にする。\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">CONNECT_TIMEOUT\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">10\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">REQUEST_TIMEOUT\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">30\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># ---- 設定欄ここまで ----\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">fail\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() { \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'ERROR: %s\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">$*\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> >&#x26;2\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">exit\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">for\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> tool \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">in\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> curl\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> mktemp\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ln\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> readlink\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> rm\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> mkdir\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> date\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> awk\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> basename\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">do\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  command\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -v\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$tool\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> >\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002Fdev\u002Fnull\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> ||\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> fail\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"必要なコマンドがありません: \u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$tool\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">done\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">[[ ${\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">#\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">FQDNS[\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">@\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">]} \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-gt\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> &#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ${\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">#\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">FQDNS[\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">@\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">]} \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-eq\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ${\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">#\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">DOCUMENT_ROOTS[\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">@\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">]} ]] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> fail\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '配列の件数を揃えてください。'\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">[[ $PHP_SOURCE \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u002F\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> &#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> -f\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $PHP_SOURCE \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">&#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> -r\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $PHP_SOURCE ]] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> fail\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"PHPファイルを読めません: \u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$PHP_SOURCE\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">for\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> i \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">in\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"${\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">FQDNS\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">@\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">]}\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">do\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  [[ ${FQDNS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=~\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ^[A-Za-z0-9]([A\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">Za\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">z0\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">9\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">]\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">[A\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">Za\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">z0\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">9\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">])\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">?\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$ ]] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> fail\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"FQDNが不正です: ${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">FQDNS\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$i\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">]}\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  [[ ${DOCUMENT_ROOTS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u002F\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> &#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> -d\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ${DOCUMENT_ROOTS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">&#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> -w\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ${DOCUMENT_ROOTS[$i]} ]] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> fail\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"公開ディレクトリを確認してください: ${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">DOCUMENT_ROOTS\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$i\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">]}\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  [[ ${DOCUMENT_ROOTS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!=\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> *\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">$'\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\t\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> &#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ${DOCUMENT_ROOTS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!=\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> *\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">$'\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ]] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> fail\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'パスにタブ・改行は指定できません。'\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">done\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">work_dir\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">active_link\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">cleanup_link\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  [[ \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-n\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $active_link ]] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> return\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  # 作成したリンクが同じ対象を指している場合だけ削除する。\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [[ \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-L\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $active_link \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">&#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $(\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">readlink\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$active_link\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$PHP_SOURCE\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ]]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">    rm\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$active_link\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> ||\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> return\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  elif\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [[ \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-e\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $active_link \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> -L\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $active_link ]]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'ERROR: 一時パスが変更されたため削除しません: %s\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$active_link\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> >&#x26;2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  active_link\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">cleanup\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  local\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">$?\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  trap\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> -\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> EXIT\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> !\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> cleanup_link\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'ERROR: 一時リンクの手動確認が必要です: %s\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$active_link\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> >&#x26;2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    result\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  [[ \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-z\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $work_dir ]] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rm\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -rf\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$work_dir\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> ||\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  exit\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$result\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">trap\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cleanup\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> EXIT\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">trap\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'exit 130'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> INT\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">trap\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'exit 143'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> TERM\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">mkdir\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -p\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$REPORT_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">report\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$(\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mktemp\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$REPORT_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002Fphp-healthcheck-$(\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">date\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -u\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> +%Y%m%dT%H%M%SZ)-XXXXXXXX.tsv\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">work_dir\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$(\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">mktemp\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -d\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">TMPDIR\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">:-\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">tmp\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}\u002Ffamie-php-healthcheck.XXXXXXXX\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">link_name\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"$(\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">basename\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$work_dir\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\").php\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '# Checked at: %s\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"$(\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">date\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -u\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> +%Y-%m-%dT%H:%M:%SZ)\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> >\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$report\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '# Expected PHP: %s (exact match; empty means no version check)\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$EXPECTED_PHP_VERSION\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> >>\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$report\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'FQDN\\tDOCUMENT_ROOT\\tHTTP\\tCURL_EXIT\\tPHP\\tSAPI\\tRESULT\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> >>\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$report\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'Report: %s\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$report\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">failed\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">for\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> i \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">in\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"${\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">FQDNS\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">@\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">]}\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">do\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  fqdn\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">${FQDNS[$i]}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  root\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">${DOCUMENT_ROOTS[$i]\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">%\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  link\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$root\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$link_name\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  # lnに-fを付けない。既存ファイル・リンクは上書きしない。\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> !\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> ln\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -sT\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$PHP_SOURCE\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$link\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '%s\\t%s\\t-\\t-\\t-\\t-\\tLINK_ERROR\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$fqdn\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$root\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> >>\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$report\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'NG %s: リンク作成失敗\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$fqdn\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    failed\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    continue\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  active_link\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$link\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  curl_exit\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  # TLS検証を有効にし、リダイレクトは追わない。Basic認証やIP制限は解除しない。\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  http\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$(\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">curl\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --silent\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --show-error\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --proto\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '=https'\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    --connect-timeout\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$CONNECT_TIMEOUT\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --max-time\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$REQUEST_TIMEOUT\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    --max-filesize\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 65536\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --header\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'Cache-Control: no-cache'\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    --output\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$work_dir\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002Fbody\"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --write-out\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '%{http_code}'\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"https:\u002F\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$fqdn\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$link_name\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> 2>\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$work_dir\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002Fcurl-error\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> curl_exit\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">$?\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  # 本文全体はレポートへ残さない。想定した最小表示だけを抽出する。\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  php\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  sapi\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [[ $curl_exit \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> &#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $http \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 200\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ]]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    php\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$(\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">awk\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '\u002F^PHP: [0-9]+\\.[0-9]+\\.[0-9]+([A-Za-z0-9.+~-]*)?\\r?$\u002F { sub(\u002F^PHP: \u002F, \"\"); sub(\u002F\\r$\u002F, \"\"); print; exit }'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$work_dir\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002Fbody\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    sapi\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$(\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">awk\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '\u002F^SAPI: [A-Za-z0-9_-]+\\r?$\u002F { sub(\u002F^SAPI: \u002F, \"\"); sub(\u002F\\r$\u002F, \"\"); print; exit }'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$work_dir\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002Fbody\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  result\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">OK\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [[ $curl_exit \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ]]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">CURL_ERROR\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  elif\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [[ $http \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 200\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ]]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">HTTP_ERROR\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  elif\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [[ \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-z\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $php \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> -z\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $sapi \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">||\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $sapi \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> cli ]]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">INVALID_RESPONSE\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  elif\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [[ \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-n\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $EXPECTED_PHP_VERSION \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">&#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $php \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$EXPECTED_PHP_VERSION\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ]]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">VERSION_MISMATCH\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> !\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> cleanup_link\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">CLEANUP_ERROR\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$fqdn\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$root\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$http\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$curl_exit\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">php\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">:-\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">-\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">sapi\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">:-\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">-\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$result\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> >>\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$report\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '%s %s: HTTP=%s PHP=%s SAPI=%s\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$result\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$fqdn\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$http\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">php\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">:-\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">-\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}\"\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">sapi\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">:-\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">-\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [[ $result \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> OK ]]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> failed\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  # 削除失敗時は次のリンクを作らず、EXITでも再度削除を試みる。\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [[ $result \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> CLEANUP_ERROR ]]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> break\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">done\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">printf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '完了: %s\\n'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$report\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">exit\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$failed\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>あとは \u003Ccode>bash check-web-php.sh\u003C\u002Fcode> で実行するだけで、各FQDNのドキュメントルート直下に一時リンクを作成して HTTPS 確認、リンク削除を順番に行って、結果を \u003Ccode>~\u002Ftest\u002Freports\u002F\u003C\u002Fcode> 下へ TSV 出力してくれる。中断時も一時ファイルは削除して、既存ファイルには上書きしないようにしてある。\u003C\u002Fp>\n\u003Cp>実際の実行結果例:\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">OK\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> fqdn1.com:\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> HTTP=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">200\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> PHP=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">8.4.27\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> SAPI=cgi-fcgi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">HTTP_ERROR\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> fqdn2.com:\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> HTTP=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">302\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> PHP=-\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> SAPI=-\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">OK\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> sub1.fqdn2.com:\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> HTTP=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">200\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> PHP=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">8.4.27\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> SAPI=cgi-fcgi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>これでWeb側の PHP 実行環境のバージョンも一気に確認できた。\u003C\u002Fp>\n\u003Cp>有用なスクリプトだと思ったので、コードスニペットとして共有しておこうかと思った次第だ。FQDN等の環境変数周りを外出ししてサーバー毎に設定ファイル化するなどのカスタマイズをすれば、通常時のサービス生存確認用のヘルスチェックの仕組みにも組み込めそうである。\u003C\u002Fp>\n",[273,276],{"slug":274,"name":275},"php","PHP",{"slug":277,"name":278},"%e8%84%86%e5%bc%b1%e6%80%a7","脆弱性",[280,284,293,298],{"slug":92,"title":93,"date":94,"excerpt":95,"image":10,"categories":281},[282,283],{"slug":98,"name":99},{"slug":13,"name":14},{"slug":285,"title":286,"date":287,"excerpt":288,"image":289,"categories":290},"javascript-function-that-can-determine-whether-specific-value-is-empty","JavaScriptでPHPのempty()のように空判定ができる関数","2017-10-13T20:18:47","JavaScriptにはオブジェクトや配列などの引数に与えた変数（値）が「空」かどうかを判定する関数がない。つまり、PHPで云うところの empty() や、Railsで云うところの blank? といったビルトインメ…","\u002Fassets\u002Fuploads\u002F2016\u002F06\u002Ftools.png",[291,292],{"slug":98,"name":99},{"slug":13,"name":14},{"slug":150,"title":151,"date":152,"excerpt":153,"image":154,"categories":294},[295,296,297],{"slug":157,"name":158},{"slug":146,"name":147},{"slug":13,"name":14},{"slug":174,"title":175,"date":176,"excerpt":177,"image":178,"categories":299},[300,301,302],{"slug":169,"name":170},{"slug":146,"name":147},{"slug":13,"name":14},{"slug":139,"title":140,"date":141,"excerpt":142,"image":143,"categories":304},[305,306],{"slug":146,"name":147},{"slug":13,"name":14},1793634445983]