tag:crieit.net,2005:https://crieit.net/tags/xampp/feed 「xampp」の記事 - Crieit Crieitでタグ「xampp」に投稿された最近の記事 2021-12-22T00:02:36+09:00 https://crieit.net/tags/xampp/feed tag:crieit.net,2005:PublicArticle/17882 2021-12-22T00:02:36+09:00 2021-12-22T00:02:36+09:00 https://crieit.net/posts/php-judge-mime-type-20211222 PHP で MIMEタイプ判定を行う (fileinfo 使用) <p>WordPress でアップロードできないファイルの確認のため、 PHP で MIMEタイプ を確認してみます。</p> <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>自分で Markdown でメモを書いた後に、それを WordPress の投稿に投げておきたい、という場面に遭遇しました。</p> <ul> <li>どこにも記録を残さず削除するのは忍びない</li> <li>大した内容ではないので記事文本文に転写するようなものでもない</li> </ul> <p>という微妙なポジションの走り書きファイルをとりあえず記事に紐付けておきたい。どこかに保存しないのであればデスクトップがひたすら汚れていくか、いっそ記録を残さず削除するか……。</p> <p>であれば <code>.md</code>ファイル もメディアとしてファイルアップロードを受け付けるようにすれば良い、と考えました。</p> <p>WordPress 標準だとそもそも <code>.md</code>拡張子 がNGなので。</p> <p>……ところで、 <code>.md</code> って MIMEタイプ は何になるのでしょうか。</p> <p><a target="_blank" rel="nofollow noopener" href="https://labor.ewigleere.net/2021/04/18/wordpress-upload-failed-certain-excel-2/">WordPress で一部の .xlsファイル だけがアップロードできない (解決)</a>のプラグインで <code>text/html</code> や <code>text/markdown</code> としても受け付けてくれなかったので。</p> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <p>ということでサクッとコードを書いて PHP 的に MIMEタイプ が何になるかを調べます。</p> <p>もちろん、バージョンで判定が変わってしまうのは前提として。</p> <pre><code class="php"><?php $finfo = new finfo(); ?> <table> <tr> <thead> <th>ファイル名</th> <th>MIMEタイプ</th> </thead> </tr> <?php foreach (glob('scan/*') as $file) { if (is_file($file) && strpos($file, '.gitkeep') === false) { ?> <tr> <th><?= htmlspecialchars($file, ENT_QUOTES, 'UTF-8'); ?></th> <td><?= htmlspecialchars($finfo->file( __DIR__ . '/' . $file, FILEINFO_MIME_TYPE), ENT_QUOTES, 'UTF-8'); ?></td> </tr> <?php } } ?> </table> </code></pre> <p>今回はこのような形でファイル名と MIMEタイプ を表示させるプログラムを書きました。</p> <p><a href="https://crieit.now.sh/upload_images/448e5aa027e4ba3f45349d4c1f0850e361be0947253f8.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/448e5aa027e4ba3f45349d4c1f0850e361be0947253f8.jpg?mw=700" alt=".mdファイル は text/plain、いくつかのパターンで試した .zip はいずれも application/zip でした" /></a></p> <p>これにより、 <code>.md</code>ファイル は <code>text/plain</code>、 いくつかのパターンで試した <code>.zip</code> はいずれも <code>application/zip</code> であることが確認できました。</p> <p>そこで先のプラグインの拡張子と MIMEタイプ の一覧を以下のように変更。</p> <pre><code class="php"> return [ [ 'xla|xls|xlt|xlw' => 'application/vnd.ms-office' ], [ 'xla|xls|xlt|xlw' => 'application/vnd.ms-excel' ], [ 'md|markdown' => 'text/plain' ], [ 'zip|xzip' => 'application/zip' ], [ 'zip|xzip' => 'application/z-zip' ], [ 'zip|xzip' => 'application/zip-compressed' ], [ 'zip|xzip' => 'application/x-zip-compressed' ], [ 'zip|xzip' => 'application/compressed' ], [ 'zip|xzip' => 'application/x-compressed' ], [ 'zip|xzip' => 'application/octet' ], [ 'zip|xzip' => 'application/octet-stream' ], ]; </code></pre> <p>これでアップロードできるようになったことを確認。</p> <h2 id="余談"><a href="#%E4%BD%99%E8%AB%87">余談</a></h2> <p>XAMPP で動作確認を取る際に PHP のパッケージ読み込みで fileinfo が読み込まれておらずエラーになってしまいました。</p> <p>そこで XAMPP の <code>php.ini</code> を編集。</p> <pre><code class="ini">;extension=fileinfo extension=fileinfo </code></pre> <p>コメントアウトを解除して XAMPP の Apache を再起動。これでエラー解消を確認しました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/katsukii/items/ec816b23f68b6dfa0f87">PHPで任意のディレクトリ下にあるファイルを一覧取得する方法 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://colo-ri.jp/develop/2011/04/uploader-fileformat-detection.html">PHPでMIME-Typeを判定する方法 | colori</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://gray-code.com/php/get-kind-of-file/">ファイルの種類(MIMEタイプ)を確認する | GRAYCODE PHPプログラミング</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/kazu56/items/2c72d187438de07c2503">【PHP】特定の文字列を含むかのチェック - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17518 2021-07-15T22:35:47+09:00 2021-07-15T22:35:47+09:00 https://crieit.net/posts/guzzule-error-in-xampp-20210715 Guzzle Client で cURL error 60: SSL certificate problem: self signed certificate in certificate chain エラー <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <p>XAMPP 上で <a target="_blank" rel="nofollow noopener" href="https://packagist.org/packages/guzzlehttp/guzzle">Guzzle Client</a> を利用しようとしたら以下のようなエラーが発生しました。</p> <blockquote> <p>GuzzleHttp\Exception\RequestException: cURL error 60: SSL certificate problem: self signed certificate in certificate chain (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://example.jp/</p> </blockquote> <h2 id="前提"><a href="#%E5%89%8D%E6%8F%90">前提</a></h2> <p>この XAMPP 環境は以前<a target="_blank" rel="nofollow noopener" href="https://labor.ewigleere.net/2020/02/24/xampp-php-update/">XAMPPのPHPのバージョンをアップグレードする ( 7.1.7 → 7.4.3 )</a>で PHP のバージョンを上げていました。</p> <h2 id="調査"><a href="#%E8%AA%BF%E6%9F%BB">調査</a></h2> <p>XAMPP の PHP について <code>php.ini</code> を確認。</p> <pre><code class="ini">extension=curl </code></pre> <p>まずここはOK。</p> <pre><code class="ini">[curl] ; A default value for the CURLOPT_CAINFO option. This is required to be an ; absolute path. ;curl.cainfo = </code></pre> <p>あ、SSL証明書の指定がないですね。</p> <p>ちなみに元々 XAMPP に入っていたバージョンの <code>php.ini</code> では</p> <pre><code class="ini">[curl] ; A default value for the CURLOPT_CAINFO option. This is required to be an ; absolute path. curl.cainfo="PATH:\TO\xampp\apache\bin\curl-ca-bundle.crt" </code></pre> <p>SSL証明書の指定がありました。</p> <p>パス先にSSL証明書が存在していることを確認の上、パスを現行の <code>php.ini</code> に貼り付けます。</p> <pre><code class="ini">[curl] ; A default value for the CURLOPT_CAINFO option. This is required to be an ; absolute path. ;curl.cainfo = curl.cainfo="PATH:\TO\xampp\apache\bin\curl-ca-bundle.crt" </code></pre> <p>これで XAMPP の Apache を再起動したところ、エラーは出なくなりました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://nanoappli.com/blog/archives/7992">‘cURL error 60’エラーが出たときの対処法 ‘cURL error 60: SSL certificate problem: unable to get local issuer certificate’</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://linuxfan.info/curl-insecure">curlで「自己署名証明書」を受け入れるには【curl: (60) SSL certificate problem: self signed certificate】 | LFI</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://madadou.info/2018/05/08/curl-error-60/">cURL error 60: SSL certificate (GuzzleHttp v6) | まだどう?</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17501 2021-07-12T20:48:00+09:00 2021-07-12T20:48:00+09:00 https://crieit.net/posts/composer-upgrade-20210712 Windows XAMPP 環境で Composer をアップグレードする <p>去年の10月に Composer 2 がリリースされましたが、アップグレードをしてこなかったのでやってみることにしました。</p> <p>検索して出てきた方法としてコマンドですぐに完了するとのことだったのでコマンドを実行。</p> <pre><code class="bash">> composer self-update --2 [Symfony\Component\Console\Exception\RuntimeException] The "--2" option does not exist. self-update [-r|--rollback] [--clean-backups] [--no-progress] [--update-keys] [--stable] [--preview] [--snapshot] [--set-channel-only] [--] [<version>] </code></pre> <p>あれ?</p> <blockquote> <p>[Symfony\Component\Console\Exception\RuntimeException] The "--2" option does not exist.</p> </blockquote> <p>エラーになってしまいました。</p> <p>エラー文で検索したところ以下の記事がヒットしたので、そのコマンド実行。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://imwz.io/composer-2-update/">Composer 2 Update | IMWZ - Bespoke DevOps Work</a></li> </ul> <pre><code class="bash">> composer global update Changed current directory to C:/Users/USERNAME/AppData/Roaming/Composer Composer could not find a composer.json file in C:\Users\USERNAME\AppData\Roaming\Composer To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section </code></pre> <p>自身のユーザ名の下の <code>AppData\Roaming\Composer</code> に <code>composer.json</code> がないと? Composer の大本の設定のディレクトリですね。</p> <p>とはいえ、 <code>composer.json</code> の中身をどうすれば良いのか……と思っていたところ、そういえばこの環境はインストーラからインストールしたことを思い出しました。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://getcomposer.org/download/">Composer</a></li> </ul> <p>ということでおとなしくインストーラをダウンロードし直して実行。</p> <p>「1つのPCに入れられる Composer は1バージョンのみなので、既存の Composer をアンインストールして」と言われました。</p> <p>コンパネからアンインストール。 Roaming の設定は一応残しておきます。キャッシュは削除。</p> <p>アンインストール完了直前に <code>C:\Users\USERNAME\AppData\Local\Composer</code> を手動で削除して、というメッセージが出たので手動削除。先程指定したキャッシュのようですが、アンインストーラから削除できなかったのか……。</p> <p>アンインストール完了後、再度ダウンロードしたインストーラを実行。後はポチポチしていくだけ。</p> <pre><code class="bash">>composer -v ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.1.3 2021-06-09 16:31:20 </code></pre> <p>インストール完了しました。ひとまずOKそうです。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/rana_kualu/items/8be56a5a20b71710e7ca">Composer2.0ついにリリース! - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://imwz.io/composer-2-update/">Composer 2 Update | IMWZ - Bespoke DevOps Work</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/composer/composer/issues/8325">Composer can not find composer.json file ・ Issue #8325 ・ composer/composer ・ GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://getcomposer.org/download/">Composer</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16833 2021-04-11T15:40:59+09:00 2021-04-11T22:21:47+09:00 https://crieit.net/posts/XAMPP-Apache-URL 【XAMPP】【Apache】URLとフォルダパスの関係を定義する <h1 id="httpd.confファイルの編集"><a href="#httpd.conf%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%B7%A8%E9%9B%86">httpd.confファイルの編集</a></h1> <ol> <li>「XAMPP Control Panel」を起動する。</li> <li>Apacheの「Config」ボタンを押す。</li> <li>Apache(httpd.conf)を選択する。</li> </ol> <hr /> <h1 id="URLとフォルダパスの関係を定義する"><a href="#URL%E3%81%A8%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%91%E3%82%B9%E3%81%AE%E9%96%A2%E4%BF%82%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B">URLとフォルダパスの関係を定義する</a></h1> <ol> <li>ファイル内をキーワード「Alias: Maps web paths」で検索する。</li> <li>該当コメントの後に、下記を追記する。<br /> [URL]のリクエストを受け付けると、Webサーバ内の[フォルダパス]を参照する。</li> </ol> <pre><code>alias [URL] "[ディレクトリパス]" <Directory "[ディレクトリパス]"> Options Indexes followSymLinks MultiViews AllowOverride All Order allow,deny Allow from all Require all granted </Directory> </code></pre> <p>例)</p> <pre><code>alias /hoge "/xampp/htdocs/hogeproject/public/" <Directory "/xampp/htdocs/hogeproject/public/"> Options Indexes followSymLinks MultiViews AllowOverride All Order allow,deny Allow from all Require all granted </Directory> </code></pre> <p>Webブラウザで「http://localhost/hoge/fuga.html」を指定すると、「/xampp/htdocs/hogeproject/public/fuga.html」を表示する。</p> <hr /> <p>「PHPフレームワーク Laravel入門 第2版」P21で、<br /> ---引用---<br /> ファイルを開いたら、<strong>末尾</strong>に以下のように追記をしましょう。<br /> ---引用ここまで---<br /> と記載されていたのに、その通り設定しても「ページが見つかりません」となってしまったので、気になって調べてみた。</p> <hr /> <h1 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h1> <p>Aliasディレクティブ:特定のパスへのリクエストに対してドキュメントルート以外のディレクトリを割り当てる(<a target="_blank" rel="nofollow noopener" href="https://www.javadrive.jp/apache/ini/index12.html">https://www.javadrive.jp/apache/ini/index12.html</a>)</p> <p>もっとhttpd.confの設定(<a target="_blank" rel="nofollow noopener" href="http://www.nina.jp/server/redhat/httpd/httpd_conf.html">http://www.nina.jp/server/redhat/httpd/httpd_conf.html</a>)</p> <p>PHPフレームワーク Laravel入門 第2版(<a target="_blank" rel="nofollow noopener" href="https://www.shuwasystem.co.jp/book/9784798060996.html">https://www.shuwasystem.co.jp/book/9784798060996.html</a>)</p> acmz tag:crieit.net,2005:PublicArticle/15705 2020-02-03T05:23:58+09:00 2020-02-03T19:19:44+09:00 https://crieit.net/posts/phpMyAdmin5-0-1-Fatal-Error phpMyAdmin5.0.1の「状態」タブがFatal Errorで表示されないバグ <p>どこにもエラー報告が見当たらなかったので。デフォルトでも発生する、大きいバグと思われる。問題詳細から解決方法まで記録用に。</p> <h1 id="事前に行なっていたこと"><a href="#%E4%BA%8B%E5%89%8D%E3%81%AB%E8%A1%8C%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E3%81%93%E3%81%A8">事前に行なっていたこと</a></h1> <p>環境:Windows 10</p> <p>64bit Windows版 XAMPP7.4.1(PHP 7.4.1, Apache 2.4.41, MariaDB 10.4.11, PHP 7.4.1, phpMyAdmin 5.0.1, OpenSSL 1.1.1, XAMPP Control Panel 3.2.4, Webalizer 2.23-04, Mercury Mail Transport System 4.63, FileZilla FTP Server 0.9.41, Tomcat 7.0.99 (with mod_proxy_ajp as connector), Strawberry Perl 5.16.3.1 Portable)をインストールした。</p> <p>起動前に若干設定ファイルを変更した。タイムアウトの延長や、前バージョンの設定の引継ぎなど。今回の問題に関わるような変更はしていない。</p> <h1 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h1> <p>「外観の設定」で「言語 - Language」を「日本語 - Japanese」にし、phpMyAdminの「状態」(http://localhost/phpmyadmin/server_status.php)を開いたときに、</p> <p><a href="https://crieit.now.sh/upload_images/f37dd84b36bcbac2749ed7d9d5d7127f5e371d0148fdd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f37dd84b36bcbac2749ed7d9d5d7127f5e371d0148fdd.png?mw=700" alt="image.png" /></a></p> <pre><code>Fatal error: Uncaught TypeError: mb_detect_encoding() expects parameter 1 to be string, bool given in C:\xampp\phpMyAdmin\libraries\classes\Util.php:1620 Stack trace: #0 C:\xampp\phpMyAdmin\libraries\classes\Util.php(1620): mb_detect_encoding(false, 'UTF-8', true) #1 C:\xampp\phpMyAdmin\libraries\classes\Controllers\Server\Status\StatusController.php(51): PhpMyAdmin\Util::localisedDate(1580669987) #2 C:\xampp\phpMyAdmin\server_status.php(35): PhpMyAdmin\Controllers\Server\Status\StatusController->index(Object(PhpMyAdmin\ReplicationGui)) #3 {main} thrown in C:\xampp\phpMyAdmin\libraries\classes\Util.php on line 1620 </code></pre> <p>と表示され、閲覧できない。<br /> 当該ソース(C:\xampp\phpMyAdmin\libraries\classes\Util.php)はこちら。</p> <p><a href="https://crieit.now.sh/upload_images/f37dd84b36bcbac2749ed7d9d5d7127f5e371f3f568f7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f37dd84b36bcbac2749ed7d9d5d7127f5e371f3f568f7.png?mw=700" alt="image.png" /></a></p> <pre><code class="php">/* Fill in AM/PM */ $hours = (int) date('H', (int) $timestamp); if ($hours >= 12) { $am_pm = _pgettext('AM/PM indication in time', 'PM'); } else { $am_pm = _pgettext('AM/PM indication in time', 'AM'); } $date = preg_replace('@%[pP]@', $am_pm, $date); $ret = strftime($date, (int) $timestamp); // Some OSes such as Win8.1 Traditional Chinese version did not produce UTF-8 // output here. See https://github.com/phpmyadmin/phpmyadmin/issues/10598 if (mb_detect_encoding($ret, 'UTF-8', true) != 'UTF-8') { $ret = date('Y-m-d H:i:s', (int) $timestamp); } </code></pre> <p>これはphpMyAdminを構成するコアな部分で、もちろん一切コードは変更していない。</p> <p>このバグは言語が日本語の時だけ発生する。他の言語では発生しないため、発見が遅れている可能性が高い。</p> <h1 id="原因"><a href="#%E5%8E%9F%E5%9B%A0">原因</a></h1> <p>該当ソースのユーザー定義関数<code>localisedDate()</code>の中で発生している。直接的には、1617行目のstrftime()がfalseを返していることが原因。php.netによれば</p> <blockquote> <p>エラー / 例外<br /> 出力内容は元となった C ライブラリに依存するため、サポートしていない変換指定子もあります。 Windows では、対応していない変換指定子を渡すと 5 つの E_WARNING メッセージが出て FALSE を返します。 その他のオペレーティングシステムでは特に E_WARNING メッセージは出ず、 変換指定子が (変換されずに) そのまま出力されます。</p> </blockquote> <p>とあり、Windows依存のバグ。</p> <p>先ほどのコードでは、strftime()の第一引数に、<code>$date</code>の中身として<code>%Y 年 2 月 %d 日 %H:%M</code>が渡されている。これ自体は仕様通りで問題が無いように見える。</p> <p>しかし、strftimeを処理する際に、依存するWindowsのCライブラリでは、<strong>文字列を一度Shift-JISに変換している</strong>。つまり、UTF-8→SJIS→UTF-8の変換が行われている。ここで、漢字の「月」の字が文字化けを起こし、不正なマルチバイト文字と認識され、strftime()がfalseを吐いている、というのが真相である。</p> <p>実際に、UTF-8→Shift-JIS→UTF-8変換を行うと、「%Y 年 2 � %d 日 %H:%M」となる。<br /> また、<code>$date</code>フォーマット文字列において漢字の「月」を削除すればこのバグは発生しなくなる。</p> <h1 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h1> <p>要するに、このバグはOS依存の関数を用いるコードのほうに問題がある。strftime()ではなくdate()に書き換えるべきである。</p> <p>とりあえず日本語ユーザーができる仮対応としては、C:\xampp\phpMyAdmin\libraries\classes\Util.phpの1617行目を「$ret = strftime('%Y-%B-%d %H:%M', (int) $timestamp);」に書き換えることで閲覧できるようになる。</p> <p>Fatal Errorが出るのは相当だと思うので、もし他の方が同じバグに遭遇したら是非プロジェクトに熱いissueを送ってほしい。私はやり方がよくわからないので原因究明で終わりにします。</p> <p>【追記】<br /> だらさんに報告して頂きました、ありがとうございます。<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/phpmyadmin/phpmyadmin/issues/15830">https://github.com/phpmyadmin/phpmyadmin/issues/15830</a></p> ウラル