MinEMemO
【インフラ】パーミッション早見表

2026-06-13

はじめに インフラはローカル環境をDockerなどで構築はできますが、詳しくないので、完全個人用のメモです。 間違った情報もあるとおもうので、参考にする際はご注意ください。 パーミッション早見表 Linuxの権限は 所有者 グループ その他 の順番で並んでいます。 例えば drwxrwxr-x なら d rwx rwx r-x│ │ │ ││ │ │ └ その他│ │ └ グループ│ └ 所有者└ ディレクトリ になります。 rwx の意味 r = read 読み込みw = write 書き込みx = execute 実行 数値との対応 r = 4w = 2x = 1 例えば rwx は 4 + 2 + 1 = 7 です。 よく使う権限 所有者だけ全権限:755 rwxr-xr-x│ │ ││ │ └ その他 = 読み込み・実行│ └ グループ = 読み込み・実行└ 所有者 = 読み込み・書き込み・実行 所有者 : 7 = rwxグループ : 5 = r-xその他 : 5 = r-x その他以外全権限:775 rwxrwxr-x│ │ ││ │ └ その他 = 読み込み・実行│ └ グループ = 読み込み・書き込み・実行└ 所有者 = 読み込み・書き込み・実行 所有者 : 7 = rwxグループ : 7 = rwxその他 : 5 = r-x 全権限:777 rwxrwxrwx│ │ ││ │ └ その他 = 全権限│ └ グループ = 全権限└ 所有者 = 全権限 所有者 : 7 = rwxグループ : 7 = rwxその他 : 7 = rwx 誰でも書き込み可能。開発中の応急処置では見かけるが、実務ではあまり推奨されない。 さいごに パーミッション数値とかアルファベットとか、パッと覚えられない
【インフラ】Dockerで生成したLaravel環境でログパーミッションエラー + 権限系の整理のメモ

2026-06-13

はじめに インフラはローカル環境をDockerなどで構築はできますが、詳しくないので、完全個人用のメモです。 間違った情報もあるとおもうので、参考にする際はご注意ください。 Laravelでログの書き込み権限でパーミッションエラーがでたのでこれを気に権限周りの整理。 また修正方法も記載しておきます。 今回のエラー原因 Laravel実行ユーザー ↓ www-data storage所有者 ↓ 1000(tm) だったため、 www-data が storage/logs/laravel.log に書き込めず、Permission denied が発生していました。 登場人物 Ubuntuユーザー DockerでLaravel環境を作成したUbuntuのユーザー。 Ubuntu環境で id と打つと情報の確認ができます。 今回の場合の例 tm@pc240127:~/Laravel13_sample$ iduid=1000(tm) gid=1000(tm) groups=1000(tm),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),1001(docker) ※Ubuntu環境 uid 1000 が Laravel のフォルダの所有者に最初はなっていました。 Laravelに書き込むユーザー PHP-FPMのユーザー www-data このユーザーが log フォルダなどに書き込めるようにパーミッションを調整しないといけない。 Docker内で以下のコマンドで確認ができます。 root@a3071f286021:/var/www/src# id www-datauid=33(www-data) gid=33(www-data) groups=33(www-data) ※Dockerコンテナ内 Docker内の自分自身のユーザー 自分自身を調べると www-data ではなく、今回は root になっていました。 ログはLaravelを実行しているユーザーが書き込むので、自分自身とは異なります。 名前の確認 root@a3071f286021:/var/www/src# whoamiroot ※Dockerコンテナ内 ユーザー情報の確認 root@a3071f286021:/var/www/src# iduid=0(root) gid=0(root) groups=0(root) ※Dockerコンテナ内 パーミッション調整 Laravelを実行しているPHP-FPMの実行ユーザーを確認 root@a3071f286021:/var/www/src# cat /usr/local/etc/php-fpm.d/www.conf | grep "^user"user = www-data ※Dockerコンテナ内 Laravelを実行しているグループを確認 root@a3071f286021:/var/www/src# cat /usr/local/etc/php-fpm.d/www.conf | grep "^group"group = www-data ※Dockerコンテナ内 Laravelが実行中に書き込むフォルダのパーミッションを確認 storage/:ログやアップロードされた画像、アプリデータのキャッシュなど bootstrap/cache/:Laravel本体のキャッシュ ※今回はログファイルの調整だが、まとめてやっておく。 storageフォルダの権限確認 root@a3071f286021:/var/www/src# ls -ld storagedrwxr-xr-x 5 1000 1000 4096 Jun 12 01:41 storage ※Dockerコンテナ内 bootstrap/cache/フォルダの権限確認 root@a3071f286021:/var/www/src# ls -ld bootstrap/cachedrwxr-xr-x 2 1000 1000 4096 Jun 12 01:41 bootstrap/cache ※Dockerコンテナ内 logファイルの権限確認 root@a3071f286021:/var/www/src# ls -l storage/logstotal 132-rwxr-xr-x 1 1000 1000 134758 Jun 12 01:41 laravel.log ※Dockerコンテナ内 パーミッションの変更 # Laravelを書き込むPHP-FPM実行ユーザーに所有者を変更 chown -R www-data:www-data storage bootstrap/cache # ディレクトリ # 所有者とグループ:r(読込)、w(書込)、x(実行) # その他:r(読込)、x(実行) # 775 = 所有者(rwx) グループ(rwx) その他(r-x) find storage bootstrap/cache -type d -exec chmod 775 { } \ ; # ファイル # 所有者とグループ:r(読込)、w(書込) # その他:r(読込) # 664 = 所有者(rw-) グループ(rw-) その他(r--) find storage bootstrap/cache -type f -exec chmod 664 { } \ ; パーミッション変更後の確認 フォルダ権限 root@a3071f286021:/var/www/src# ls -ld storage bootstrap/cachedrwxrwxr-x 2 www-data www-data 4096 Jun 12 01:41 bootstrap/cachedrwxrwxr-x 5 www-data www-data 4096 Jun 12 01:41 storage ※Dockerコンテナ内 ログファイル権限 root@a3071f286021:/var/www/src# ls -l storage/logs-rw-rw-r-- 1 www-data www-data 134758 Jun 12 01:41 laravel.log ※Dockerコンテナ内 パーミッションについて 【インフラ】パーミッション早見表 おまけ ユーザー覧確認 cat /etc/passwd ※Dockerコンテナ内 見方 root:x:0:0:root:/root:/bin/bash ↓ ユーザー名:x:UID:GID:説明:ホームディレクトリ:ログインシェル ※「:説明:ホームディレクトリ:ログインシェルは時々見る程度」 グループ一覧の確認 cat /etc/group ※Dockerコンテナ内 見方 root:x:0:↓ グループ名:x:GID さいごに 業務で常にしておかないと、何でこうするのか説明ができなくなりますね。色々エンジニアは大変。
【Docker】【260606】#4 Laravelの初回起動、F5更新が遅い場合はWSLのUbuntu内にファイルを置く

2026-06-12

はじめに WindowsのHDDにPJファイルがある場合にlocalhostのロードが遅くなります。 だいたいこんな感覚 立ち上げの表示は5秒以上 通常のF5更新2~3秒 ちょっと遅いし、Ubuntu(Linux)に置くことで改行問題もそもそも起こらないと思うので、PJファイルはLinux内に置くことにしました。 読み込みの流れのイメージ(Windows内) ↓遅い WindowsローカルPC HDD↓Docker↓WSL2↓Linuxコンテナ↓PHP 読み込みの流れのイメージ(Ubuntu(Linux)内) PJファイルをWSL2の中に置いて、以下のように変えます。 全てLinuxになることで早くなる。 Ubuntu(Linux) 仮想ディスク↓Docker↓WSL2↓Linuxコンテナ↓PHP 設定方法 WSL確認 ローカルPCのエクスプローラーに以下を入力し、フォルダが表示される確認 \\wsl$\ WSLに何が入ってる確認 PowerShellで以下を実行 wsl -l -v 私の場合起動中の Docker のみが表示されました NAME STATE VERSION* docker-desktop Running 2 ファイルを置くためにUbuntuをインストール コマンドプロンプトはPowerShellでやっていきます。 wsl --install -d Ubuntu WSL2はWindows上でLinuxを動かすための仕組みです。 WSL2だけでは通常の作業用Linux環境は存在しません。 ファイルを置いて開発するLinux環境を作るために、UbuntuなどのLinuxディストリビューションをインストールします。 Ubuntuのインストール設定 コマンド実行後に、以下が表示されます。 ディストリビューションが正常にインストールされました。'wsl.exe -d Ubuntu' を使用して起動できますUbuntu を起動しています...Provisioning the new WSL instance UbuntuThis might take a while...Create a default Unix user account: ユーザ名入力 「Create a default Unix user account:」 にユーザ名を入力してEnterを押します。 ※Ubuntu内で使うLinuxユーザー名です。 自分が分かりやすい短い英小文字にすると扱いやすいです。 パスワード入力 「New password:」 ↓ 「Retype new password:」 Ubuntu内でsudoコマンドを使う時に入力するパスワードです。 ここも自分がわかりやすいものでOK Ubuntuへの情報共有許可 Help us improve Ubuntu features and compatibility by sharing system reports with Canonical.Reports are sent anonymously and do not contain any personal data.For legal details, please visit: https://ubuntu.com/legal/systems-information-noticeWe will save your answer to Windows and will only ask you once.Would you like to opt-in to platform metrics collection (Y/n)? To see an example of the data collected, enter 'e'.[Y/n/e]: y 任意で好きなものにしてください。 無駄を省きたい場合は n が多いです。 完了 「ユーザー名@コンピュータ名」が表示される PJをWindowsからUbuntu内に移動 Ubuntu内でコマンドでしていきます。 ルートに移動 cd ~ パス確認 pwd 私の場合こうなります tm@pc240127:~$ pwd/home/tm PJファイルをコピーして移動 cp -r /mnt/Windowに置いてあるPJファイルのパス ~ルートに配置するPJのフォルダ名 co -r :再帰的にコピーするmnt:UbuntuからWindowsを参照してる状態 コピー確認 ls ~ これでコピーしたフォルダが表示されるか確認。 ※無事にできたら、Windows内の元ファイルは消した方が今後紛らわしくないかもしれません。 DockerコマンドをUbuntuで出来るようにする設定 Dockerデスクトップアプリを開く 右上の ⚙ を押して設定を開く Resources > WSL Integration を開く 「Enable integration with my default WSL distro」にチェック UbuntuのスイッチをONにする 「Apply & restart」をクリック 画像 UbuntuでDockerコマンドが動くか確認 Ubuntuのターミナル起動 VS CODEのターミナルに「Ubuntu(WSL)」があるのでそれを選択し、Ubuntuのターミナルを開く プロジェクトフォルダに移動 Ubuntu内のプロジェクトフォルダ(ymlがある場所) cd ~/プロジェクトのフォルダ名 ※ 私の場合です。各自おいてる場所に移動してください Dockerコマンド動かす docker compose up -d 「permission denied while trying to connect to the docker API」 のようなエラーが出たら、権限問題なので以下のコマンドで作成したubuntuのユーザに権限を付与します。 sudo usermod -aG docker $USER 例)私の場合 sudo usermod -aG docker tm このあとパスワード入力して、Ubuntuのターミナルを再起動して再度Dockerコマンド実行で成功するはずです。 補足:開発環境の起動について 普段は以下の流れで起動しています。 Ubuntuのターミナル起動 VS CODEのターミナルに「Ubuntu(WSL)」があるのでそれを選択し、Ubuntuのターミナルを開く プロジェクトフォルダに移動 Ubuntu内のプロジェクトフォルダ(ymlがある場所) cd ~/プロジェクトのフォルダ名 Dev Containerで起動 普段の開発時のVS CODEでのPJの開き方 ※ 「WSL拡張機能 + code .」 で開くと、Ubuntu側にPHPを入れていない場合、PHP拡張機能の警告が出ます。 今回はPHPやComposerはDockerコンテナ内に統一したいので、Dev Containerで開く運用にしました。 さいごに なんか早くしたいだけだったのに結構理解するのは大変。 結局でも仕事だとこういうことは必要になる。 あとLinuxのフォルダは🐧アイコンでエクスプローラに表示されますが、VS CODEからワークスペース追加の時に、エクスプローラーに表示されてなかったりとわかりづらいときあります。
【Docker】【260607】#3 Laravel開発 Windows環境の改行コードの対応

2026-06-11

はじめに 今回はPJ直下にdocker系のファイル、src配下にLaravelファイルがありました。 コンテナで開いたタイミングでdocker系のファイルに予期せぬ改行コードの変換更新が入ることがあったので以下の対応を行いました。 WSL2のUbuntu内にPJファイルを置いてる場合、そもそも改行の問題は起きないと思います。 参考までに。 【Docker】【260606】#4 Laravelの初回起動、F5更新が遅い場合はWSLのUbuntu内にファイルを置く 環境想定 Nginx 1.30.2 Stable PHP 8.5.6 最新 Composer:2.10.1 LTS Laravel 13.14.0 最新 MySQL 8.4.9 LTS Git 最新 ※バージョンは安全のため固定します ※26/06時点 フォルダ構造 以下のような構造でローカルに作業フォルダ、ファイルを作成します Laravel13_sample├─ docker│ ├─ mysql│ │ └─ my.cnf│ ├─ nginx│ │ └─ default.conf│ └─ php│ ├─ Dockerfile│ └─ php.ini├─ src├─ docker-compose.yml ※srcにLaravelが入る ※Docker環境の var/www 内に丸ごとこれを格納し開発を進める (.gitがここのあるのでDocker、Laravel丸ごと状態管理するため) Git管理するテキストファイルの改行コードをLFで管理する PJの直下に .gitattributes を作成 # Git管理するテキストファイルの改行コードをLFで管理する## text=auto:テキスト or バイナリを判断して、テキストなら改行コードを変換する# eol=lf:改行コードをLFで管理する## PJ直下のDockerファイルの改行コードもLFで管理するため追加した#(コンテナ内で予期せぬ更新が発生するときがあった。Windows環境の問題(CRLF))* text=auto eol=lf Git自体の改行コードの変換設定を input に変更 設定方法 ローカルのGitで以下のコマンドを実行 git config --global core.autocrlf input 変更後の確認方法 これで確認し、inputになってればOK git config --global core.autocrlf 補足 ※ローカルのGitが対象 ※コンテナ内は通常LF環境のため、core.autocrlfの設定は不要 ※Laravel・Docker開発ではLFで統一する方が扱いやすい 【Git/GitHub】改行コードCRLFとLFの混在について VS CODEの改行コードもLFで制御しておく これは念のためレベルだと思います。 PJの直下に「.vscode/settings.json」を作成する { "files.eol": "\n" } さいごに Windows環境よくわからないことおこるので、Linux環境(MacやLinux OS)が好まれるんですね・・
【Docker】【260607】#2 Laravel開発環境構築ファイル作成 & 起動

2026-06-07

はじめに 26年時点で手順がかなり変わってたので、過去記事を丸々書き直しました。 過去記事はこちら https://minememo.work/posts/docker3/ 私自身は本番のインフラ設定には詳しくありません。 とりあえず調べつつ動くものを記載しています。 なお、Dockerはインストール済み前提なのでまだの場合は以下の記事を参照してください。 そんなに難しないです。 [【Docker】【260606】#1 Docker Desktopインストール] ( https://minememo.work/posts/docker_260606_01/ ) 環境想定 Nginx 1.30.2 Stable PHP 8.5.6 最新 Composer:2.10.1 LTS Laravel 13.14.0 最新 MySQL 8.4.9 LTS Git 最新 ※バージョンは安全のため固定します ※26/06時点 nginx https://nginx.org/en/download.html PHPサポート期間 https://www.php.net/supported-versions.php PHPリリース https://www.php.net/releases/index.php Composer https://getcomposer.org/download/ Laravelリリースノート https://laravel.com/docs/13.x/releases Laravel細かいバージョンリリース一覧 https://laravelversions.com/ja/13 MySQL https://dev.mysql.com/downloads/mysql/8.4.html フォルダ構造 以下のような構造でローカルに作業フォルダ、ファイルを作成します Laravel13_sample├─ docker│ ├─ mysql│ │ └─ my.cnf│ ├─ nginx│ │ └─ default.conf│ └─ php│ ├─ Dockerfile│ └─ php.ini├─ src├─ docker-compose.yml ※srcにLaravelが入る ※Docker環境の var/www 内に丸ごとこれを格納し開発を進める (.gitがここのあるのでDocker、Laravel丸ごと状態管理するため) localhost http://localhost:8080/ 開発環境構築ファイル作成 ymlファイルを作成 Docker全体の設定管理ファイル Laravel13_sample\docker-compose.yml https://github.com/tm-qc/laravel13-docker-sample/blob/main/docker-compose.yml PHP Dockerファイル作成 docker\php\Dockerfile https://github.com/tm-qc/laravel13-docker-sample/blob/main/docker/php/Dockerfile nginx設定ファイル docker\nginx\default.conf https://github.com/tm-qc/laravel13-docker-sample/blob/main/docker/nginx/default.conf おまけファイル 以下のファイルは今後設定したいときに使う。 今は記載なしです。 MySQL設定:docker\mysql\my.cnf PHP設定:docker\php\php.ini Laravelインストール 一旦コンテナビルド docker compose build src配下にLaravel生成 docker compose run --rm app composer create-project laravel/laravel:13.14.0 /var/www ※時間かかるので完了まで待つ 起動 一旦ここではDockerでlocalhostが開き、LaravelのTOPページが開くかの確認になります。 作業フォルダに移動 cd "docker-compose.ymlがあるフォルダのパス" Docker Desktopを起動 PCでアプリ起動 コンテナ起動 docker compose up -d 下段の「初回起動時のみの作業」を行ったことがない場合は「docker compose up」の後に作業してください 表示確認 http://localhost:8080 Laravel13 Welcomeページ コンテナ終了 docker compose down 初回起動時のみの作業 コンテナ起動後に以下を行う Laravel の APP_KEY作成(アプリケーション全体の秘密鍵) コンテナ内でコマンドプロンプト起動 docker compose exec app bash ※今回はPHPのDockerfileの作業フォルダ「/var/www」= appなのでそこで起動になる ※ymlの「working_dir: /var/www」も同じ設定になってる APP_KEY作成 php artisan key:generate ※「Application key set successfully」が出れば成功 ここで今回はエラーになりました 「ls -la」でフォルダ構造確認し Laravel がなければ、PC の src フォルダを削除して空にし、 bashじゃなくPowerShellでLaravelをインストールし直してください。 インストールし直してコンテナ内にLaravelがあれば成功です。 ※Git Bashのパス変換バグで「C:」とかになるときがあるらしいのでPowerShellで対応します。 docker compose exec app bash LaravelにDB接続設定 .env ※開発用 ※docker-compose.ymlの設定に合わせる DB_CONNECTION=mysqlDB_HOST=dbDB_PORT=3306DB_DATABASE=laravelDB_USERNAME=laravelDB_PASSWORD=password マイグレーション php artisan migrate ※コンテナ内のコマンドプロントで行う 普段の開発時のVS CODEでのPJの開き方 VS CODEでローカルPC(自分のPC環境)のフォルダを開くのではなく、Dockerコンテナを立ち上げて、その環境のVS CODEでファイルを参照し、修正するようにしたほうが良いです。   フォルダから参照してる場合 PHPがコンテナ内で動いてる ローカルPCはPHP自体はなくファイルがあるだけ という状態のため、VS CODEの拡張機能が動かなかったりして不便なことが起きます。 最初はコンテナ内とローカルPC内の違いがしっくりこないかもしれませんが、 Dockerのコンテナ内にPHP環境作ってる 自分のPC内でPHPにはないから拡張機能が動かない 双方は別の世界 と一旦思っておくくらいが良いです。 WSL2のUbuntu内にPJファイルを置いてる場合は、拡張機能 WSLを使って、Dev Containersを使わず code . でも開けますが、結局PHPがなく拡張機能が動かないので、Dev Containersで開くようにしています。 VS CODE の拡張機能 Dev Containersがある確認 無ければインストール Dev Containers コンテナ起動 docker compose up -d WSL2のUbuntu内にPJファイルを置いてる場合は、Ubuntu(WSL) というターミナルをVS CODEで開いて実行してください。 通常のターミナルで起動すると、Ubuntu内のPJファイルじゃなく、結局Windows内のファイルを見ることになるので、読み込みが早くなる恩恵がなくなります。 【Docker】【260606】#4 Laravelの初回起動、F5更新が遅い場合はWSLのUbuntu内にファイルを置く VS CODE左下 >< 見たいなアイコンをクリック 画像 「実行中のコンテナにアタッチ」を選択 画像 いくつか表示されるので Laravel のサービスを選択 今回は laravel_app しています。 VS CODEがもう一個起動します。 画像 ワークスペースで作業フォルダを開く 今回は /var/www 内にGit管理されてるPJがあるのでそれを開きます。 画像 これで作業環境の立ち上げはOKです。 補足ですが、ローカルにしかない拡張機能は画像のように、「コンテナ・・・」という青いボタンがあるので、このボタンを押して再インストールしてください。 コンテナ内の環境の VS CODE なので、再インストールが必要です。 画像 PHPデバッグ XdebugはDockerでインストール済みです。 以下の設定を追加すれば、VS CODEでブレイクポイントなどが使えるようになります。 vs codeのプラグイン「PHP Debug」をインストール VS CodeのXdebug設定ファイルを作成 /.vscode/launch.json https://github.com/tm-qc/laravel13-docker-sample/blob/main/.vscode/launch.json Xdebugの設定ファイルを作成 /docker/php/xdebug.ini https://github.com/tm-qc/laravel13-docker-sample/blob/main/docker/php/xdebug.ini Windows環境の改行コード対応 今回はPJ直下にdocker系のファイル、src配下にLaravelファイルがありました。 コンテナで開いたタイミングでdocker系のファイルに予期せぬ改行コードの変換更新が入ることがあったので以下の対応を行いました。 【Docker】【260607】#3 Laravel開発 Windows環境の改行コードの対応 補足 バージョン確認方法 環境構築後の確認方法 コンテナ起動 docker compose up -d nginxバージョン確認 docker-compose exec nginx nginx -v PHPバージョン確認 docker-compose exec app php -v Composerバージョン確認 docker-compose exec app composer -v インストール済の拡張機能の一覧 docker-compose exec app php -m Laravelのバージョン確認 docker compose exec app php artisan -v DB GUIツール 私はDBeaverを使っています。 今回の設定はポートが3307なので、ツールの接続設定で3307を指定すればつながります。 ※3306がデフォなので、3306で問題ない方は書き換えて使っていただいても大丈夫です。 今回は私がローカルで3306を使っていたので、3307に変更しただけです。 ※MySQL 8で「Public Key Retrieval is not allowed」でつながらないときは、「ドライバのプロパティ」で「allowPublicKeyRetrieval = true」に設定します。 (セキュリティ強化の影響で開発環境なら true でOK) (本番環境だとSSL/TLSを使うので、そもそもallowPublicKeyRetrievalを使わないことが多い) ホットリロード ホットリロードはLaravel / PHP は入っていない。 入れ方もすこし複雑 + フロントしかからないのでF5で更新することも普通とのこと。 ASP.NET COREでは特に意識せずフロント、バックでホットリロード入っていたが、 言語の性質上このような仕様になってるとのこと 今回はReactなどまだ使わずにBlade想定なので、ホットリロードは保留とする。 C#はコンパイル言語 更新監視、再コンパイル・再起動でコード自体更新される PHPはスクリプト言語 コードがそのまま実行されるだけでコンパイルじゃないので、バックはF5更新が必要。 フロントは設定して、Vue/Reactなど両方ともNode.js(Vite)でホットリロードを使うことになる コンテナとローカルのVS CODEの色を変える コンテナ、ローカルと双方でVS CODE開いたときに、どっちかわかりにくいので、色を設定します。 コンテナ内のVS CODEで以下を行う。 Ctrl + Shift + P で設定を開く Preferences: Open Remote Settings を開く settings.jsonにカラー設定を追加する 一番下のステータスバーの背景色 一番下のステータスバーの文字色 一番上のタイトルバーの背景色 一番上のタイトルバーの文字色 { "workbench.colorCustomizations": {"statusBar.background": "#1B5E20","statusBar.foreground": "#FFFFFF","titleBar.activeBackground": "#1B5E20","titleBar.activeForeground": "#FFFFFF"}} ※好きな色でOK Laravelの初回起動、F5更新が遅い場合 【Docker】【260606】#4 Laravelの初回起動、F5更新が遅い場合はWSLのUbuntu内にファイルを置く さいごに Laravelの開発ができるようになりました。 本番のインフラをできるようになりたい・・。
【Docker】【260606】#1 Docker Desktopインストール

2026-06-06

はじめに 26年時点で手順がかなり変わってたので、不足分書き直しました 過去記事はこちら https://minememo.work/posts/docker1/ インストール Learn how to install Docker こちらは公式のインスールマニュアル https://docs.docker.com/desktop/ 最初はDockerを使うためのアプリをインストールしましょう。 このアプリを起動してDockerで仮想環境を起動します。 1.Dockerの公式サイトにアクセス https://www.docker.com/get-started/ 2. Download Docker Desktopをクリック 3. Download for Windows – AMD64 をクリック 私のPCのCPUがintelのCPUだったため、こちらを選びました 4. OKをクリック 画像 少し待つとPC再起動になるので従う 5. 規約確認画面。Acceptをクリック 画像 Docker Desktop アプリが起動します 6. アカウント登録画面 アカウント登録画面。 個人勉強用なら不要。 アカウント登録しない場合は skip で OK。 画像 アカウントが必要になるのは、 Docker Hub にイメージを公開する クラウド連携する チーム利用する といった場合らしいです。 7. WSL(Windows Subsystem for Linux)のアップデート WSLが古い場合のアップデート要請です コマンドプロンプトで「wsl --update」を実行します。時間がかかるので少し待ちます。 アップデート完了後に「Try Again」をクリック 画像 8. 起動確認。インストール完了 画像 さいごに 以前からめっちゃかわってる笑
【Laravel】Laravel6の個人用のメモ

2023-07-18

はじめに Laravel6の完全個人用のメモです。 主な初期設定 個人でとりあえず書き出すレベルの初回の設定なので、プロジェクトによってはもっと沢山あると思います。 1.DB設定 .envファイルで以下に各種設定値を記載する。 Laravel //MySQLの場合 DB_CONNECTION = mysql DB_HOST = mysql DB_DATABASE = db_name DB_USERNAME = user_name DB_PASSWORD = password 2.タイムゾーン config/app.phpを書き換える Laravel 'timezone' => 'UTC' , ↓ 'timezone' => 'Asia/Tokyo' , //日本時間に変更 3.バリデーションの日本語化 本ページの バリデーションメッセージの日本語化について 参照 Laravelでいろいろ反映しないとき 以下のコマンドでキャッシュのクリアをします。 ※他にもあるけど、主に使うコマンド Laravel php artisan config : clear //設定ファイル(.env や config/*.php )のキャッシュをクリア php artisan cache : clear  //アプリケーションのキャッシュクリア DIとは 引数を渡すときにクラスをインスタンス化して、引数として渡すことが出来る機能。 (Classの内部で別のClassをnewしないのがポイントだそうです。) DIを使い事前に依存関係の機能を記載しておくことで、呼び出し時の記載漏れによるエラーを予防できます。 このことを依存関係の解決と良います。 Class内部でインスタンス化しないことで、使いまわしが簡単になる。これがDIのメリットとのこと。 function Sample(ClassName 引数1){}と書くことで、ClassNameというクラスがインスタンス化されて、引数1で書いた変数で使えるようになる。 Laravel_DI例 public $class_name ; public function Sample ( ClassName $class_name ) { //ClassNameをインスタンス化したものを代入して、$this->class_nameというpublic変数で使えるようにしている。 $this -> class_name = $class_name ; } Bladeでのテンプレート参照について XSS対策 {{$変数名}}で参照ができ、自動でXSS対策のエスケープをしてくれます。 また、あまり使うことはないが{{!!$変数名!!}}でXSSのエスケープをしないようにできます。 OR演算子 {{$変数名 or '値なし'}}のようにOR演算子も使えます。 ※値がない場合に「値なし」と表示する。 Vue.jsの変数参照について Vue.jsは{{変数名}}で参照するが、この書き方はBladeの書き方と同じになる。 そのため、Vue.jsの変数として参照する場合は@{{変数名}}と記載すると良い。 サービスプロバイダーとは サービスコンテナの結合(=登録)やイベントリスナー、フィルター、ルートなどを登録する場所のこと。 場所は app/Providers でここにいろんなプロバイダーのファイルが入っている。 サービスコンテナはどこに記載してもいいが、一般的にサービスプロバイダーに結合(登録)の定義を記載しておけば、管理しやすくなります。 またサービスプロバイダーはLaravel起動時に最初に実行される場所になっています。 基本的なメソッドは以下の通りです。 register():サービスコンテナへの登録を行う boot():登録後に実行したい処理を記載する(Laravel起動時に実行されます) サービスコンテナとは サービス(機能)を登録していつでも呼び出せる状態にして、使いまわししやすくする機能。 基本的にはサービスプロバイダー(app/Providers)にbind関数で登録し、makeで呼び出して使う。 結合(登録)方法 結合(登録)するメソッド app ( ) -> bind ( '関数名' , function ( ) ) ; //※$this->app->instance();も同じことみたいです。 app()でサービスコンテナを呼び出してる dd(app())でサービスコンテナの中身が確認できる ↓補足 dd(app())の中にbindingsというものがあり、紐づいているサービスの配列になっています。 bindingsではコンテナに登録しているコードが書いてある場所などの確認ができます。 結合した機能の呼び出し方法 呼び出すメソッド app ( ) -> make ( '登録した関数名' ) ; 以下のメソッドでも呼び出せるとのこと。 App:make('登録した関数名') app('登録した関数名') resolve('登録した関数名') デバッグ方法 ddd();がおすすめ ※Dump Die Debug データ操作時のセレクトや削除の省略 データの指定→取得しなくてもそのデータに対して処理ができることを「暗黙のモデル結合」というみたいです。 ※この例でいうといきなりdeleteしてるように見える。 Laravel_暗黙のモデル結合 /** * 暗黙のモデル結合 * {book}でわたってきたidの本を指定→取得しなくても勝手にそのデータが消えてくれる。 * * ■原理 * 簡単に言うと、URLにある{book}とモデルの$bookの変数名が一緒だから、 * 勝手にURLの{book}のid情報をモデルインスタンスの$bookに渡しておきます。 * という風に自動でしてくれるので、結果セレクトなどで指定しなくても、そのデータに対して処理ができている。ということ。 * */ Route :: delete ( '/book/{book}' , function ( Book $book ) ) { $book -> delete ( ) ; return redirect ( '/' ) ; } formでGET、POSTを使いたい Bladeで@method('DELETE')を使うと実現可能です。 疑似Deleteフォームメソッドといい、POST、GETしか使えないのがformだが、DELETEが使えるような変換をして使えるようにしてくれるそうです。 ルートではRoute::deleteで紐づけることができます。 ファサードとは Laravelが用意してくれてるClass。 useで定義しておいて、CLASS名::関数名と書くことで呼び出せます。 (staticメソッドのように使える機能とのこと) 定義する場所は以下 illuminate\Support\Facades ファサード例 use illuminate \ Support \ Facades \ View return View :: make ( 'profile' ) ; ヘルパ関数 ファサードVSヘルパ関数というページがあるくらい似た機能。 こちらもLaravelが用意してくれてる機能で、どっちをつかってもいいそうです。 ヘルパ関数例 return view ( 'profile' ) ; クラス名::classとは? クラスの完全修飾名(namespaceのパス)を取得できるもの。 名前空間を使うときに役にたつ。 例)UserTableSeederクラスの絶対パスを取得 Laravel UserTableSeeder :: class ダミーデータを作成する 大きく三つの機能があります。 seeder:ダミーデータを登録 faker:ダミーデータを生成 factory:ダミーデータを大量に作成する 使い分けとしては、少量のデータであればseederでOK。 大量のデータを作成する場合はfaker+factoryを使います。 seederの利用例 1.モデルの$fillableで変更可能なカラムとして定義されてるか確認。 例)users tableの場合app\User.php Laravel // ここに定義されてるカラムが変更可能なカラムになる protected $fillable = [ 'name' , 'email' , 'password' ]    2.seederクラスを生成 以下のコマンドで「database\seeds\テーブル名sTableSeeder.php」が生成されます。 artisan php artisan make:seed テーブル名sTableSeeder//例)users tableの場合php artisan make:seed UsersTableSeeder    3.seederクラスのrunに登録したいデータをinsertで記載する。 例)users tableの場合のファイル database\seeds\UsersTableSeeder.php Laravel //TOPでuseを記載 use Illuminate \ Support \ Facades \ DB ; use Illuminate \ Support \ Facades \ Hash ; DB :: table ( 'users' ) -> insert ( [ 'name' => 'test' , 'email' => 'test@gmail.com' , 'password' => Hash :: make ( 'test' ) , ] , //下のようなランダム生成も可能 [ 'name' => Str :: random ( 10 ) , 'email' => Str :: random ( 10 ) . '@gameil.com' , 'password' => Hash :: make ( 'password' ) , ] , ) ; ※2行のデータををこの入れ方で手っ取り早く入れるなら以下のように出来るが、そもそも他のやり方もある。 Laravel //TOPでuseを記載 use Illuminate \ Support \ Facades \ DB ; use Illuminate \ Support \ Facades \ Hash ; DB :: table ( 'users' ) -> insert ( [ 'name' => 'test' , 'email' => 'test@gmail.com' , 'password' => Hash :: make ( 'test' ) , ] , ) ; DB :: table ( 'users' ) -> insert ( [ 'name' => 'test2' , 'email' => 'tes2@gmail.com' , 'password' => Hash :: make ( 'test' ) , ] , ) ;    4.seederクラスのトリガーを記載 まとめて記載するために、database\seeds\DatabaseSeeder.phpに記載します。 Laravel //配列で一気に渡せます $this -> call ( [ UsersTableSeeder :: class , SampleTableSeeder :: class , ] )    5.実行前にオートローダを再生成します。 ※実行時に新しく作ったクラスが呼べないことがあるので、再読み込みします。 composer composer dump - autoload    6.seederを実行し、データを登録します。 以下のようなコマンドがあります。 artisan php artisan db:seed //seederをすべて実行php artisan db:seed --class=UsersTableSeeder //UserTableSeederのみ実行php artisan migrate:fresh --seed //テーブル作成しなおし+seederをすべて実行 認証方法について(Laravel ui) 色々あると思いますが、Laravel6はLaravel uiしかないので、とりあえずその場合の走り書きです。 ルートか、コントローラかで分かれますが、管理しやすいようにチームで決めておくのが良さそう。 ちなみにLaravel8以降はBreeze、Fortify、Jetstreamがあり、Breezeは後者二つが難しいので、簡単に使えるように追加されたもの見たいです。そしてuiはアップデートされないので今後非推奨になるとのこと。 ルートの場合 Route::groupを使ったログイン認証方法 Laravel Route :: group ( [ 'middleware' => 'auth' ] , function ( ) { //ここにまとめて書ける Route :: get ( '/' , function ( ) { return view ( 'welcome' ) ; } ) ; } ) ; コントローラの場合 コントローラクラスのコンストラクタに記載します。 Laravel public function __construct ( ) { $this -> middleware ( 'auth' ) ; } 認証情報の取得方法 Laravel //クラスで参照する場合の例 Auth :: user ( ) ; //複数カラムのデータを取得 Auth :: user ( ) -> id ; //idデータを取得 //テンプレートでの参照 { { Auth :: user ( ) -> name } } さん //コントローラでの参照 use Auth ; $authId = Auth :: user ( ) -> id ; コントローラの階層わけ Exampleフォルダにコントローラを作成した場合 Laravel //作成コマンド php artisan make : controller Example / ExampleController /** * ルートで呼び出し * * ※CRUD:Create(登録)、Read(読み出し)、Update(変更)、Delete(削除) * ※Route::resourceはCRUD操作用のアクションの叩き台が記述されたコントローラー * (リソースコントローラーと呼ぶ)を登録するためのメソッド*/ Route :: resource ( '/example' , 'Example/ExampleController' ) ; //名前空間つきの呼び出し Route :: namespace ( 'Example' ) -> group ( function { Route :: resource ( '/example' , 'ExampleController' ) ; } ) ; Eloquentでの主キーについて 基本的にはidカラムが主キーになります。 変更する場合は、モデルクラスに以下のメンバを記載する。 Laravel //主キーをidカラムから別のカラムに変更 protected $primaryKey = 'id以外の主キーになるカラム名' ; //補足:主キーで採番(AutoIncrement)しない場合は以下を記載 protected $incrementing = 'false' ; created_at、update_atの自動更新について $table->timestampsで自動で「created_at、update_at」二つが生成され、これは自動更新となる。 もし自動更新をしたくない場合は以下を記載する。 Laravel protected $timestamps = false ; ビューの組み込みメソッドについて(ディレクティブ) @extend 引数でビューファイル名(ブレード名)を指定することで、指定したファイルの中身をそのまま表示するディレクティブ。 使用例) 共通のHTMLのBladeを、子テンプレートで@extend('ビューファイル名');のように呼び出す Laravel //bladeファイルが/resource/views/直下の場合 @ extend ( 'ビューファイル名' ) ; //bladeファイルが/resource/views/ディレクトリ1/配下の場合 @ extend ( 'ディレクトリ1.ビューファイル名' ) ; @inclued @extendと似てるが以下の違いがある。 ビューにデータを渡せる @yieldは機能しない Laravel @ inclued ( 'ビューファイル名' , [ '変数名' => '値' ] ) ; @yield @extendで呼び出すBladeファイルの中に記述します。 第一引数に@sectionで指定したセクション名を指定します。 使用例) 親のHTMLのBladeの中で、子のHTML(セクション)を呼び出す Laravel @ yield ( 'セクション名' ) @section @extendで呼び出すBladeファイルの中で、子テンプレートを@yieldで呼ぶためのセクション名を設定するディレクティブ。 使用例) 親の@yieldで呼び出したいHTMLを切り出して管理しやすくする Laravel //使い方は以下の二種 //1.変数にデータを渡す @ section ( 'セクション名' , '渡したいデータ' ) //2.ブレード(HTML)のコードを渡す @ section ( 'セクション名' ) HTML のコード@endsection ビューでのCSRF保護 CSRF(Cross Site Request Forgery)はリクエストごとにサーバーとクライアントでトークンを発行、確認し、リクエストののっとりを防ぐ手段です。 使い方はformに@csrfを組み込むだけです。 Laravel < form method = "POST" action = "URL" > @csrf < label > 入力項目 < / label > < input name = "item" type = "text" > < / form > なお、Vue.js内ではLaravelのblade構文(ディレクティブなど)は組み込めないとのことで、別の方法でしないといけないみたいです。 (便利な@csrfが使えず、色々書かないといけないので勿体ない感じ。) 詳細は参考元にて。 https://tech.amefure.com/js-vue-laravel-csrf ビューでの$errorsについて ビューファイルであればどこでも参照できるエラーの値が入っている変数 withInput()について コントローラでredirect()->withInput()と書くことで、リダイレクト先のテンプレートで入力値をSESSIONから参照できるようになる。 参照方法は {{old('キー')}} のようにold変数とキーで参照します。 なお、withError()もあり、これはエラー文が参照できます。 Laravelでのページネーション PHPで自作していた時より簡単でお手軽です。 1.モデルでの表示データ取得時にgetではなく、paginate(表示したい件数)を使う Laravel $books = Book :: orderBy ( 'created_at' , 'asc' ) -> paginate ( 3 ) ; 2.Bladeでlinks()を使う Laravel { { $books -> links ( ) } } Eloquent save()でのinsert updateの書き方 insertはnew Modelを取得し、それに対して新規登録でsaveします。 Laravel $books = new Book ; $books -> item_name = $request -> item_name ; $books -> save ( ) ; updateは一個対象データを指定してsaveすると、updateになります。 Laravel $books = Book :: where ( 'user_id' , Auth :: user →id ) → find ( $request →id ) ; //update対象のデータはこれになる $books -> item_name = $request -> item_name ; $books -> save ( ) ; cssやjsを読み込む際のパスの書き方 なお、主な読み込み方は以下の3パターン 1.Bladeにscriptタグで直接記載 普通にHTMLにscriptタグで書く方法だが、管理上、かなり小規模じゃない限りあまりお勧めできないかも。 2.jsファイルをpublicに作成してasset()で読み込み public配下にファイルをおいて、テンプレートでasset()で読み込む。 asset()はpublic配下を読み込みます。 ファイルも分割出来てお手軽なので、結構あるかも。 LaravelのBlade < script src = "{{ asset('/js/hoge.js') }}" > < / script > 3. Laravel Mixで作成したjsファイルを読み込む nodeのコマンドnpm run dev(開発期)やnpm run production(本番機)などでコンパイルが必要なので、このあたりの環境があれば出来る方法。 できるならこの方法が一番いいかもしれない。 Laravelのwebpack.mix.js /** * resources/js/配下にjsを作成し、public/js配下にコンパイルされます。*/ mix . js ( 'resources/js/app.js' , 'public/js' ) . js ( 'resources/js/hoge.js' , 'public/js' ) //←追加したjs。 出力名は元のが引き継がれます。 . sass ( 'resources/sass/app.scss' , 'public/css' ) ; マイグレーションファイル作成時のテーブル名について 以下でマイグレーションファイルができるが、テーブル名は「s」をつけて複数形にすることで、自動でテーブルとモデルが紐づけられます。 artisan php artisan make migration create_tableNames_table//例)この場合モデル名は Book になる。php artisan make migration create_books_table モデルクラスでの命名規則 「php artisan make:model モデルクラス名」でModelClassファイルができるが、モデル名はテーブル名を「頭文字大文字でsをなくす」という命名規則でつくる。 これを守ると、上段の「マイグレーションファイル作成時のテーブル名について」を同じで、自動でテーブルとモデルが紐づけられます。 画像のアップロードフォルダについて 基本的にユーザがアップするのは2のフォルダでいいみたい。 public/:ロゴ画像やデザイン用のファイルなど、サービス側のリソースを配置する storage/app/public:ユーザーが投稿した画像等のリソースを配置する(シンボリックリンク設定が必要) ネットをみると 2 が多い。 publicフォルダしか参照できないので、publicフォルダ意外はシンボリックリンクの設定が必要とのこと。 画像表示する際は / から始めるとpublic配下という意味になるので、imagesフォルダを作成し /images/name.png などでimgタグで読み込んだんりする。 ※storage/app/publicディレクトリにはプロファイルのアバターなどのようなユーザーにより生成され、外部からアクセスされるファイルが保存されます。 ※シンボリックリンクは php artisan storage:linkコマンドを使い生成できます。 ※デフォルト設定で、Laravelのアプリのデータ保存先は"storage/app/public"になっているとのこと 画像の受け取り方 流れとしては画像のパスをDBにいれて、ファイルはフォルダに入れる。 そしてコントローラなどで受とるという流れ。 ※HTMLのフォームでは複数種類のデータを扱える enctype="multipart/form-data" を使う Laravel画像受け取りサンプル $file = $request -> file ( 'フォームでのname' ) ; //file取得 //空判定 if ( ! empty ( $file ) ) { $filename = $file -> getClientOriginalName ( ) ; //ファイル名取得 /** * プロジェクトによって違うと思うが、app/public/index.phpが起点になっている場合、 * この指定でapp/public/uploadフォルダができてそこに画像が格納される * * なおmoveは$request->file(illuminate\Http\UploadFileクラス関連のメソッドっぽい) * これ以外のやり方もあるので、適宜確認はする */ $move = $file -> move ( 'upload' , $filename ) ; } else { $filename = '' ; } localhostでjs cssが読み込めない localhostの場合httpsは読めないので、httpにする必要がある。 aseet()の第二引数をfalseにするとhttpになります。 なお、app/Provaiders/AppSeviceProvider.phpのURL::forceScheme('https'); は全体をhttpsにする機能なので、これをコメントアウトしていいかもしれません。 バリデーションメッセージの日本語化について 主に以下の2つを行う。 バリデーションメッセージの日本語化 バリデーションメッセージの項目の日本語化 1.バリデーションメッセージの日本語化 1.config/app.phpの書き換え Laravel 'locale' = 'ja' ; //enから変更 2.以下のコマンドを一個ずつ実行 コマンド //参考:https://readouble.com/laravel/6.x/ja/validation-php.html php - r "copy('https://readouble.com/laravel/6.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');" php - f install - ja - lang . phpphp - r " unlink ( 'install-ja-lang.php' ) ; 3.動作確認 resources/lang に ja フォルダがあるか確認 エラーメッセージが日本語になってるか確認 2.バリデーションメッセージの項目の日本語化 1.resources/lang/ja/Validatin.php の配列 attributes にキー=>バリューで設定する Laravel_例 'attributes' => [ ] , ↓ //キーが変更元の英語表記、バリューが変更後の日本語表記になる 'attributes' = [ 'email' => 'メールアドレス' , ] , phpMyAdminのインストール ローカルでXAMMPやDockerを使って入れたことしかないが、昔参考にした本では、public配下にコマンドでインストール→解凍→アクセスでもいけてたみたい。 特に設定もしなくて、当時繋がったが、この辺りはプロジェクトでインフラ詳しい人に都度確認する。
【Git/GitHub】知ってたら便利系のコマンド

2023-07-17

はじめに 取り消したり、戻したり、確認したりなどの知ってたら便利なコマンドをざっと記載します。 git管理addの状態確認 git_command git status ※編集中でaddされてないファイルは赤文字で表示される ※addされているファイルは緑色で表示される ファイルの変更内容を確認 git_command #git addする前の変更分を表示(ワークツリーとステージ)git diff#git add した後の確認(ステージとリポジトリ)#ネットでは git diff –cached のほうがよく出てくるが出力結果は同じでしたgit diff --staged コミットメッセージの複数行 git_command git commit -m "1行目" -m "2行目" コメント、変更履歴を確認 git_command git log 直前のコミットを打ち消すコミット git_command git revert ※git revert HEADと同じで=一個前(HEAD^)の状態に戻る ※不用意な履歴が増えるのだけが懸念だが、成れないうちはこれが無難 誤pushをとりけしたい git_command git revert↓git push 怖い時は間違ってpushしたのですが、どうしたらいいか。とチームメンバーに相談するのが良さそうです。 https://www-creators.com/archives/2020 ブランチ作成+切り替え git_command git swicth -c ブランチ名#ブランチを新規作成して切り替える ブランチ確認 git_command git branch#ブランチ一覧と緑文字で今いるブランチが表示されるgit branch -a #-a でリモート側も含めたブランチを表示するgit branch ブランチ名#ブランチ名指定でブランチ作成ができる ローカルファイルを編集変更した後に、変更前の最終コミットの状態までローカルのファイルを戻したい git_command git reset --hard HEAD ※ プッシュ前のコミットに対してのみつかわないと履歴が崩れるので危ない らしい ※HEAD^ はひとつ前のコミットまで戻すという意味。二つ前ならHEAD^^となる(~は^と同じ意味) ※HEADなら現在作業中のHEADになる softコミットだけ取り消し mixedコミットとaddを取り消し hardコミット、add、フォルダのファイルも取り消し コミットしていない編集状態を消したり、戻したり Ctrl+ZやCtrl+Shift+Zで直前の状態を消したり、戻したりする感覚で状態を操作できる。 この操作で消したりした内容はメモリに確保される。 例えば、違うブランチで作業してしまい、その内容を戻し、別のブランチのファイルにその内容を反映するみたいなことができる git_command git stash#内容をもとに戻す(消してメモリに確保)git stash pop#消した内容を反映する commitされる前に戻す git_command git restore -s HEAD^ ファイル名 git pullされる前に戻す git_command ##ログ確認git reflog##例)ログの二行目に戻す場合は{1}を指定するgit reset --hard HEAD@{1} git configのスコープ git_command $ git config --local ... # 各リポジトリごとの設定 (.git/config)(優先度:高)$ git config --global ... # 現在のユーザの共通設定 (~/.gitconfig)$ git config --system ... # システム内の共通設定 (/etc/gitconfig など)(優先度:低) さいごに よく使うのだけしか結局覚えれないし、覚えなくてOK
profile_icon
taka
プログラマー
2017年11月から業務でPHPを触りだしたエンジニアです。 業務経験8年程度。 2022年から「要求整理→設計→実装→テスト→リリース」と開発のステップをきちんと経験したく、 転職を始めましたが、なかなか思う通りには・・・いっていません。 現職が自社案件枯渇、本社エリア以外のSES案件の繋がりがなしと急に発覚し、 26/05から急遽強制的に転職活動中。 現職をやめるつもりはなかったし、転職は本当に最後にしたいのでもしよければお声がけください。 参画したPJ、エンジニアとしての経験をまとめたGitHubリポジトリもあります。 https://github.com/tm-qc/project-experience