カテゴリー
Laravel

Laravelのデフォルトページネータの仕様を教えてクレメンス

まずはこいつを見てくれ。こいつをどう思う?

Laravelはこんなんも何も考えずに実装してくれる。最高や。

せやけども、どう言う仕様か突っ込まれることもあるやろし、なんか変更したいとか言われる可能性がなくもない。実際スルー推奨やけども。

とはいえ、説明せなアカンときはテキストで説明するのも憚れるし、これ見てクレメンスで済むように用意したったで。

と言うわけで、説明するゾー。これはあくまで、何もパラメータいじらずに使ったパターンやからね。なんかエグいやつは、そもそもガッツリページネータカスタムした方がええで。これはデフォルト使ってちゃちゃっとやりたいニキ向けや。

せやけども、デフォルトで唯一あると言っていいパラメータは、「現在のページの左右に表示するのは何個分か」だけや。

onEachSideとかでgrepしてくれたらええねんけども、それが初期値では3なんよね。

それがどう言うことかっちゅうのは先のアレを見てもらいたい。「15ページある場合」のセクションや。ほんで、現在のページが8のパターンに着目してもらうと、8を中心に6,7,8と9,10,11となってて、他が省略されとるね。つまりこう言うことやねん。

で、次に見てもらいたいのは、先頭と最後のところやね。

なんで、1,2と14,15になるか。

これはそう言うものなんや。ここは全くいじれない。ガッハ(ガッツリハードコード)や。なんで2個なのか、理由を知りたい。だいたいデザインとか仕様とずれるのはここや…。

最後にもう一つ、「全部で14ページある場合」から省略の(…)が出てくるけれども、これもそう言う仕様やねん。

明確にロジックがわけられているんよ。

最後のページ < ($onEachSide * 2) + 8 みたいな条件分岐がなされていて、これが適用されると省略のパターンにならないんよね。

つまりや、デフォルトのページネータでやってて、テストするときは、ページ数が14以上にならないと出てこないパターンがあるでっちゅうことや。要注意やで!

ところで、これ、みんなどうやって検索するん?
Pagination?Paginator?ページング?

カテゴリー
Laravel

Laravel が急に動かなくなった Late 2020。Undefined index: name 編

ついこの間まで動いていたLaravelが急に動かなくなった。何もしてないのに動かなくなった。むしろ何もしてないから動かなくなったんやろな。Dockerで環境用意してあるやつだけども、いつものように起動してアクセスしてみたらこんなエラーが。

あ、ホンマ…(絶句)

Undefined index: name

なんやねん、これ…。

検討つかんねんけど、コアでこう言うんが発生する場合は、コードの問題やないな。きっとなんかPHPんとこのコンテナがおかしそうやな…。これは教育やろな。

再ビルドっと…。

ビルド時にcomposerがインストールされて依存ライブラリも自動インストールされるんやけども、なんやパッケージが見つからんとか、依存関係がいろいろおかしいで…?

[InvalidArgumentException] has a PHP requirement incompatible with your PHP version, PHP extensions and Composer version

ん?そんな、さすがにPHPのバージョンは固定しとるで…。

Composer (version 2.0.7) successfully installed

そんなもん、オマエ…

なるほど、どうやらComposerの方が生まれ変わったようや…。

なんかいろいろ影響ありそうで、直すの大変やなっちゅうわけで、Composerの方のバージョンを1系に固定して完了や。

Composer、バージョンあがったでっちゅうのをね、伝え羅れればと。

そらね、同じことの繰り返しよ。

カテゴリー
Laravel

LaravelのCacheのPermissionについて (failed to open stream: Permission denied)

artisanを操作するユーザーとWebサーバーの実行ユーザーが違うのは多々あるはずやねん。

artisanを使うときはahraユーザー、webはapacheとかね。ほんでね、お互いグループは共有してるとするやで。つまり、グループでのパーミッション指定があってればええっちゅうこっちゃね。

せやけども、キャッシュ機構(ファイルにストアするやつね)を使ってる箇所があるとするやろ?

そうすると、storage/framework/cache なディレクトに作られるファイルのパーミッションが、artisanのときは、ahra:ahra になるし、webのときは apache:apache になるわけよ。

せやけども、問題はこのファイルのパーミッションが644になってる場合があるわけよね。

ほんで、ahraユーザーで、artisan clear:cache するとさ、

Application cache cleared!

って出るんやけども、実際ね、クリアできてへん。

ほんで、実際にキャッシュ操作するコマンド作って動かしたらさ、webで作られてるとこけるわけやねん。

failed to open stream: Permission denied

やね。

まあ、つまり、キャッシュをファイルに書き出す時のパーミッションをね、グループも書き込み可能にしたいわけやねん。

調べるとさ、カスタムのファイルストアマネージャ作ったとか、ファイルマスク変更するとか、いろいろあったわけやねんけどね、今のLaravel(7.x)ならもっとこう、なんかあるんやないかなって。

あった。Illuminate/Cache/FileStore.phpやね。

    /**
     * Create an instance of the file cache driver.
     *
     * @param  array  $config
     * @return \Illuminate\Cache\Repository
     */
    protected function createFileDriver(array $config)
    {
        return $this->repository(new FileStore($this->app['files'], $config['path'], $config['permission'] ?? null));
    }

出たわね。

パーミッション指定できるやん。というわけで、config/cache.phpのココを

        'file' => [
            'driver' => 'file',
            'path' => storage_path('framework/cache/data'),
            'permission' => 0664,
        ],

こうかな。

これでwebの方で作られたキャッシュファイルを見てみると、確かに、グループが書き込み可能になっとった。これでキャッシュの更新自体は成功や…!たしかに、ahraユーザーでキャッシュ更新する処理は成功するようになったンゴ。

だがしかし、artisan clear:cache の削除はやっぱり効かへん…。

    /**
     * Create the file cache directory if necessary.
     *
     * @param  string  $path
     * @return void
     */
    protected function ensureCacheDirectoryExists($path)
    {
        if (! $this->files->exists(dirname($path))) {
            $this->files->makeDirectory(dirname($path), 0777, true, true);
        }
    }

ふーむ、おかしいな。ディレクトリのパーミッションは指定してるんやが…。

調べるンゴねぇ。

内部的に、mkdir() で、指定のpermissionを渡しているんだが、それでもそうならないのは、mkdir()はumaskによる制限がかかるんやて。

なるほど。

umask()を、ahraユーザーとwebでそれぞれ実行してみた結果。

ahraは0002、webやと0022や。

そら(0777のディレクトリをmkdir()で作ることは)そう(できない)よ。

これは教育やろなぁ。

というわけであとはumaskの設定をってことになるんやが、手取り早いのは、laravelのAppServiceProvider.phpあたりで

    public function register()
    {
        // overwrite umask
        umask(0002);

かな。悪手な気がするけれども。サーバー設定いじれないときはこうするしかない。

これで、ahraユーザー、webのどちらで作られたキャッシュファイルでも同じように操作できるようになったで。

ええんちゃうか、最高ちゃう。

ついでやけども、ログ(config/loggin.php)も同様やね。

        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'permission' => 0664,
        ],

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,
            'permission' => 0664,
        ],

single と daily で作られるファイルのパーミッションが指定可能や。

アプリケーションが稼働し続けることによって自動で作成されたファイルでややこしいことにならないように、最初にはっきりしておきたいところやね。

追記(2020.11.16)

あかん。あかんで。結局オーナーとグループが違うわけやから、動かん。コマンドが先に実行しちゃった場合は、グループがapacheにならへん。

そこで、SGIDよ。

ディレクトリに設定すれば、そのディレクトリ配下に作成されるやつのグループがそいつと同じものになるっちゅうやつやね。

つまり、Laravelなら、storageとbootstrap/cacheに設定しておけばええと思うで。

例えば、storageディレトリのグループがapacheなら。

chmod g+s storage

で。

そしたら、その中に作られるファイルやディレクトリは基本的にapacheになるっちゅうことやね。

セキュリティ的にあれやけども。しゃーない、切り替えていけ。

カテゴリー
プロスピA

実録Sランク確率10%契約書(3)

どういうことや…10%は10%も無いっちゅうのを実証しようとしたらこれやで…。

ほんまに今までS出てへんのや…。収束…。

今回 5-2

通算 8-2 .400

4割や…!

カテゴリー
Laravel

hetemlでLaravel。Swift_TransportException with message ‘Expected response code 220 but got an empty response’

hetemlのレンタルサーバーでLaravelを動かすときに、メールが送れない。件のエラーが出たときの対処法。

そら(本来ならSMTPとかね使うんやけども。いろいろ事情とかあるからね。)そう(今回は、そのまま sendmail を使った。)よ。

.env で、MAIL_MAILER=sendmail にしとく。

そうすると、config/mail.phpの

'sendmail' => [
    'transport' => 'sendmail',
    'path' => '/usr/sbin/sendmail -bs',
],

が使われることになるわけなんやけども。何のことはない。このpath部分を、

‘path’ => ‘/usr/sbin/sendmail -t’,

と、こうする。オプションを変えるだけやね。

-t にしとくと、必要な情報をメッセージから抽出してくれるらしい。設定がきっちりできてれば、-bsでも送れると思うンゴ。

メール送れへん、っていう状態をひとまず緊急回避するための対応やね。適当に使ったら、サーバーに負荷かかる可能性もあるし、最終的にはちゃんとしたメーラー、使ったらええねんな。

カテゴリー
プロスピA

実録Sランク確率10%契約書(2)

スイカ割りログインボーナスのやつ!

これが。

A!

結果

0/2 0%

そらそうよ…。

次!

巧打の達人の上級全クリア報酬のやつ。

これが。

A!

結果

3-0 .000

そらそうよ…。

カテゴリー
プロスピA

実録Sランク確率30%契約書(1)

いや、ほんまにね、今まで当たったためしがないねん。ほんまに30%に収束するんかっちゅう話でね。記録していくで。

プロスピマーケットで交換したやつやね。

これが。

Sやん…

結論

1/1 100%やん…。

ほんまに今まで当たったことないんや…

カテゴリー
プロスピA

実録Sランク確率10%契約書(1)

プロスピA リツイートキャンペーン報酬のやつやね。

結果。

A!

結果

0/1

そらそうよ…。

カテゴリー
AWS

Amazon RDS(Aurora)を定期的に止めたいンゴ

AWSは何にコストがかかるかって言ったら、そらもう(RDSが群を抜いて)あれ(かかる)よ。便利やからね。はっきりわかんだね。

せやけどね、検証環境や開発環境は一年中稼働してる必要はないわけやから、時間を決めてね、止めておきたい。

というわけでね、Lambda使ってね、やってみるで。

まずRoleを作る。

まず、lambda.amazonaws.comが信頼されたエンティティやね。

ほんで、ポリシーとしては、次が必要かな。

  • rds:StartDBCluster
  • rds:StopDBCluster
  • rds:DescribeDBClusters

本番止めてしまったら、そんなもん、オマエ…。

と言うわけで、リソースにはちゃんと対象のARNを指定しておくとええね。

そしたら、Lambda作るで。ランタイムはPython3.8で、実行ロールにはさっき作ったロールを指定する。ちな、RDSはAuroraや。

import boto3
def lambda_handler(event, context):
    client = boto3.client('rds')
    response = client.describe_db_clusters(DBClusterIdentifier=くらすたーの識別子)
    for DBCluster in response['DBClusters']:
        if DBCluster['Status'] == "available":
            client.stop_db_cluster(DBClusterIdentifier=くらすたーの識別子)

これは止める方。次、動かす方や。

import boto3
def lambda_handler(event, context):
    client = boto3.client('rds')
    response = client.describe_db_clusters(DBClusterIdentifier=くらすたーの識別子)
    for DBCluster in response['DBClusters']:
        if DBCluster['Status'] == "stopped":
            client.start_db_cluster(DBClusterIdentifier=くらすたーの識別子)

これだけやね。あとは、それぞれの関数のトリガーにイベントを設定する。今は、「EventBridge (CloudWatch Events)」になっとるんやね。

ルールタイプをスケジュール式にしたときの設定方法は正直意味わからんので、https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.htmlを参照するんやで。

これで、好きなタイミングでRDSを止めたり動かしたりできる。最高や。

カテゴリー
DQMSL

カイザーのスペシャル景品セットを開封するンゴ

マスターメダルが30枚貯まりました。50枚貯めても神獣は抽選やからね。ここはカイザーでええかなって。

カイザーのスペシャル景品セットの中身はこちら。

ほな、いくで〜。

まずは、10連ふくびき券スーパー。

こらもう、遂にわいも超魔王ゲットや…。

ほな頼むで、わたぼう〜。

!?!?!?!?!?

ふぉおおおおおおおおおおおおおおおおおお…!!!!!!

ほんまに…!?

え、え、初の超魔王やから何したらええか全然わからん…。

まあ、紫んところ以外はまあ、もうアレよ。

この勢いでS以上確定2枚もいくで〜。

あ…(察し

つ、次…!

あ…(ンルシア

まあ、今回はもう初超魔王っちゅうことでもうアレや。ほんまにスペシャルな景品セットやった…。おおきにやで…!

ほんで、この超魔王ピサロはクエストで使えるんやろか…?物理パのリーダーがイケる…!?