Laravelの不具合をサクッと解決!

Laravelを使っていると、開発中にエラーや不具合にぶつかることがあります。ここでは、よくある問題とその解決方法をわかりやすく紹介します。

1. Class “App\Http\Controllers\XxxController” not found

原因

コントローラーが見つからないときは、名前空間のミスやファイルの配置ミスが原因のことが多いです。

解決策

  • app/Http/Controllers/ にファイルがあるか確認。
  • namespace App\Http\Controllers; を追加。
  • composer dump-autoload を実行。
composer dump-autoload

2. .env の変更が反映されない

原因

.env を編集しても変更が反映されないのは、キャッシュが影響している可能性が高いです。

解決策

  • キャッシュをクリアする。
php artisan config:clear
php artisan cache:clear
  • サーバーを再起動する。
php artisan serve --port=8000

3. マイグレーションエラー (`SQLSTATE[HY000] [1045] Access denied for user`)

原因

データベースの接続情報が間違っている可能性あり。

解決策

  1.  .env  の DB_HOST ,  DB_DATABASE ,  DB_USERNAME ,  DB_PASSWORD  を確認。
  2. 変更後、以下のコマンドで設定を反映。
    1. php artisan config:clear
      php artisan migrate
  3. mysql -u ユーザー名 -p  で手動ログインし、アクセス権限をチェック。
     

4. 419 Page Expired エラー

原因

CSRFトークンが送信されていないか、セッションが切れている可能性。

解決策

  • フォームに  @csrf  を追加。
<form action="/submit" method="POST">
    @csrf
    <input type="text" name="name">
    <button type="submit">送信</button>
</form>
  • セッションをクリア。
php artisan session:clear
  •  config/session.php  の  SESSION_DRIVER  を  file  に設定。

5. Route [xxxx] not defined.

原因

指定したルートが定義されていない可能性あり。

解決策

  •  routes/web.php  や  routes/api.php  を確認。
  • ルートを適切に記述。
Route::get('/dashboard', [DashboardController::class,'index'])->name('dashboard');
  • ルートのキャッシュをクリア。
php artisan route:clear

まとめ

Laravelでよくあるエラーとその解決策を紹介しました。エラーが発生したら、

  1. .env 設定やキャッシュを確認
  2. コマンドを実行して設定を更新
  3. 公式ドキュメントもチェック

この流れで対応すれば、大体の問題は解決できます!

【Windows】WSLを使用したDockerの環境構築

【WSLを使用したDockerの環境構築】

 

WindowsにてDockerを使用する際、Cドライブに環境を用意すると読み込みがすごく遅くなります。

その遅さを解決するためにWSL(Windows Subsystem for Linux)を使用します!!

今回はWSLにてDockerの環境構築をする方法をまとめていきます。

目次
――――――――――――――――――――――――――――
1 WSLの導入
2 Dockerの導入
3 設定
4 まとめ
――――――――――――――――――――――――――――

1..WSLの導入

WSL(Windows Subsystem for Linux)を導入する。
Microsoft Store にてUbuntuをインストールする。
インストール完了後、初回起動時にユーザとパスワードを入力しアカウントを作成します。

WindowsからLinux上のファイルにアクセス
エクスプローラから、\\wsl$\にてアクセス可能です。

2.Dockerの導入

公式サイトからインストーラーをDownloadしインストールする。

https://docs.docker.com/desktop/setup/install/windows-install/

3.設定

Dockerの設定からWSL(今回はUbuntu)を許可してあげると使用することができます。

4.まとめ

こんな感じでWSLを使用し、Dockerの環境構築をしてみました!

ぜひご参考になれば嬉しいです。

PANTONE COLOR OF THE YEAR 2025はMocha Mousse(モカムース)

PANTONEからカラーオブザイヤー2025が発表されました。
PANTONE COLOR OF THE YEAR 2025

2025年のトレンドカラーは「PANTONE 17-1230 Mocha Mousse(モカムース)」。
その名の通り、美味しそうなチョコレート色ですね。

思慮深い贅沢さを表現しています。洗練されていて豪華でありながら、同時に気取らないクラシックなPANTONE 17-1230 Mocha Mousse は、控えめで落ち着いたブラウンのイメージから、野心的で贅沢なブラウンのイメージまで、私たちのブラウンのイメージを広げています。
まろやかなブラウンの色合いに注目しています。その色調が持つ豊かさと感覚的で心地よい暖かさは、快適さを求める気持ちや、贈ったり他の人と共有したりできるシンプルな喜びへの耽溺にまで広がります。

カラーデータ

HEX #A47864
sRGB 164, 120, 100
LAB 54.79, 17.05, 18.56

Photoshopのカラーピッカーではこんな感じです。

PANTONE CONNECT

Mocha Mousseを元にしたカラーパレットやシェードも用意されています。
PANTONE CONNECT(要会員登録)

年末年始休業のお知らせ

平素は格別のご高配を賜り、誠にありがとうございます。
株式会社エイブリッジでは誠に勝手ながら、年末年始休業日を下記のとおりとさせていただきます。

【年末年始休業日】
2024年12月28日(土)~2025年1月5日(日)
※2025年1月6日(月)より、通常営業を開始致します。
※休暇中のお問い合わせにつきましては、2025年1月6日(月)以降に対応させていただきます。

ご不便をおかけいたしますが、何卒ご了承いただきますようお願い申し上げます。

リアクティブプログラミングについて

今回はリアクティブプログラミングを簡単に解説させていただきます。
詳細な部分などは省いて説明させていただきますので、その部分を理解したい方はこちらの記事を
閲覧いただいた後に別のサイトをご参考にください。

リアクティブプログラミングとは
リアクティブプログラミングと通常のプログラミングで違うのはデータの流れです。
簡単なソースコードを用意しました。

 

上記のソースコードですが、今のところ問題ないです。
ただ、表示するabridgeC,D,F,Eを追加されるとpushButtonのソースコードが長くなり
管理でも色々問題が起きてきます。

リアクティブプログラミングでは以下のように表現できます。

watchとついているものは、watchの値が変更されると参照先の値も更新されるような仕組みのものです。

上記でいうwatchの部分に関しては各言語でRxSwiftやRxJavaというパッケージで実装されているので
ご自身が使用されている言語でもチャレンジしてみてはどうでしょうか。

以下、リアクティブプログラミングがどのように動いているのかのイメージをめちゃくちゃ簡単に書かせていただきましたので
ご参考になれば幸いです。

データベースのインデックス設計でパフォーマンスを向上させたい

はじめに

データベースのパフォーマンスを向上させる手段としてお手軽でかつポピュラーな方法としてインデックスを作成する方法があります。
しかし、お手軽といってもやみくもに作成すればよいのではなく、しっかりと考えて使わなければ恩恵を受けることはできません。そこで今回は、インデックスを作成するポイントと注意点を最も一般的に使用されるインデックスであるB-treeインデックスを例に解説していきます。

そもそもインデックスとは?

まずはインデックスについて軽く触れます。データベースにおけるインデックスとはレコードを高速に効率よく検索するための≪索引≫です。特定の列を識別できるキー値とそれに結び付けられる実データ、あるいはポインタが格納されています。イメージとしては本の巻末についている索引に近いですね(キー値とポインタ=単語とその単語が載っているページ)。

B-treeインデックス

インデックスと一言にいってもその種類は様々あります。今回は利用頻度の高いB-treeインデックスについて見ていきます(以降インデックスと記されている場合はB-treeインデックスを指している思ってください)。

B-treeインデックスの構造を簡単に図に表すと上記のようになります(正確にはB+treeという構造らしい)
特徴として

  1. ルートノードと子ノードはキー値と子ノードへのポインタを持つ
  2. リーフノードはキー値とデータへのポインタを持つ

といった点が挙げられます

なぜB-treeインデックスが多く使われるのか?

B-treeインデックスには以下のような長所が挙げられます

1.平衡木であるためどのデータに対しても計算量が一定になる

B-treeは平衡木と呼ばれる構造をしています。平衡木はどのリーフもルートからの高さが均一であるため、どんなキーを使ってもリーフまでの距離が一定になります。キー値に左右されず探索を同じ計算量で行うことができます。

2.性能劣化が緩やかである

B-treeは最初に作られたときはきれいな平衡木であるが、テーブルの挿入や更新、削除が繰り返されることで徐々に崩れていき、非木構造のなっていくことがあります。そのため長時間の運用によって探索に費やすコストにばらつきが出るようになってしまいます(自動修復する機能も備わっていますがそれでも長時間運用による劣化は避けられません)。
しかし、B-treeの性能劣化は非常に緩やかであり持続性に優れています。それはB-treeが平衡木であるのと同時に平べったい木であるからです。B-treeのルートからリーフまでの高さは3~5で構成されていることが多く、このように背の低い木はデータの量が増加しても探索速度は変わらない特性があります

3.範囲検索も高速化できる

B-treeは構築されるときに必ずキー値をソートします。そのため特定の値以上・以下を探索というような絞り込みが可能になり、高速化を可能にします

インデックスを作成するのに適した例

インデックスの特徴を押さえたところで次はインデックス作成の恩恵が大きくなる例の特徴について解説していきます

例1:大規模なテーブルに対して作成する

当たり前ですが、レコード数の少ないテーブルにインデックスを作成しても大した恩恵を受けられません。それどころかインデックスは独自のインデックス領域を必要とするため、わざわざ領域を占有してまでインデックスを作成したのに検索性能が上がらない!といった事態になることも考えられます。
では、どのくらいのレコード数がインデックス作成の目安になるのでしょうか。これには明確な基準はなく、ストレージやサーバーの性能といった環境要因について変化しますがレコード数が10万以下の場合はほぼ意味がないと思ってもいいそうです(あくまで目安です)。

例2:カーディナリティの高い列

インデックス作成の判断基準として重要な要素にカーディナリティがあります。カーディナリティとは、ある特定の列における値の種類の多さを表す概念になります。例えば、社員が普通乗用車の運転免許を持っているか否かを表す列「免許所持」の列があった場合、取りうる値はおそらく「TRUE」か「FALSE」の2つでしょう。「免許所持」の列のカーディナリティは「2」ということになります。

このようにカーディナリティの小さい列にインデックスを作成してもあまり意味はありません。カーディナリティの目安は、「特定のキーを指定したときに、全体の5%に絞り込めるだけのカーディナリティがある」ことが目安になります。
しかし、注意点があります。それはカーディナリティが高くても、特定の値にデータが集中している列はインデックスの作成に向いていないという点です。極端な話ではありますが1~10000までの値をとる列があったとしても、1~9999の値は全体の0.1%しか取らず、残りの99.9%は10000の値をとるような列はインデックスの作成に向いていません。

例3:SQLで検索条件や結合条件として使用される列

これも当たり前の話ですが、検索条件や結合条件にならないような列にインデックスを作成しても意味がありません。WHERE句やORDER BY句、テーブル結合でON句に使われるような列にインデックスを作成するようにしましょう。

SQLでの注意点

先ほど、インデックスを作成する列の基準として「検索条件として使用される列」を挙げました。しかし、検索条件として使用されていてもインデックスが使われない場合がいくつかあります。

1.インデックス列に演算を行っている場合

インデックスを作成した列はSQLにおいて「裸」で用いるのが原則となっています

上記ではindex_col列にインデックスが存在するとします。このような場合、インデックスが保持しているデータはあくまで「index_col」に対してであり、「index_col」ではありません。なのでOK例のようなSQLを記述しなければいけません

2.IS NULLが使われている

インデックスはNULLをデータ値としてはみなさず、保持をしません。なのでIS NULLやIS NOT NULLに対しては有効てきではないです。一部のDBMSはIS NULLに対しても有効的に作用しますが、汎用性はあまりありません

3.否定形が使われている

4.前方一致以外のLIKE句の場合

LIKE句を使う場合は、前方一致の場合のみにインデックスが使用されます

以上になります。一部割愛しましたが、ほかにもSQLの記述次第でインデックスが使用されないパターンがあるのでぜひ調べてみてください。

その他の注意事項

SQL以外にもいくつか注意事項があるのでいくつかご紹介したいと思います

1.主キーや一意制約キーの列についてはインデックスを作成する必要がない

DBMSは主キー制約や一意制約を作成する際に、内部的にインデックスを作成しています。そのため、二重にインデックスを作成することになってしまいます。主キーや一意制約キーといった列をSQL文内の条件として使用する場合は、自動的にインデックスが使用されています

2.インデックスによって更新性能を劣化させてしまう

これについてはB-treeインデックスに限らず、インデックス全般に言われていることである。一般的にインデックスは独立したオブジェクトとしてDBMSに保持されている。そのため、インデックスの作成されている対象の列値が更新されると、インデックス内に保持している値も更新しなければならない。つまり、インデックスを作成すればするほどテーブルに対する更新性能が劣化していくというトレードオフの関係に注意してインデックスを作成する必要がある

3.定期メンテナンスの必要性

本記事内でも述べましたが、DBMSを長期的に運用していると、構造がだんだんと崩れていき劣化します。その為、定期的なインデックスの再構築を行うのが望ましいです。
頻度についてはシステムのデータ更新量によるため一概に言えないが、DBMSごとに指標がや調査方法が存在するため、マニュアルで調べてみると良いでしょう。

最後に

以上がインデックスの作成ポイントと注意点になります。こうしてみると実装がお手軽な反面、注意しないといけないことが多いことも分かったと思います。パフォーマンスを改善しようとしたのにかえってパフォーマンスが下がる…なんてことになりたくないですね。また、インデックス・ショットガンと呼ばれるようなアンチパターンも存在するそうなのでいずれ記事にしてみたいと思います。
以上、インデクス設計についてでした!

参考

「達人に学ぶDB設計徹底指南書 第2版」ミック・著

ファイアウォールについて

ファイアウォールって?

ファイアウォール(Fire Wall)とは、「コンピュータネットワークにおいて悪意ある通信や脅威から保護するため、通過させてはいけない通信を阻止するセキュリティシステム」のことを指します。現代で「ファイアウォール」というと、IT分野で使用されることがほとんどだと思います。

ファイアウォールは不正アクセスを遮断し、デバイスの安全性を保つ役割を担っていることから、私達が普段触れているWindowsやMacなどの主要OSにはほぼ必ず搭載されています。デバイスを使用する上では非常に重要な存在だと言えるでしょう。

「ファイアウォール」はどんなのがある?

ファイアウォールには、大きく「2つのカテゴリ」と「3つの保護方式」で分類されます。

1.カテゴリの種類

ファイアウォールは大きく以下2つのカテゴリーに分類され、それぞれで保護する主な対象が異なります。

パーソナルファイアウォール

私達が直接使用する、パソコンやスマートフォンなどの端末を主に保護します。

ネットワーク用ファイアウォール

名前の通り、社内ネットワークなどのネットワーク全体を対象に保護します。ファイアウォールというと、基本的にこちらを指す場合が多いです。

2.保護方式の種類

ファイアウォールは様々な方式で通信の可否を判断します。主な種類として、以下3つの方式があります。

パケットフィルタリング

パケットフィルタリングは、ネットワーク上の通信データを「パケット」という小さな単位で解析して判断する保護方式です。パケットの送信元アドレスや宛先アドレス、使用されるポート番号などの情報を基に通信の可否を判断します。

サーキットレベルゲートウェイ

サーキットレベルゲートウェイは、コネクション単位で通信の可否を判断する保護方式です。対象となるネットワークの中継役としての役割を果たし、ポート指定や制御を可能にします。

アプリケーションレベルゲートウェイ

アプリケーションレベルゲートウェイは、HTTPやFTPなどのアプリケーションプロトコルごとに検査・解析する方式です。プロキシ(代理)サーバーを介して切り離す方式なので、「プロキシ型ファイアウォール」とも呼ばれます。

ファイアウォールで何ができるの?

ファイアウォールは、ネットワークやデバイスを保護するための重要なセキュリティとして認識されています。一口にファイアウォールと言っても、いくつかの機能が存在し、複数の機能が組み合わさることで高度なセキュリティを実現しています。

フィルタリング機能

フィルタリング機能は、ファイアウォールの基礎的な機能の一つです。事前に送信元/送信先のルールを設定し、その設定に基づいて通信の可否を判断します。具体的には、送信元や宛先のIPアドレス、使用されるポート番号、通信のプロトコルなどの情報を基に、通信が安全かどうかを判断します。

IPアドレス変換機能

IPアドレス変換機能は、通常NAT(Network Address Translation)として知られている技術です。この機能は、インターネット上で主に使用する「グローバルIPアドレス」と、社内ネットワークで活用する「プライベートIPアドレス」を変換する役割を果たします。

ログ監視機能

ログ監視機能は、ファイアウォールを通過する全ての通信に関する情報を記録し、それらのログをリアルタイムで監視する機能です。このログには、通信の送信元と宛先のIPアドレス、使用されたポート番号、通信結果(許可・拒否)などの情報が含まれます。

【PHP】標準入力について

PHPの学習中に出てきた標準入力について理解を深めるために書いていこうと思います。

標準入力とは、外部から与えられた入力値を受け取ることができます。
ここでいう外部はキーボードからの意味が多いです。
なので、データはキーボードから入力されるという意味になります。

記載例として以下になります
例:trim(fgets(STDIN));

trim():第一引数に指定した文字列の先頭および末尾にあるホワイトスペースを取り除き、その文字列を返す。
fgets():第一引数に指定したファイルポインタから1行取得し、その文字列を返す。
STDIN:標準入力を表す定数。自動的に標準入力の値が入る。

という感じになります。
業務で見るというよりは、PaizaやSLスタジオなどの学習サイトで見ることが多いので
学習を始めてから懐かしい気分になりました。

以上、標準入力についてでした。

LaravelのPipelineについて

今回はLaravelのPipelineについて調べてみました。
Laravelの公式ドキュメントには以下のように記されています。

LaravelのPipelineファサードは、一連の呼び出し可能なクラス、クロージャ、またはcallableを通して与えられた入力を
「パイプ」する便利な方法を提供し、各クラスに入力を検査または修正する機会を与え、パイプライン内の次のcallableを呼び出します

簡単にざっくり説明すると「Pipelineに何らかのデータを入れてそれに対して指定したクラスの処理をさせるもの」です。

基本となるPipelineのコードは以下の通りです。

Pipeline::send(/* 処理させたいクラスに渡すデータ */)
    ->through(/* 処理させたいクラスの配列 */)
    ->then(/* 最終処理 */);

処理させたいクラスに渡すデータ
処理させたい対象のデータです。
文字列やQuery、オブジェクトなどなんでも渡せます。

処理させたいクラスの配列
sendメソッドで渡されたデータを処理させたいクラスを以下のように配列形式で指定します。

Pipeline::send(/* 処理させたいクラスに渡すデータ */)
    ->through([
        ClassA::class,
        ClassB::class,
        ClassC::class,
    ])
    ->then(/* 最終処理 */);

ClassA → ClassB → ClassCの順番で処理が実行されます。

最終処理
thenメソッドに実装された処理は必ず実行される処理です。
実行されるタイミングはthroughメソッドの処理が完了した後です。

実装例

class Pipeline
{
    public function handle()
    {
        $string = "abcde";
        $string = Pipeline::send($string)
            ->through([
                SubStr::class,
                AddString::class,
            ])
            ->thenReturn();
        var_dump($string);
    }
}
class SubStr
{
    public function handle($string, $next)
    {
        $string = substr($string, 1, 4);
        return $next($string);
    }
}
class AddString
{
    public function handle($string, $next)
    {
        $string = $string . "123";
        return $next($string);
    }
}

このような実装をすると先にSubStrクラスで2文字目〜4文字のみ取得され、”bcde”が$stringにセットされます。
次にAddStringクラスで”bcde”の後ろに”123″が文字列結合され最終的に「bcde123」が返されます。

以上、Pipelineが何か気になり調べた結果をまとめてみました。

PHPでの配列の取り扱いについて

【PHPでの配列の取り扱いについて】

最近、配列を使っているときになんとなくで実装してるなと思ったので、ちゃんと理解するためにまとめていきたいと思います。

目次
――――――――――――――――――――――――――――
1 配列
2 連想配列(多次元連想配列)
3 比較表
4 まとめ
――――――――――――――――――――――――――――

1.配列
・添え字が数字
・0から始まって要素が増える毎に添え字の数字も1増える

# 初期化
$配列名 = [値1, 値2, 値3];
# 要素の追加
$配列名[] = 値;
# 要素にアクセス
$配列名[キー番号];

2.連想配列(多次元連想配列)
・添え字を自由に決められる配列

# 初期化
$配列名 = [
キー1 =&gt; 値1,
キー2 =&gt; 値2 ...
];
# 要素の追加
$配列名[キー名] = 値;
# 要素にアクセス
$配列名[キー名];

3.比較表
・それぞれの動きを表にまとめてみました。

コード 配列 連想配列 多次元連想配列
in_array
array_key_exists
array_merge

4.まとめ
配列はちゃんと理解して使うに越したことはないですね。
以上で、「PHPでの配列の取り扱いについて」でした~