DBeaverを利用して、プライベートサブネットのRDSへ接続する方法

まず、DBeaverとは何か。といいますと。
開発者、データベース管理者、アナリスト、およびデータベースを操作する必要があるすべての人々のための無料のマルチプラットフォームデータベースツール となっております。

DBeaver上からデータベースに対して、アクセスして、データの参照やデータの操作をすることが出来るツールと考えて頂けたらいいと思います。 ターミナル上で、データを確認するのは操作性・可視性の観点でも難しいので、そこを解決してくれます。

さて、本題は、このDBeaverを活用して、AWSのプライベートサブネットに配置してあるRDSへアクセスすることです。

前提としては、RDSのセキュリティグループのインバウンドの条件をEC2からのmysqlアクセスのみしか受け付けていない。ということを前提にしていきます。

この場合、外部からRDSのエンドポイントにアクセスしようとしても、拒絶されてしまいます。

これを解決する方法があります。
sshポートフォワード といわれる手法です。

この辺が詳細に書いている部分だと思います。
https://qiita.com/lighttiger2505/items/ea33291639a8656d50b4

簡単にまとめてしまうと、
「一度、EC2にsshでアクセスして、そこからRDSにmysqlでアクセスする」という手法です。アクセスできるトンネルを作るといった表現をされたりもします。

これを、 DBeaver では簡単に出来てしまいます。

DBeaverで、 sshポートフォワード を実装する

DBeaverの「編集 接続 」で、sshタブを開きましょう。

「SSH Tunnnelを使用する」を選択する。

各項目を設定しますが
ssh接続は、EC2に対して、ssh接続できるためのものです。
なので、
・HOST/IP :EC2のパブリックIPアドレス
・User Name:EC2にログインするためのusername
・Private Key:設定した内容によりますが、pemファイルが置いてあるファイル場所を指定しております。

つづいて、 一般タブを開きましょう。

こちらは、RDSへ接続するための情報です。

・Server Host:RDSのエンドポイント
・Database:作成したDatabase名
・ユーザー名:Databaseへのアクセスが認められているユーザー名
・パスワード:パスワード

これで、Privateサブネット配下にある、RDSに対して、DBeaverを利用してアクセスすることが出来ます。

LaravelでDBファザードのtransactionから返り値を取得する方法

DBファザードにtransactionという、メソッドが用意されています。

メソッドの内容としては、
transaction メソッドの処理内で例外が発生すると(エラーが発生する)と
ロールバック処理されます。

つまり、メソッド内で問題が発生した際に、途中までの処理も全てなかったことにしてくれます。問題おきた際に途中までの処理は完了していると不都合な事態が発生してしまいますので、便利です。

transaction メソッドは返り値を受け取ることも可能です。
メソッド内での処理を、外部で利用することが可能です。
例えば、下記のようにreturn で返した値を$articleの変数で引き受けることが可能です。

 $article = DB::transaction(function () use ($request) {

            $article = RecomendArticle::updateOrCreate(
                ['id' => $request->articleId],
                [
                'title' => $request->title,
                'nickname' => $request->nickname,
                'work' => $request->work,
                'age' => $request->age,
                'sex' => $request->sex,

            );
            return $article;
        }); 

d-flexを使っている際に、英数字を折り返す方法

bootstrapで文字の折り返しは text-breakを利用すると思います。
ただし、d-flexを使っているとこれが効かない…

そこで、下記をCSSに反映しましょう。そうすれば、d-flexを使っていても折り返しが反映されます。

.card-text-break{
    word-break:break-all;
}

Facebookでuser_idを利用して、ユーザープロフィールページへ遷移する方法

LaravelでSNSログイン機能を実装した際に、ユーザーFacebookプロフィールリンクを付けたいと思いました。

ただ、Facebook認証で取得するユーザ情報の中にプロフィールリンクにある情報がない…??となりました。

具体的には、下記のような情報が取得できます。

+token: 
+refreshToken: 
+expiresIn: 
+id: 
+nickname: 
+name: 
+email: 
+avatar 

FacebookのプロフィールURLは
https://www.facebook.com/{識別情報}

ここの識別情報と、SNS認証で取得できるnameが違うのです。

結論としては
SNS認証で取得できるidを使います。

PC

https://www.facebook.com/profile.php?fbid={id}

SP

https://m.facebook.com/profile.php?fbid={id}

これで、Facebookのプロフィールへリンクさせることができます。

LaravelのIntervention Imageで、画像を丸く切り出す方法

Laravelの画像編集ライブラリで有名なIntervention Imageを使ったTIPSです。

四角い画像を読み込んで、丸く切り出す方法を解説します。
CSS的にいうと、radiusあたりの操作といった感じでしょうか。

先にコードを記述してしまうと、下記のような感じです。

$profileImage =  Image::make($user->image_path);

$width = 200;
$height = 200;
$profileImage->widen($width);
$profileImage->heighten($height);

$mask = Image::canvas(200, 200);
$mask->circle($width, $width/2, $height/2, function ($draw) {
    $draw->background('#fff');
});
$profileImage->mask($mask, false);

$profileImage->save($path."circled.png");  

簡単に解説していきます。

$profileImage =  Image::make($user->image_path);

Image::make($user->image_path);
ここで、画像を読み込んでおります。
私の場合は、 $user->image_path ここはAWS S3上UPした画像URLです。
https://oshimen-storage.s3.ap-northeast-1.amazonaws.com/XXXXXXXXXXXXXXXXXXXX
というやつですね。

$width = 200;
$height = 200;
$profileImage->widen($width);
$profileImage->heighten($height);

画像サイズを矯正しております。

$mask = Image::canvas(200, 200);
$mask->circle($width, $width/2, $height/2, function ($draw) {
    $draw->background('#fff');
});
$profileImage->mask($mask, false);

maskを作成しております。
maskと同じ直径のサイズの円を作成して、画像を切り出しております。

Laravelのwherehasで複数のリレーションを繋げてデータ取得する方法

「Laravelのwherehasで複数のリレーションを繋げてデータ取得する方法」というタイトルですが、もう少し詳細に伝えると、
リレーションがネスト化しているデータをwherehasで条件指定してから取得する方法です。

リレーションがネスト化している??一体どういうことと思う方もいるかもしれません。

例えば、
user -> posts がリレーションされていて
posts -> comments がリレーションされている場合です。

今回やりたいことは、user -> post -> comment と一括でつなぎます。
userデータを「commentデータを条件」に取得することです。
例えば、commentで、「よろしく」と言っている条件に絞って、userデータを取得する。と言った感じです。

実際の取得方法では、下記です。
※posts, comments はリレーション名称です。

$commentUser = User::with('posts.comments')
    ->whereHas('posts.comments', function ($query) {
     return $query->where('message', "よろしく");
    })
    ->get();

ネストしたリレーションを取得する場合のポイントは1つです。
リレーションネストを. でつなぎます。

with('posts.comments')
whereHas('posts.comments', function ($query)

と言った感じです。
ご活用下さいませ。

リレーションを利用したデータ取得に関しては下記もご参考下さい。

LaravelでCSSのキャッシュ対策を一番簡単にやる方法

CSSのキャッシュが残ることによって、変更がすぐに反映されないといった問題を抱えます。開発に影響があるだけでなく、リリース後にCSSを変更した場合は、CSSのキャッシュが残ってしまうので、エンドユーザーに対してもCSSキャッシュ問題は発生します。

今回は、とてつもなく簡単にCSSのキャッシュを解決する方法を紹介します。

通常であれば下記のように、HTMLのheader内にCSSを読み込んでいると思います。

<link href="{{ asset('/assets/css/style.css') }}" rel="stylesheet">

下記のように変更して下さい。

<link href="{{ asset('/assets/css/style.css').'?'.time() }}" rel="stylesheet">

追加した部分は「.’?’.time()」を追加しております。

こうすることによって、毎回違うCSSファイル名に変更されます。(参照するファイルの内容は変わりません。)
ファイル名が違うことによって、CSSを毎回読み込んでくれます。

こうすることで、CSSのキャッシュ問題を解決できます。

CSSのキャッシュ解決方法は色々とやり方があるので試してみてください。

Laravelのvalidation機能で画像比率を指定する方法

Laravelはvalidation機能が独自に組み込まれております。
様々な種類のvalidationを設定することが可能です。

今回は、画像比率を指定する方法をご紹介します。
プロフィール画像は1:1の画像に制限したい。などといったvalidationが可能です。

やりかたは非常にシンプルです。

 public function post(Request $request)
{
    $validatedData = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
        'image' => 'required|dimensions:ratio=1/1',
    ]);

    /post内容/

} 
dimensions:ratio=1/1

のように、dimensions:ratio=〇〇
〇〇に指定したい比率を追加して下さい。

Laravelからs3に画像をUP~画像からUP編~

Laravelからs3へ画像ファイルをアップロードする情報はqiitaなどで沢山あるので、そちらを参考に頂けると良いと思います。

今回は、画像からs3へアップロードする方法を紹介します。
画像から??という方もいるかと思います。
一般的にs3のアップロードで使用する方法は、HTMLのFormからファイルをPostして、そのファイルデータ(画像が多いと思いますが)をs3へアップする方法だと思います。

この場合、 <画像>ではなくて<画像ファイル>に変換しております。

つまり、今回ご紹介するのは、
画像を一度画像ファイルへ変換して、s3にアップロードする方法です。

まずは、画像ファイルをそのままアップロードする、最小コードです。

$filename = Storage::disk('s3')->putFile('s3のファイルディレクトリ', $request->file('image'), 'public'); 

※下記実行済みが前提
・$request->file(‘image’)で、画像ファイルがpostされてくること
・.envの処理、composerでライブラリインストールなどは実行済み

上記と同じように画像をアップロードしようとします。

$filename = Storage::disk('s3')->putFile('s3のファイルディレクトリ', $image, 'public'); 

$imageは画像です。
こうすると下記のerrorが発生します。

 Command (HashName) is not available for driver (Gd). 

errorの内容は、
ファイルの形式が扱えない形式であるということです。

画像を、画像ファイル形式へ変換してあげます。

$filename = Storage::disk('s3')->putFile( 's3のファイルディレクトリ' , new File($save_path), 'public');  

$save_path は、storage上のpathです。
storageにある画像を指定しております。

AWSで作成したRDSの設定を.envの設定で接続/DB_HOST,DB_DATABASE…

AWSで作成したRDSを、Laravelの.envに正しく設定する方法を解説致します。

Laravelでローカルで使っている人でも、.envでデータベースの設定はしていると思います。
どんな設定項目があるでしょうか。

DB_CONNECTION=
DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD= 

こちらを正しく設定していくことで、LaravelからRDSとの接続が可能です。
(通常のアーキテクトでは、Webサーバー(EC2)から、RDSへ接続をしていると思いますが)

DB_CONNECTION
 → RDSで選択した、RDSのアプリケーション
   mysqlを選択したので、mysql

DB_HOST
 → RDSで作成したエンドポイントを設定

DB_PORT
 → RDSで設定したPORT番号を設定します。
   DBサーバーの場合は、主に3306が設定されます。

DB_DATABASE
 → RDSで作成したDatabaseの名称を設定します。

DB_USERNAME
DB_PASSWORD
 → データベースに接続可能なユーザー、パスワードを設定します。
   RDS作成時にマスターユーザー名とパスワードを設定することになるので、そちらを設定してください。

以上です。