2020/10/24

Blade ではデフォルトでカスタムクラスを呼び出すことができないため、別途設定する必要があります。

app.php を修正

Laravel ではデフォルトでクラスをオートロードしていますが、その設定は app.php に記述されています。

'School' => App\School::class,


    'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Arr' => Illuminate\Support\Arr::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        'Auth' => Illuminate\Support\Facades\Auth::class,
        'Blade' => Illuminate\Support\Facades\Blade::class,
        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
        'Bus' => Illuminate\Support\Facades\Bus::class,
        'Cache' => Illuminate\Support\Facades\Cache::class,
        'Config' => Illuminate\Support\Facades\Config::class,
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        'DB' => Illuminate\Support\Facades\DB::class,
        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
        'Event' => Illuminate\Support\Facades\Event::class,
        'File' => Illuminate\Support\Facades\File::class,
        'Gate' => Illuminate\Support\Facades\Gate::class,
        'Hash' => Illuminate\Support\Facades\Hash::class,
        'Lang' => Illuminate\Support\Facades\Lang::class,
        'Log' => Illuminate\Support\Facades\Log::class,
        'Mail' => Illuminate\Support\Facades\Mail::class,
        'Notification' => Illuminate\Support\Facades\Notification::class,
        'Password' => Illuminate\Support\Facades\Password::class,
        'Queue' => Illuminate\Support\Facades\Queue::class,
        'Redirect' => Illuminate\Support\Facades\Redirect::class,
        'Redis' => Illuminate\Support\Facades\Redis::class,
        'Request' => Illuminate\Support\Facades\Request::class,
        'Response' => Illuminate\Support\Facades\Response::class,
        'Route' => Illuminate\Support\Facades\Route::class,
        'Schema' => Illuminate\Support\Facades\Schema::class,
        'Session' => Illuminate\Support\Facades\Session::class,
        'Storage' => Illuminate\Support\Facades\Storage::class,
        'Str' => Illuminate\Support\Str::class,
        'URL' => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,
    ],

Laravel で Facade でよく利用される名称に気づくでしょう。

カスタムクラスをアプリ全体で利用する場合は、 app.php の 「aliases」 に追加します。

Item.php を利用してみる

例えば、app/Item.php クラスファイルが以下のように税込計算の static 関数が定義してあるとします。


class Item {
    public static function taxPrice($price, $tax) {
        return $price * (1 + $tax);
    }
}

この Item.php を app.php にネームスペース記述で追加します。


    'aliases' => [
        ....
        'Item' => App\Item::class,
    ],

これで、アプリ全体で利用可能になり Blade ファイルからも利用することができます。


{{ Item::taxPrice(100, 0.1) }} 

app.php に設定する前に

アプリ全体で利用できるのは便利ですが毎回ローディングされるため、たくさんのカスタムファイルや大きなファイルはメモリ消費や負荷を念頭においた方がよいでしょう。

さほど利用しない機能のクラスは、コントローラーで都度呼び出したりミドルウェアなどで処理することが基本となります。 また、Blade でクラスを多用しすぎると MVC の分離ができなるなるのも注意が必要です。

  2020/08/30

現在のブランチと同名で push や pull 

通常 Git でブランチの変更を行うような管理の場合、リモートとブランチ名を指定します。


$ git push -u origin master 

ただ、一人で開発する場合、大規模でない限りブランチを利用することはあまりないと思うので、


$ git push

のようにブランチ指定せずに実行もよいかも知れません。

これは、現在のブランチ名がリモートと同じという条件でなりたちます。

config にデフォルト設定する

現在の状態をデフォルトとする設定をします。


$ git config --global push.default current
$ git config --global pull.default current

config を確認すると、 push.default が current に設定されます。


$ git config -l
...
push.default=current
pull.default=current
... 

これで、ブランチ指定せずに現在の状態で pull、 push できるようになりました。

ただしグループ開発するような時は、省略はしない方がよいでしょう。

  2020/08/30

git pull や git push できなくなったとき、ブランチの間違いやファイルがコンフリクトしている可能性があります。

git pull エラー


$ git pull origin master
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
...

git pull は fetch と merge を両方実行しているので、コンフリクトが発生するとエラーになります。


$ git fetch
$ git merge origin/master

git push エラー


$ git push origin master
...
fatal: refusing to merge unrelated histories
...

マージを実行

マージを実行するとコンフリクトしています


$ git merge --allow-unrelated-histories origin/master
CONFLICT (add/add): Merge conflict in README.md
Auto-merging README.md
CONFLICT (add/add): Merge conflict in .gitignore
Auto-merging .gitignore
Automatic merge failed; fix conflicts and then commit the result.

コンフリクトファイルを修正して、 commit & push します。


$ git add.
$ git commit -m 'confrict'
$ git push -u origin master

-u は --set-upstream の短縮形です。

  2020/08/17

Docker のコンテナからホストOSに接続するのに「host.docker.internal」というホストが用意されています。

Docker for Mac Stable release notes

Docker For Mac での機能なので、Linux ベースでは利用できないかと思います。

Dockerコンテナから Mac の MySQL に接続

mysql コマンドで Dockerコンテナから、ホストOS(Mac)の MySQL に接続する場合、ホスト名に「host.docker.internal」を指定します。


# mysql -u ユーザ名 -h host.docker.internal -p
mysql>

よって、開発のプログラム上でも「host.docker.internal」をホストで設定して利用できます。

Dockerコンテナから PHP で MySQL の PDO接続


$db_name = 'DB名';
$user_name = 'ユーザ名';
$password = 'パスワード';
$host = 'host.docker.internal';
$dsn = "mysql:dbname={$db_name};host={$host}";

try {
    $pdo = new PDO($dsn, $user_name, $password);
    echo "接続成功" . PHP_EOL;
} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage() . PHP_EOL;
    exit;
}

Dockerコンテナから Mac の PostgreSQL に接続


# psql -l -h host.docker.internal -U ユーザ名
                         List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+-------+----------+---------+-------+-------------------
 postgres  | yoo   | UTF8     | C       | C     | 
 sample    | yoo   | UTF8     | C       | C     | 
 template0 | yoo   | UTF8     | C       | C     | =c/yoo           +
           |       |          |         |       | yoo=CTc/yoo
 template1 | yoo   | UTF8     | C       | C     | =c/yoo           +
           |       |          |         |       | yoo=CTc/yoo

  2020/08/17

Mac でそのまま ifconfig を利用すると、IP アドレスがすぐに見つけられません。


$ ifconfig
lo0: flags=8049 up,loopback,running,multicast  mtu 16384
    options=1203 rxcsum,txcsum,txstatus,sw_timestamp 
    inet 127.0.0.1 netmask 0xff000000 
...

ネットワークインターフェイスを指定する

ネットワークインターフェイスを指定すると比較的見やすくなります。


$ ifconfig en0
en0: flags=xxxxxxxxxx mtu 1500
    ether xx:xx:xx:xx:xx:xx
    inet6 xx:xx:xx:xx:xx:xx%en0 prefixlen 64 secured scopeid 0x7 
    inet 192.168.1.6 netmask 0xffffff00 broadcast 192.168.1.255
    ....

「en0」は PC のネットワークボードによってことなりますが、デフォルトはだいたい「en0」です。

フィルタリングする

更に awk で inet の欄をフィルタリングします。


$ ifconfig en0 | awk '/inet / { print $2 }'
192.168.1.6

.bashrc にエイリアスを作成する

フィルタリングのコマンドを打つのも面倒なので、.bashrc に ip というエイリアスを作成します。
※エイリアス名の ip は簡略化しているので自己責任で

vi などで .bashrc を編集します。


$ vi ~/.bashrc

.bashrc に追加しますが、「'」(シングルクォート)は「'\''」とエスケープする必要があります。


alias ipconfig='ifconfig en0 | awk '\''/inet / { print $2 }'\'''

.bashrc を再読み込みします。


$ source ~/.bashrc

ip と入力すると IPアドレスが表示されます。


$ ip
192.168.1.6

  2020/08/17

ホストOS から Docker の MySQLコンテナにログインする場合、以下の方法があります。

  • MySQL コンテナに bash でログイン
  • mysql コマンドでログイン

MySQL コンテナにログイン

他のコンテナ同様、docker-compose で MySQL コンテナに直接ログインします。


$ docker-compose exec コンテナ名 bash

コンテナ名が mysql だった場合


$ docker-compose exec mysql bash

Docker コンテナにログインしたら、MySQL にログインします。


# mysql -u root -p

この方法は、docker-compose が動作するパスで実行する必要があり、MySQL コンテナ内でも mysql でログインします。

mysql コマンドでログイン

次にホスト OS から mysql コマンドでログインしてみます。

つまりは、Docker の MySQL を外部ホストでログインする方法です。


$ mysql -u root -p -h localhost -P 3306 --protocol=tcp

mysql で localhost を指定すると自分の PC を指すため、--protocol で TCP ソケットを指定する必要があります。

  2020/08/16

caching_sha2_password のエラー

MySQL 8 から認証方式がデフォルトで caching_sha2_password に変更されました。

https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatible-connectors

これにより、caching_sha2_password 認証プラグインに対応していないクライアントは接続できません。(phpMyAdmin の最新版は接続できるはずです)

root ユーザの認証プラグインを変更する

本番環境では推奨されませんが、root ユーザの認証方式を旧方式 mysql_native_password に変更する SQL を実行します。


mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
mysql> set global validate_password.policy=LOW;
mysql> set global validate_password.length=4;
mysql> set global validate_password.mixed_case_count=0;
mysql> set global validate_password.number_count=0;
mysql> set global validate_password.special_char_count=0;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

認証プラグインの確認

root ユーザの認証プラグインが mysql_native_password に変更されました。


mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
| yoo              | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

開発環境のため、パスワードの制約もゆるい設定に変更しましたが、本番では厳しめに設定しましょう。

  2020/08/15

node-config とは

node-config は Node.js で設定ファイル(config)を扱うモジュールです。

設定ファイルを JSON、YAML などの形式で記述して、プログラム上でオブジェクトとして利用できます。

環境変数

process.env でサーバの環境変数を取得することができます。Node.js の本番、開発などの環境変数は NODE_ENV を利用しますが、デフォルトは何も設定されていません。


process.env.NODE_ENV

npm インストール


$ npm install config

ファイル構成


プロジェクト
    |- config + default.json
              |- development.json
    |- node_modules/
    |- package-lock.json
    |- package.json
    |- index.js

設定ファイルの作成

JSON 形式でサーバ設定を記述します。

default.json


{
   "server": {
      "host": "127.0.0.1",
      "port": 3000
   }
}

development.json


{
   "test": 1
}

設定ファイルの読み込み

index.js


const config = require('config');
config.env = process.env.NODE_ENV || 'development';

console.log(config.server.host);
console.log(config.server.port);
console.log(config.test);

NODE_ENV を指定してファイルを実行する

NODE_ENV をターミナルで設定すればそのまま node コマンドで実行できます。


$ export NODE_ENV=development 
$ node app.js

明示的に NODE_ENV=develpment でもファイルを実行できます。


$ NODE_ENV=development node app.js

その他プログラムで環境変数の設定や「cross-env」モジュールを利用することもできます。

  2020/08/14

MySQL をセーフモードで起動する

MySQL サーバを停止します。


//CentOS
$ sudo mysql.server stop
//Ubuntu/Debian
$ sudo service mysql stop

セーフモード起動

セーフモードで起動します。


$ sudo mysqld_safe --skip-grant-tables &

MySQLがセーフモードで起動しない場合

MySQLのインストール方法によって、以下のエラーでセーフモードで起動しない場合があります。


mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists

mysqld フォルダがないのが原因を作成します。


$ sudo mkdir -p /var/run/mysqld
$ sudo chown mysql:mysql /var/run/mysqld

別ターミナルでセーフモードログイン確認

root でログインできるか確認してみましょう。


$ mysql -u root

またアプリの MySQL ユーザが root の場合は、設定も変更しておきましょう。

パスワードを再設定する

root でログインします。


$ mysql -u root

root ユーザーのパスワードを空に設定します。 もしパスワードを設定したい場合は、null の部分を文字列で入力してください。


mysql> UPDATE user SET authentication_string=password('新しいパスワード') WHERE user='root';

MySQL からログアウトします。


mysql> exit

root でログイン確認する

セーフモードのMySQL を終了し、MySQL を起動します。


//CentOS
$ sudo mysql.server restart
//Ubuntu
$ sudo service mysql restart

  2020/08/14

Laravel プロジェクトを clone しても動作しない

Laravel のプロジェクトはコアライブラリの vender/ や環境設定ファイル .env など必要のないものは Git で管理しません。

当然 Laravel ライブラリがなければ Laravel の機能が利用できず、artisan コマンドでもエラーになります。


PHP Warning:  require(/Users/yoo/projects/techboost/sample_laravel/vendor/autoload.php): failed to open stream: No such file or directory in /Users/yoo/projects/techboost/sample_laravel/artisan on line 18

Laravel ライブラリをインストール

Laravel のライブラリ(vender/) をインストールします。


$ composer install

※Laravel 用の composer.json が存在しないと、実行できません。

インストールが完了したら、artisan の動作を確認します。


$ cd プロジェクトフォルダ
$ php artisan --version

設定ファイルの作成

.env を作成します。


$ cp .env.example .env

DB の設定などがあれば修正しておきます。

アプリケーションキーを生成

Laravel のアプリケーションキーを再生成します。


$ php artisan key:generate

アクセス権の変更

Web サーバが書き込みエラーにならないようにアクセス権限を変更します。


$ chmod 777 storage
$ chmod 777 bootstrap/cache/

DB のマイグレーション

DB を利用している場合は、マイグレーションもしておきましょう。


$ php artisan migrate

Laravel の動作確認

Laravel の動作確認をしましょう。 Web サーバ経由の場合はそのままブラウザで、Laravel のサーバを利用する場合は Laravel サーバを起動して確認します。


$ php artisan serve
pngファイルの軽量化
Google DriveのIconを再起的に削除
php-markdownでバニラPHPなコードブロック処理
laravel-ffmpeg を使う
2021年版 Ubuntu + certbot + Let's Encrypt でサーバ証明書設定
GihHub のデフォルトでない master ブランチを checkout する
マルチログインで未認証のリダイレクト
Homebrew で Redis をインストール
CSS だけでスムーズスクロール
EC-CUBE4 で Gmail の smtp を利用する
Amazon Linux 2 の amazon-linux-extras とは
UNIQUE カラムのバリデーションで自分自身を除外して更新
フォーム有効期限切れで Page Expired をリダイレクト
ログを日付でローテーションやクリアや削除
Homebrew で PHP8.0 から PHP7.4 にダウングレード
Big sur で zsh 移行と Homebrew アップグレード
Mac に minikube をインストール
途中から .gitignore に追加する
Larevel 6.x から Laravel 8.x にバージョンアップ
Composer で Allowed memory size (メモリ不足)エラー
Blade でカスタムクラスを利用する
git push git pull にブランチ指定せずに実行する
git pull や git push できなくなったとき
Docker のコンテナからホストOS に接続
Mac で ローカル IP アドレス(ipv4)のみを表示する
ホストOS から Docker の MySQLコンテナに接続
caching_sha2_password のエラー
node-config で環境設定ファイルを利用する
rootパスワードを初期化(再設定)する
Git から clone したときのエラー対処
Mac に MySQL をインストール
Mac に PostgreSQL をインストール
Laravel 環境構築 - Mac ネイティブ編
Firebase 入門 - Firebase とは
Firebase 入門 - CLI インストールとデータベースの設定
AWS 無料枠(t2.micro)で容量とメモリエラー
Cloud9 を起動する -初心者編-
gcloud で GCEインスタンスを起動してみる
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証