夜の歌

プログラミング、音楽、本について緩く書いていきます。

【Laravel・Illuminate/Cache/Repositoryクラス】コンストラクタに引数として設定されているインターフェイスのバインド箇所を調査する①

何を調査したいのか

Illuminate/Cache/Repositoryクラスのコンストラクタに引数として設定されているインターフェイスのバインド箇所を調査したい。

なぜ調査したいのか

Cache::get()メソッドの実行クラスの処理を確認した際に時間がかかったので、今後の時間節約のために知りたい。

ちなみに、Cache::get()メソッド実行時のクラスはconfig/cache.phpのdefaultの設定がfileの場合、Illuminate/Cache/Repository.phpになる。どうやって実行クラスを確認したかとういうと、vendor配下を「n add( 」で検索しキャッシュ関連の処理を追っていって発見した。しかし、これでは非効率過ぎる。もっといい方法が知りたい。

少しずつ調査していき、このブログに記録していく。

【Docker】Docker for Mac上のコンテナから、Mac上のRedisにアクセスできなかった。。

チャットを作ろうとしたが、なかなかDocker for Mac上のコンテナからMac上のRedisにアクセスできなくて苦戦した。出力されたエラーは下記。

Connection refused [tcp://127.0.0.1:6379]

tcpdumpを使って、コンテナからMac上のRedisへの通信を確認してみる。コンテナからRedisへの通信を実行したが、通信は行われていなかった。どこが原因なんだ。

調べていくと「127.0.0.1」はコンテナ自身を指すとのこと。あぁ、そうだよ。。コンテナからMac上のアプリケーションへの通信方法を調べてたら、下記記事を見つけた。 qiita.com
ホストの指定を「127.0.0.1」から「host.docker.internal」に変更し、動作確認。コンテナからRedisへの通信が問題なく行われていることを確認した。

『生命科学者たちのむこうみずな日常と華麗なる研究 』 仲野徹

文庫版のおまけとして、『「超二流」研究者の自叙伝』と銘打って仲野先生の話も書かれている。最初の研究室での話、ドイツ留学、本庶佑研究室での研究など詳しく書かれていて面白い。

どうやら、本庶佑研究室での研究は、大変なストレスの中で行われたようだ。生命科学の三大誌に筆頭著者での論文掲載経験がなければ、廊下の真ん中を歩いてはいけない雰囲気。しかも、中途採用で知り合いが一人もいない厳しい状況。いくら、仲野先生が自己肯定感が高いとはいえ、ストレス感じそう。

strposのfalseチェックについて

strposで検索対象文字列に検索文字列がない場合、falseが返ってくる。では、falseチェックはどうするか。個人的には、厳密な比較演算子を使うのがベターだと思う。

<? php
$result = strpos('test', 'niku');
if($result === FALSE){
    echo 'FALSEです。';
    exit();
}


他のPHPの関数を使った場合の挙動はどうなるか。 例えば、emptyを使ってstrposの結果が入った変数をチェックした場合。strposは、検索文字列が検索対象文字列の最初にあった場合には0を返すので、emptyのチェック結果はtrueになる。

<? php
// $resultに0は入り、emptyの結果はtrueになる
$result = strpos('test', 't');
if(empty($result)){
    echo 'FALSEです。';
    exit();
}

ちなみに、PHP マニュアルにも似たようなことが書かれている。 https://www.php.net/manual/ja/function.strpos.php

『発酵野郎! 世界一のビールを野生酵母』鈴木成宗

発酵野郎!: 世界一のビールを野生酵母でつくる

発酵野郎!: 世界一のビールを野生酵母でつくる

伊勢角屋麦酒のビールを、最初に飲んだのはいつだったか。飲んだのは、確かペールエール。初めて飲んだ当時、ビールが好きじゃなくて、どうかなと思って飲んだ。これが美味しくて、あれからビールが好きになってしまった。ビール最高。

本書を読むまで、鈴木さんはビールが好きで、事業を始めたんだろうなと思っていた。だけど、本当の目的は酵母と戯れることだったらしい。。どいうこと!酵母と遊びたくて事業を始めるって、すごい勇気。怖くなかったのかな。これで上手くいくの?って思ったけど、やっぱり上手くはいってなかった。90年代末、ビール事業の影響で鈴木さんは無給だったらしい。

結構衝撃だったのは、鈴木さんはある時期まで、お客様が何を求めているかを考えていなかったらしい。マジか。本書に明確な時期は書かれていなかったけど、考え始めたのが2003年の世界大会で金賞を取った後。ということは、1997年にクラフトビール市場に参入後、結構な期間ということになる。そこから、この成功。凄いな。

本書を読んだ後、クラフトビールが飲みたくなった。スマホで良さそうなお店を見つけて、出発。なんと伺ったお店に、伊勢角屋麦酒のヒメホワイトがあったので早速注文。本書にも書かれてるけど、ヒメホワイトは伊勢の酵母で作られたビール。美味しかったなぁ。また、飲もう。

【Laravel】updateメソッドで保存する時にハマった

データの更新をする際に、updateメソッドを使って実行。そして、ハマった。そのコードは、下記。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Model\Book;

class BookController extends Controller
{
    public function index(Request $request)
    {
        $book = Book::where('page', 100)->get(['page'])->first();
        $book->page = 5;
        $book->update();
    }
}

ログに実行したsqlを出力しているので、確認してみる。

[2019-08-31 15:52:22] local.INFO: Query Time:11.06s] select `page` from `book` where `page` = ?  
[2019-08-31 15:52:22] local.INFO: Query Time:1.53s] update `book` set `page` = ?, `updated_at` = ? where `id` is null

2行目でupdate文のsql。コード上では、「wehre is null」は使っていない。恐らく、updateメソッド内で実装しているのかな。

それで、下記のようにgetの指定カラムにidを追加したら想定通りの動作になった。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Model\Book;

class BookController extends Controller
{
    public function index(Request $request)
    {
        $book = Book::where('page', 100)->get(['id', 'page'])->first();
        $book->page = 5;
        $book->update();
    }
}

ログも確認

[2019-08-31 16:07:58] local.INFO: Query Time:17.51s] select `page`, `id` from `book` where `page` = ?  
[2019-08-31 16:07:58] local.INFO: Query Time:4.01s] update `book` set `page` = ?, `updated_at` = ? where `id` = ?

where句でidを使って絞り込みをかけるようになっていた。なるほど、面白い。updateメソッドの処理の確認をしてみよう。

Laravelで処理途中でDBの変更をしたい

Laravelで処理途中でDBの変更をしたい。どうすればいいのか。答えは、config/database.phpのconnections.mysql.databaseの値を変更する。下記、コードで変更できる。

\Config::set('database.connections.mysql.database', 'test_db');


ただ、一度DBに対してアクセス後に上記コードを実行しても、connections.mysql.databaseの値自体を変更できるが、アクセス先のDBは変更はできない。うーむ、何故。

恐らく、1度DBにアクセスした後にアクセス先のDBをキャッシュしているのかな。調査する。

【Laravel】任意のルートパラメーターの挙動について

任意のルートパラメーターが設定されている時、されていない時の挙動を確認した。サンプルコードを含め確認した内容を記す。

まずは、wbe.php

// web.php
<?php
Route::get('okinawa/{urasoe?}', 'OkinawaController@index');


続いて、サンプルで作ったOkinawaController。ルーティングに設定した任意のルートパラメーターurasoeを取得する処理が実装されている。

// OkinawaController.php
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class OkinawaController extends Controller
{
    public function index(Request $request)
    {
        var_dump($request->urasoe);
        exit();
    }
}


任意のルートパラメーターが設定されているパターン
・実行URL

http://localhost/okinawa/urasoe

・結果

string(6) "urasoe"


任意のルートパラメーターが設定されていないパターン
・実行URL

http://localhost/okinawa

・結果

NULL


任意のルートパラメーターの値は$requestオブジェクトのプロパティから取得できる。任意のルートパラメーターが設定されている場合、string型の値が取得できた。また、ルートパラメーターが設定されていない場合にはNULLを取得。

ふと思ったけど、string型の数値をrequestオブジェクトのプロパティから取得した場合には、どのような型になるのか。ちょっと、気になる。

※参考 readouble.com

本屋に行って本を探したが。

今日、『仲野教授の そろそろ大阪の話をしよう』を買いに本屋さんへ。ただ、探しても見つからないので店員さんを探す。しかし、店員さんも見つからない。やっと、見つけて探してもらったけど置いてないとのこと。残念。。

ちょっと思ったけど、スマホで店内の本を探せるサービスがあったらいいな。お客さんにアプリをインストールさせるのは難しいからWebで。そのWebサービスQRコードが表示されている紙を店内に貼れば、お客さんは使ってくれるんじゃないかな。どうだろう。

いや、どうかな。