PHPの実行環境がEC2かローカルかを簡易的に判定する

概要

PHPUnitで自動テストをしていますが、ローカル環境では動かない機能のテストが一部あったため、実行環境を判定してスキップしてやろうって話。

目標

  • 実行環境の判定関数を作りたいので、適当な判定条件を作る。

条件

  • 本番環境とテスト環境ではテストを実行したいが、ローカル環境では特定のテストを実行したくないので、これらを区別する必要がある。
  • 本番環境とテスト環境はAWSのEC2上で動いている。
  • ローカルの開発環境はxamppやらVM+vagrantやらDockerやら各々色々。
  • PHPUnitはコンソールから直接実行する場合もある。

結果

東京リージョンのEC2を判定する例

function is_local() {
    if (strpos(gethostname(), 'ap-northeast-1.compute.internal') === false) {
        return true;
    }
    return false;
}

備考

  • 「アジアパシフィック (東京)」リージョンのEC2インスタンスはhostnameが ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal といった形式になるようで、ローカルの開発環境ではこうはならないため、都合が良いと判断し採用。
  • $_SERVER['HOSTNAME'] は実行条件によってEC2インスタンス上でもNULLになってしまう場合があったため不採用。
  • gethostname() の挙動が安定しないようなことがあれば再考。
  • PHPの実行時にenvを宣言するみたいなことができるらしく、本来はそうした方がスマートなのかなと思うけど今回は見送り。

wp-config.php が反映されない

解決したので記事書きます。
原因は簡単(BOM)だったのですが、見落とす可能性は高そうです。

現象

WordPressの設定ファイルである「wp-config.php」を編集したが、変更内容が反映されない。

試したこと

  1. 適当に検索してみたところ、編集範囲の外に記述していないかなどが出てきたが、今回は関係が無かった。(権限関係でそもそも編集できないなども出てきたが、今回の現象とは無関係)
  2. 自分が編集しているファイル以外のファイルがロードされている可能性を考えて $ find / -name "wp-config.php" したが、他に同一名のファイルはサーバ上に無かった。
  3. 何かしらブラウザのキャッシュが悪さしている可能性を考えてキャッシュを消してページを読み込んだが、変更内容は反映されていなかった。
  4. 公式のリファレンスを参照してみたが、有用な情報はなかった。
  5. Google is GOD 救済を得た。

解決

適当にググってこちらの情報に行き着いた。

原因は、TeraPadで編集して、保存がUTF-8のBOM無じゃなかったから。
BOM無という言葉はないが、UTF-8Nがそれらしい。未確認だけど、試したら解決した。

WordPress wp-config.phpが反映しない | weblogs

vimで適当に編集していたのでBOMとか全く気にしていなかった。
こんなところでもBOMに苦しめられるとは思わなんだ。

vimでBOMの有無を確認したところ、見事にbomが付いていたので消し飛ばして解決。

※vimにて

:set bomb?
> bomb

:set nobomb
:set bomb?
> nobomb

参考: VimでのBOMの取り扱い – Qiita

wp-configの中にUTF-8のBOM無しで保存するようにと、かなりわかりやすい注意書きがあったので、そこが目に入っていれば気がついたかもしれない。

nginxでbasic認証してみた

1.動機

・リンクを知られていると誰でも見れるのは少し気持ち悪いなと感じたため

2.環境

・ubuntu 20.04.1 LTS(64bit)
 visualboxの仮想環境
・nginx 1.18.0
・apache2-utils
 →htpasswd作成用

3.手順

① htpasswdで認証情報を作成
  →下記コマンド実行後、設定パスワードを入力

$htpasswd -c (パス)/.htpasswd (ユーザー名)

② ①で設定したファイルをnginxで読み込む


  ・/devにアクセスした際に認証をかけたい場合、
   /etc/nginx/sites-availavle/defaultを下のように編集
  
  location /dev {
    auth_basic “認証画面で表示する文言”;
    auth_basic_user_fire ①で設定したパス;
    …
  }

③ nginxの設定再読み込み

$nginx -s reload
$service nginx restart

④ 完成
  ①で設定したユーザー名とパスワードを入力してログイン

Termiusでkeepaliveを設定する

Putty? TeraTerm? 時代はTermius🌊

Termiusでkeepaliveを設定するのに少し手間取ったので備忘録として書いておきます。

□設定方法

①Termiusを開き、左上のハンバーガー(っぽい)メニューを選択

②メニュー内の「 Terminal 」を選択

③メニュー下部の「 Keepalive Interval 」を設定
※ミリ秒で設定するので、20秒であれば、20000と入力する必要あり💦

以上で設定完了です!

余談ですが、ダークモードは①のハンバーガーメニュー下部にあります✨

Effective Javaを読みました

Javaを扱っている人のバイブル的な本ですね。

今まで読んだ本について各項目について書いておりましたが、Effective Javaについては量が多いのでざっくりとした感想だけ書きたいと思います。

第3版を読みました。第2版と比較しましたが、ラムダとストリームという章が追加され、その他の章は大きくは変わってなさそうな印象でした。第2版はもちろん読んでません。

◾️追加された項目
第2章 オブジェクトの生成と消滅
 項目5 資源を直接結び付けるよりも依存性注入を選ぶ
 項目8  ファイナライザとクリーナーを避ける
 項目9 try-finallyよりもtry-with-resourcesを選ぶ

第4章 クラスとインターフェース
 項目21 将来のためにインターフェースを設計する
 項目25 ソースファイルを単一のトップレベルのクラスに限定する

第7章 ラムダとストリーム(※全て追加)
 項目42 無名クラスよりもラムダを選ぶ
 項目43 ラムダよりもメソッド参照を選ぶ
 項目44 標準の関数型インターフェースを使う
 項目45 ストリームを注意して使う
 項目46 ストリームで副作用のない関数を選ぶ
 項目47 戻り値型としてStreamよりもCollectionを選ぶ
 項目48 ストリームを並列化することは注意を払う

第8章 メソッド
 項目55 オプショナルを注意して返す

第11章 並行性
 項目80 スレッドよりもエグゼキュータ、タスク、ストリームを選ぶ

第12章 シリアライズ
 項目85 Javaのシリアライズよりも代替手段を選ぶ

◾️感想
正直、Javaを軽くしか触っていない自分にとっては難しいところが多々ある本でした。
といっても、メソッドやプログラミング一般などは比較的な簡単な項目があったりしたので、全部が難しいわけではないです。

この本に関して初心者に読んでほしい、初心者には向かないなど色々な意見がありますが、自分は初心者の人に関しては、読み方を気をつければ読んだほうがいいかと思います。
罠にハマらないような書き方、どうすると罠にはまってしまうのかなども記載されているため、早めに直しておきたい項目が多々あるからです。
読み方としては項目毎に軽く2ページほど読んで、理解できそうかどうか、あるいは頑張れば理解できそうだったらしっかりその項目を読んで、わからなかったところは時間が経ってから読み直すといったやり方がいいと思います。
デザインパターンを知らないのに解説もされていないデザインパターンについて言及されている項目が理解できるはずがないと思います。
そういうのが多くある場合、挫折すると思うのでここは後回しでいいと割り切っていくのがいいかと思います。
自分も読んでいて心折れかけそうなときがありました。
ですので、わからなかったときに何を勉強しておくとわかるようになるのかをメモしておいてそれについて勉強してから読むぐらいの認識でいいと思います。

内容についてですが、凄く勉強になりました。
例えば 第2章のすべてのオブジェクトに共通のメソッドについてはお恥ずかしながらJava標準でのメソッドをオーバーライドをするという発想が皆無だったのでtoStringをオーバーライドするなどは新鮮でした。
第5章のジェネリック型はよく使ってますがやっぱり便利だと感じます。ArrayListがPHPにも欲しい。
第6章のenum、第7章のラムダとストリーム、第11章の並行性はぜひ使いこなしたいです。
誤解かもしれないですが継承はもうあまり使わない方がよかったりするのかな?最近はis-aよりhas-a傾向強い気がします。

この本に関しては手元に置いておいて必要な時に何度も読み返したいと思います。