おれんじぺこ

母、ときどきwebエンジニア

Composerのパッケージのインストールの際に、一時的にPHPバージョンエラーを回避する

Composerでパッケージをインストール・アップデートの際に、現在のPHPバージョンに合わないパッケージをインストールしたい場合があると思います。
Composerは、各パッケージをインストールする際に、現在のPHPのバージョンに合わせたパッケージのバージョンでインストールしてくれるため、
もし、PHPのバージョンがパッケージの対応しているPHPバージョンの場合、通常だとエラーとなります。

PHPのバージョンに合わないパッケージをインストールしたい場合は、以下のコマンドで対応します。

PHPのバージョンチェックを一時的に回避する

composerコマンドを実行する際に、--ignore-platform-reqsオプションを追加して、パッケージのインストールやアップデートを行います。

composer require [インストールしたいパッケージ名] --ignore-platform-reqs
composer install/update --ignore-platform-reqs

すると、PHPのバージョンチェックを行わずに指定したバージョンのパッケージのインストールが行えます。
ただ、PHPバージョンの依存性は無視した状態でのインストールのため、その後の挙動については自己責任となります。笑

Amazon linuxにncコマンドをインストールする

キャッシュサーバーとしてRedisを立て、Webサーバー(Amazon Linux)から疎通確認を行うために、ncコマンドを実行したところ、
デフォルトのAmazonLinuxにはncコマンドが入っていないことが判明。
そこで、ncコマンドをインストールし、Redisとの疎通確認を行う方法を書いていきます。

実行環境

ncコマンドのインストール

以下のコマンドでncコマンドをインストールします。  

sudo yum install -y nc

Redisとの疎通確認

以下のコマンドでRedsとの疎通確認を行います。  

# ”6379”部分は、デフォルトのRedisポート番号(カスタマイズしている場合は、設定しているポート番号を指定してください)
nc [ノードのエンドポイント] 6379

問題なくRedisと接続できていることを確認できました!

Redisの拡張機能「php-redis」をインストールする

実行環境

概要

AWSCakePHP環境を構築する際に、キャッシュサーバーとしてRedisを採用しました。
それに合わせて、php側のRedisの拡張機能であるphp-redisをインストールする必要があったので、その手順を書いておきたいと思います。

php-redisのインストール手順

(1)php-redisライブラリをインストール

まず、今回インストールするphp-redisライブラリがこのままでインストールできるのかを確認します。
今回phpをdnfリポジトリからインストールしたので、php-redisライブラリもdnfリポジトリからインストールしたいと思っているため、以下のコマンドを実行。

dnf list php8.4*

すると、一覧にphp8.4-pecl-redis6.x86_64の記載が。
今回のインストールライブラリとして問題はないので、こちらのライブラリをインストールします。
以下のコマンドでphp-redisをインストールします。

sudo dnf -y install php-pecl-redis

ちゃんとインストールされているか確認。

dnf list --installed | grep php

無事、ちゃんとインストールされていました!
現在、php-redisをインストールしただけなので、こちらの拡張機能を使えるように有効化設定を行います。
正常にインストールされている場合、Redisのiniファイルが作成されているはずです。
php拡張機能のiniファイルは、デフォルトだと/etc/php.d/に配置されています。
今回インストールしたphp-redisのiniファイルがあるかどうか確認します。

find /etc/php.d/ -type f -name "*redis*"

すると、redisのiniファイルがありましたので、そのredisのiniファイルに以下の内容を追記します。

extension = redis.so

ここまで対応したら、一旦Apcheの再起動を行います。

(2)phpのバージョンを確認すると・・・RedisでWarningが?!

Apacheを再起動し、phpのバージョン確認を行うと以下のWarningが発生していました・・・

$ php -v
PHP Warning:  PHP Startup: Unable to load dynamic library 'redis.so' (tried: /usr/lib64/php8.4/modules/redis.so (/usr/lib64/php8.4/modules/redis.so: undefined symbol: igbinary_serialize), /usr/lib64/php8.4/modules/redis.so.so (/usr/lib64/php8.4/modules/redis.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP 8.4.10 (cli) (built: Jul  2 2025 02:22:42) (NTS gcc x86_64)
Copyright (c) The PHP Group
Built by Amazon Linux
Zend Engine v4.4.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.4.10, Copyright (c), by Zend Technologies

php-igbinary拡張機能が定義されていないということなのでphp-igbinaryライブラリのインストール&有効化を行いたいと思います。

(3)php-igbinaryライブラリをインストール

php-redisのときと同様、dnfリポジトリからphp-igbinaryライブラリをインストールします。

sudo yum install -y php8.4-pecl-igbinary

そして、php-redisのときと同様、ライブラリの有効化を行い、Apacheを再起動します。
php -vで再度phpのバージョンを確認。

無事、php-redis(php-igbinary)のインストールに成功しました!

おわりに

今まで、エラーに遭遇したときはとりあえずググって・・・から始めていたのですが、
ちゃんとエラーを読んで対応を確認するって本当に大切だと実感しました。
ググって同じエラーメッセージでも、遭遇したケースによって対応法は違いますしね・・・
メッセージが英語だと反射的に身構えてしまうので、英語に対してもっとフレンドリーに向き合えるようにしていきたいですね。

[DBeaver]rootユーザでクエリを実行したら読み取り専用の接続と怒られたときの対処法

今回、AWSでスナップショットから新規RDSを構築しました。 同じVPC内でのRDSの複製ではなく、別VPCへの複製だったので、色々手順があるのですが、その話はまた今度・・・

とりあえず、DBに接続できたので、マスターユーザでログイン、各種設定を行おうとSQLを実行したところ・・・ SQLが実行できない!という事態が。

まさか、ここでつまづくとは思っていなかったので、何が原因か当初は分からず、かなりあたふたしました。 結局、RDSの設定などは関係なく、使用していたSQLクライアントの「DBeaver」の設定が原因でした・・・

はぁ、焦った・・・

直面したエラー

今回直面したエラーは、以下のエラーです。
ユーザ追加をしようとしたときにこのエラーになり、SQLの実行に失敗してしまいました。

SQLエラー [S1009]: Connection is read-only. Queries leading to data modification are not allowed.```

「マスターユーザーでデータベースには問題なくログインできるのに、参照しかできないなんてある?!」
と画面の前で突っ込みました(笑)

まず疑ったのは、データベースの設定がまずかったのではないかと言うことでした。

データベースの設定を確認

エラーの内容が「読み取り専用の接続です」ということだったので、そもそもデータベースが読み取り専用設定になっているのではないかと思い、以下のSQLで設定の確認を行いました。

SHOW variables WHERE variable_name='read_only';
SHOW variables WHERE variable_name='innodb_read_only';

実行結果はどちらも「OFF」。DBの設定として、読み取り専用になっているわけではありませんでした。
DBの設定では問題ないし、DBへの接続は問題なくできている・・・もしかして・・・SQLクライアント側の問題?

DBeaverの設定を確認

今まで、さまざまなデータベースにDBeaverで接続してきましたが、「読み取り専用問題」で引っかかることがありませんでした。
そのため、まさかDBeaverの設定に問題があるのかも・・・と思うまでかなりの時間がかかりました。

DBeaverの問題の設定箇所は、
編集 接続>一般>セキュリティエリアにある、”読み取り専用接続チェックボックス でした。

この読み取り専用接続がONになっていたために、データベースへの変更SQLの実行でエラーになっていました。 こちらのチェックボックスを外すと、DBのログインユーザの権限通りの動きになりました。

ほんと、焦った・・・💦

flutter doctorでcmdline-toolsのインストールを求められたときの対処方法

flutter doctorでcmdline-toolsのインストールを求められたときの対処方法

flutterの開発環境を構築している途中で遭遇したcmdline-toolsのインストールを求められたのでその対処法について説明します。
flutter doctorコマンドで、設定が完了しているか確認した時、

[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
    ✗ cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
    ✗ Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/macos#android-setup for more details.

というメッセージが表示され、「cmdline-tools」がインストールされていないということなので、インストールします。

Android Studioを起動し、Setting > Languages & Frameworks > Android SDKを表示します。

cmdline-toolsのインストール方法

そこで、「SDK Tools」タブを選択し、「Android SDK Command-line Tools」にチェックを入れてApplyボタンをクリックし、インストールを実行します。
するとインストールが無事完了です、めでたしめでたし。

【Docker】PHP7.4だとxdebugのインストールがうまくいかない

PHP7.4だとxdebugのインストールがうまくいかない

php7.4-fpmコンテナにxdebugをインストールしようとしたのですが、インストールに失敗してbuildが完了しませんでした。
Dockerfileのビルドに失敗した時のエラーメッセージは以下の通りです。

pecl/xdebug requires PHP (version >= 8.0.0, version <= 8.3.99), installed version is 7.4.33
No valid packages found
install failed

pecl/xdebugは以下のPHPバージョン要件(バージョン8.0.0以上8.3.99以下)を必要としていますが、現在インストールされているPHPバージョンは7.4.33です。
有効なパッケージは見当たりません。
インストールに失敗しました。

つまり、PHPのバージョンとxdebugのバージョンが不一致ということみたいです。
そのため、PHP7.4のバージョンでインストールできるxdebugをインストールする必要があります。
どのPHPのバージョンにどのxdebugが対応しているかの対応表はこちらから確認できます。

xdebug.org

今回インストールしているPHPは7.4.33なので、xdebug3.0は対応しているようです。
そこで、Dockerfileのxdebugをインストールするコマンドを以下のように書き換えます。

RUN pecl install xdebug-3.0.4 \    
    && docker-php-ext-enable xdebug \    
    && mkdir -p /var/log/xdebug    

そして、docker-compose buildすると、無事ビルドが成功しました!

CakePHP4でテーブルをdropするマイグレーションファイルの書き方

CakePHP4でテーブルをdropするマイグレーションファイルの書き方

CakePHP4で、すでに作成済みのテーブルを削除したい時のマイグレーションファイルの書き方をご紹介します。

まず、マイグレーションファイルを作成。

# 削除したいテーブル名が"hoshotan_tables"の場合
./bin/cake migrations create DropHoshotanTables

マイグレーションファイル内には以下のようにコードを記載します。

// 削除したいテーブル名が"hoshotan_tables"の場合
public function change()
{
    $this->table('hoshotan_tables')
        ->drop()
        ->save()
        ;
}

マイグレーション実行!

./bin/cake migrations migrate

PHPUnitの比較系メソッド覚書

最近仕事でPHPUnitを使用することが増えてきて、assert系の索引ページが欲しくなったので作ってみました。
随時更新していきたいと思います(`・∀・´)

Booleanの評価

値がTrueかどうか:assertTrue

/**
 * $var:評価したい値
 */

$this->assertTrue($var);

値がFalseかどうか:assertFalse

/**
 * $var:評価したい値
 */

$this->assertFalse($var);

配列の評価

配列の値を順不同で比較したい:assertEqualsCanonicalizing

/**
 * $arrExpected:想定される配列
 * $arrActual:実際の配列
 * $arrActual:実際の配列
 */ 

$this->assertEqualsCanonicalizing(mixed $arrExpected, mixed $arrActual, String $message = '');

docker-composeでホスト側IPを指定する方法

案件ごとにローカル環境を構築する際、最近はもっぱらdocker-composeを利用しています。
docker-composeを使うまではVagrantを使用してローカルでの開発環境を作っていたのですが、MacのアップデートでVagrantが突然動かなくなるというハプニングが(´;ω;`)

Vagrantが動かないんじゃどうしようもない!ってことで半ば仕方なしな感じでdocker-composeの利用を始めました。
最初の頃は使い方もわかっていなかったので色々戸惑っていましたが、慣れるとめっちゃ便利でdocker-composeで開発環境を作りまくる日々( ´艸`)

docker-compose、めちゃ便利なのですが、案件とともにdocker-composeで作る環境も増えてきて思ったことは、
みんなポート番号の管理ってどうしてるの?!
でした。

はじめは、
Webコンテナはホストは88ポートで、DBコンテナのホストは53306で・・・
みたいな感じで書いて、1つのプロジェクトのみ立ち上げていたのですが、だんだん面倒くさくなり、同時に複数のプロジェクトのコンテナを立ち上げておきたくなりました。
そうなってくると、問題になってくるのが「ポート番号」です。
数プロジェクトなら直近で作成したdocker-compose.ymlを参照してポート番号が被らないように設定できていたのですが、だんだんプロジェクトが多くなってくると「空いているポート番号なんだっけ?!」と混乱してきました( ノД`)

また、Webコンテナの場合、ポート番号を80以外にしていると任意のページにアクセスする際、
http://honyarara.local:8888
のように、ポート番号をURLの後ろにつけないといけないのです。
これがちょっと個人的にはあまり好きではなかったので、なんとかならんものかねぇ~と思っていたところ、
ホスト側でIPを指定する方法
を発見!

docker-composeでホスト側IPを指定する方法

.envファイルの作成

docker-compose.ymlが配置してある場所に.envファイルを作成し、

IP=127.0.0.1

と書きます。
ちなみに「127.0.0.1」の箇所は必要に応じて任意のローカルIPを設定してください。

docker-compose.ymlでIPを指定

.envファイルを作成したら、docker-compose.ymlのポート設定を変更します。

ports:
      - "${IP}:80:80"

portsの設定の最初に${IP}をつけるだけです。
めちゃ簡単°˖✧◝(⁰▿⁰)◜✧˖°

ちなみにポートが被らないように、私は取引先ごとにポートの区分けをしています。
127.1.*.*はA社案件で127.2.*.*はB社案件・・・みたいな感じです。
hostsファイルを見ながらIPの被りが無いように設定すれば良いだけのでかなりサクサク開発環境を作れています(*・ω・)

docker-composeでの開発環境構築の際にポート番号でお困りの方はぜひお試しあれ♪

在宅勤務用のWebカメラは画素数があまり高くないほうがいい

在宅勤務をしていて必須アイテムとなるのが「Webカメラ」です。
カメラと聞くと、「高精細」だったり「高機能」を求めたりしがちですが、仕事上のミーティングで使用するくらいの場合はそこまで機能や画素数にこだわる必要はないと思っています。

それより、価格や使いやすさなども考慮して選んでいきましょう°˖✧◝(⁰▿⁰)◜✧˖°

今回は、私が実際に使用していて感じているWebカメラに求めるポイントをまとめてみました。

Webカメラを選ぶ際のポイント

高精細なWebカメラは顔のアラが映りすぎてしまうので注意

シミもシワもクマもない顔であればむしろ高精細カメラのほうが良いかもしれませんが、シミもシワもクマも存分にある30代半ばの私にとって「アラが映りすぎてしまう」カメラはNGです。
在宅勤務を始めた頃、在宅勤務のためのアイテムにこだわっていた時期があり、そのときにWebカメラも高精細なものを購入しました。
確かに精細に映るのですが、精細に映りすぎてしまうばかりに顔のアラが目立ってしまうという悲しい結末で即効お蔵入りとなった経験があります(´;ω;`)

今となっては、とりあえずWebカメラとしての機能である「顔が映る」ことのみを購入の際の条件として、画素数に関してはあまり気にしない(高精細なものは選ばない)ようにしています。
仕事を行うにあたって、カメラに映る人の表情が相手にストレスなく見えればコミュニケーションは行えますしね。

あまりお金をかけすぎない

在宅勤務をしていると、仕事で使うアイテムにこだわりたくなりますよね。
私もめっちゃこだわっていたので、その気持ちは良くわかります(・ω・)(-ω-)(・ω・)(-ω-)

仕事以外でWebカメラを使わない場合はあまりお金をかけなくても良いと思います。
Webカメラの場合、画素数=金額な部分もあるので、お金をかければかけるほど画素数の高いカメラとなる傾向があります。

そのため、30オーバーの女性にとって
高いWebカメラ=顔のアラが目立ってしまうカメラ
となってしまうので、高いお値段のカメラがこちらの要求を満たすとは限らないのです。

Webカメラはあくまで仕事上問題なくコミュニケーションがとれる程度の映りであれば問題はないので、無理に高いWebカメラを購入しなくても「それなり」なものを選ぶと失敗は少ないかと思います。

設定が楽なものを選ぶ

オンラインミーティングの際にはその前にできるだけ時間をかけたくありませんよね。
そのため、カメラのセッティングなどがややこしいものだと、オンラインミーティングのツールとの相性や各種設定に時間がかかってしまい、本来のミーティングの時間に間に合わないということもあるかと思います。

仕事で使用するWebカメラの場合、設定はできるだけ簡単なものをおすすめします。
Webカメラの設定なんて、と思うかもしれませんが、ミーティングが始まる直前に接続できていないことが判明すると、それが意外とストレスだったりします(´;ω;`)
仕事で使うアイテムはストレスを軽減させるようなものじゃないといけないと思うので、USBに挿したら即使用可能!みたいなシンプルなWebカメラのほうが長く使えると思っています。

ちなみに、私が今使用しているWebカメラはこちらです。

何の変哲もないWebカメラですが、私がWebカメラに求める条件はすべて叶えているものです。
私はこれを約2年ほど使用していますが、何の問題もないですし、価格もかなりお安いのでコスパも良い商品でかなりおすすめです。