もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

自分でできる子に育つほめ方叱り方を読んだ

はじめに

こんばんは。

今回はこの本を読みました。

最近子育てに妻と自分ともに悩んでいたので、なにかこの状況を打破できるものはないかなと持ってアマゾンでポチりました。

中田のあっちゃんも動画で紹介してました。

www.youtube.com

www.youtube.com

本題

正直動画見れば大体概要わかっちゃうんですが、自分的に特に刺さった3つのことを残しておきます。

1. 叱る前に、自分の期待が子供の発達にふさわしいものか?大人にとって不都合だから叱っていないか?を一度問い直してみましょう。

以下の言葉にとてもギクリとされました。

子供がもっと遊びたいとぐずるとイライラしてしまうのはなぜなのか。すぐに気持ちを切り替えるべきだと、成熟した大人と同じような期待を子供にしていませんか?

最近子供がよく、ぐずるようになってしまって、よく怒ってしまっていました。

怒っては 「怒り過ぎてしまった」と落ち込んでいる事が多かったです。

明日から、ぐずったときに今一度怒ることかどうかを考えたいと思います。

2. 本来子供が求めているのは評価ではなく、何かを達成したとき、新しいことを発見したとき、嬉しいことがあったときに、大好きな両親や先生とそれを共有することなのです。

これも僕は勘違いしていました。

何かをしたときに、当然100%の気持ちですごいねー!できたねー!と伝えていたのですが、本来はそれを求めているわけではなかったんです。

子供が父ちゃん見てみて!と話してきたときは、一度手を止めてしっかり子供の言葉を聞いて、話をしっかり聞いてあげることが大事だというのがわかりました。

3. 普段の自分の接し方がこの子育ての長期的なゴールの妨げになっていないかを一度考えて見る必要があります。

この文をみるまで、長期的なゴールを想像していませんでした。

ざっくり自立した大人になってほしいというくらいです。

ただ、そうだよねと。

育てていく過程で道標もなしに進むのは危険でした。

仕事も同じく、ゴールが見えてないと、どんどん最終的な理想形からズレていっちゃいます。

妻とも一緒に話した部分でした。

終わりに

本当はもっといっぱいまとめようと思ったのですが、中田のあっちゃんの動画が見つかったので、正直まとめることはなかったですw

ただ、共感してもらいたいという部分はとても勉強になりました。

妻との関係でも使えるような事も書いてありました。

今、子育てに悩んでいる人たちにはぜひ読んでほしいです。

laravelでツリー構造のmodelのリレーション

はじめに。

こんばんは。

かんたんですが、ツリー構造を持っているmodelのリレーションを扱うものがあったので、備忘録として残しておきます。

本題

以下のようなテーブルがあるとします。

CREATE TABLE `categories` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `parent_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

今回、自分の子供の件数を取得したいという要件がありまして、 hasMany で取れるのかな?と思ってやってみました。

Model

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\HasMany;

class Category extends Model
{
    public function children(): HasMany
    {
        return $this->hasMany(self::class, 'parent_id', 'id');
    }
}

取得側

<?php

namespace App\Http\Controllers\Actions;

use App\Models\Category;

class GetCategoryAction extends Model
{
    public function __invoke()
    {
        $categories = Category::query()
            ->withCount(['children'])
            ->paginate();

        dd(array_map(static fn(Category $category) => $category->toArray(), $categories->items()));
    }
}

結果は以下のようにとれます。

^ array:2 [▼
  0 => array:3 [▼
    "id" => 1
    "name" => "XXXXXX"
    "children_count" => 1
  ]
  1 => array:3 [▼
    "id" => 2
    "name" => "xxxxx"
    "children_count" => 0
  ]
]

終わりに

循環参照にだけ気をつける必要がありますが、かんたんにこんな事できるの、いいですね。

現場からは以上です。

gitignore_globalの存在知らなかった

はじめに

こんばんは。また自分の無知をさらけ出すタイプで行きます。

.gitignore_global 知らなかったです。

今まで .DS_Store .idea とかを毎回プロジェクトの .gitignore に追加してました。

ただ最近、個人の設定で追加されるような .idea みたいなのをプロジェクトの .gitignore に追加しないでください。

と言われて、調べると globalで追加される .gitignore_global の存在を知りました...

ドキュメントにもきちんとありましたので、ただの無知でした。

https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files#configuring-ignored-files-for-all-repositories-on-your-computer

本題

$ cat ~/.gitignore_global 
.DS_Store
.idea
_ide_helper.php

こんな感じで早速設定しました。

たしかにこれで毎回追加する必要もないし、それぞれのレポジトリのignore設定を汚さなくても良くなりました。

終わりに

結構長い間git使ってましたが知りませんでした ><

はずかしー

一回ちゃんとgitの本を読んでみようかな。

短いですが現場からは以上です。

Laravel Sanctumのアビリティ試した

はじめに

こんばんは。

前回の続きです。

kojirooooocks.hatenablog.com

短いですがアビリティ試してみました。

本題

前回作ったルートを以下のように修正・追加してみました。

<?php

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;

// register
route::post('/register', function (request $request) {
    $validatedData = $request->validate([
        'name'     => 'required|string|max:255',
        'email'    => 'required|email|max:255|unique:users',
        'password' => 'required|string|min:16',
    ]);
    $validatedData['password'] = Hash::make($validatedData['password']);
    $user = User::create($validatedData);
    return response()->json(['access_token' => $user->createToken('auth_token', ['user'])->plainTextToken]);
});

// normal user login
route::post('/login/super', function (request $request) {
    $credentials = $request->only('email', 'password');
    if (!Auth::attempt($credentials)) {
        return response()->json(['message' => 'login error...'], 401);
    }
    $user = User::where('email', $request['email'])->firstOrFail();
    return response()->json(['access_token' => $user->createToken('auth_token', ['super', 'user'])->plainTextToken]);
});

// super user login
route::post('/login', function (request $request) {
    $credentials = $request->only('email', 'password');
    if (!Auth::attempt($credentials)) {
        return response()->json(['message' => 'login error...'], 401);
    }
    $user = User::where('email', $request['email'])->firstOrFail();
    return response()->json(['access_token' => $user->createToken('auth_token', ['user'])->plainTextToken]);
});

// logout
Route::middleware(['auth:sanctum', 'ability:user'])->get('/logout', function (Request $request) {
  $request->user()->tokens()->delete();
  return "OK";
});

// get myself
Route::middleware(['auth:sanctum', 'ability:user'])->get('/user/myself', function (Request $request) {
    return $request->user();
});

// get user
Route::middleware(['auth:sanctum', 'ability:super'])->get('/user/{user}', function (User $user) {
    return $user;
});

登録時は user というアビリティが付与されます。

そしてログインが二通りあって、 /login/super の場合は user 以外に super のアビリティが付与されます。

super が付与されている場合のみ 自分以外の他のユーザーの情報が見れる /user/{user} にアクセスできます。

データの事前準備

事前に ユーザーデータを2件登録しておきます。

mysql> select * from users;
+----+----------+--------------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
| id | name     | email                    | email_verified_at | password                                                     | remember_token | created_at          | updated_at          |
+----+----------+--------------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
|  1 | kojirock | example@xxx.com          | NULL              | $2y$10$b620QxzvBSd5Vs.lmQQEMulfwq5joOv5zvT1FCoC.pc44LYaLaRYq | NULL           | 2022-07-10 07:55:27 | 2022-07-10 07:55:27 |
|  2 | kojikoji | example_kojikoji@xxx.com | NULL              | $2y$10$6HfoExYa9.SrNDTIpA0F9uPCRN5oGcZTXG99ORtlWCHu6OhfkWFfi | NULL           | 2022-07-16 16:01:58 | 2022-07-16 16:01:58 |
+----+----------+--------------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
2 rows in set (0.00 sec)

ノーマルユーザーでログイン

mysql> select * from personal_access_tokens;
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+--------------+---------------------+---------------------+
| id | tokenable_type  | tokenable_id | name       | token                                                            | abilities | last_used_at | created_at          | updated_at          |
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+--------------+---------------------+---------------------+
|  1 | App\Models\User |            1 | auth_token | 235e76ef3da41fbc897f87215cf9a79821071738357dd61cfa9d16ab92fb537d | ["user"]  | NULL         | 2022-07-16 16:34:20 | 2022-07-16 16:34:20 |
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+--------------+---------------------+---------------------+
1 row in set (0.01 sec)

abilitiesuser がセットされています!

この状態で、アクセスできるURLにアクセスしてみます。

問題なくアクセスできました。

次に、アクセスできないURLにアクセスしてみます。

403でアクセスが拒否されました。

スーパーユーザーでログイン

mysql> select * from personal_access_tokens;
+----+-----------------+--------------+------------+------------------------------------------------------------------+------------------+--------------+---------------------+---------------------+
| id | tokenable_type  | tokenable_id | name       | token                                                            | abilities        | last_used_at | created_at          | updated_at          |
+----+-----------------+--------------+------------+------------------------------------------------------------------+------------------+--------------+---------------------+---------------------+
|  2 | App\Models\User |            1 | auth_token | 2773ee81be6355be8b228a57b1944b32917f1e32c74d0869eb9fea54b4136c6e | ["super","user"] | NULL         | 2022-07-16 16:37:28 | 2022-07-16 16:37:28 |
+----+-----------------+--------------+------------+------------------------------------------------------------------+------------------+--------------+---------------------+---------------------+
1 row in set (0.00 sec)

abilitiessuperuser がセットされています。

この状態で、先程アクセスできなかったURLにアクセスしてみます。

アクセスできました。

終わりに

こんな感じでとてもかんたんでした。

ちなみに今回試さなかった abilities ミドルウェアの方は指定したアビリティを すべて持っていること が条件のようです。

今回の ability ミドルウェアは 指定したアビリティを どれか一つを持っていること が条件です。

今回は1個しか使ってなかったのですが、もっと複雑な権限制御がある場合は効果ありそうですよね。

次は何試そうかなぁ。

現場からは以上です。

Laravel Sanctumを素振り

はじめに

こんばんは。

今回はLaravel Sanctumを試してみました。

基本的に公式のサイトの通りに進めてみます。

github.com

readouble.com

本番

事前準備

$ composer create-project --prefer-dist laravel/laravel laravel-sanctum-example
$ cd laravel-sanctum-example

$ php artisan --version
Laravel Framework 8.83.18

$ php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
Copied Directory [/vendor/laravel/sanctum/database/migrations] To [/database/migrations]
Publishing complete.

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (17.63ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (13.11ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (11.44ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (18.90ms)

app/Http/Kernel.php

        'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, ← コメントアウトを外す
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

routes/api.php

// 追加
use App\Models\User;
use Illuminate\Support\Facades\Hash;

// register
Route::post('/register', function (Request $request) {
    $validatedData = $request->validate([
        'name'     => 'required|string|max:255',
        'email'    => 'required|email|max:255|unique:users',
        'password' => 'required|string|min:16',
    ])
    $validatedData['password'] = Hash::make($validatedData['password']);
    $user = User::create(...$validatedData);

    return response()->json(['access_token' => $user->createToken('auth_token')->plainTextToken]);
});


// login
Route::post('/login', function (Request $request) {
    $credentials = $request->only('email', 'password');
    if (!Auth::attempt($credentials)) {
        return response()->json(['message' => 'login error...'], 401);
    }

    $user = User::where('email', $request['email'])->firstOrFail();
    $token = $user->createToken('auth_token')->plainTextToken;

    return response()->json(['access_token' => $user->createToken('auth_token')->plainTextToken]);
});

// logout
Route::middleware('auth:sanctum')->get('/logout', function (Request $request) {
  $request->user()->tokens()->delete();

  return "OK";
});

HasApiTokens トレイトは試したバージョンではすでに useされています。

register

APIで ユーザーをつくってみます。

DBにもデータが入りました。

mysql> select * from users;
+----+----------+-----------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
| id | name     | email           | email_verified_at | password                                                     | remember_token | created_at          | updated_at          |
+----+----------+-----------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
|  1 | kojirock | example@xxx.com | NULL              | $2y$10$b620QxzvBSd5Vs.lmQQEMulfwq5joOv5zvT1FCoC.pc44LYaLaRYq | NULL           | 2022-07-10 07:55:27 | 2022-07-10 07:55:27 |
+----+----------+-----------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
1 row in set (0.01 sec)

mysql> select * from personal_access_tokens;
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+--------------+---------------------+---------------------+
| id | tokenable_type  | tokenable_id | name       | token                                                            | abilities | last_used_at | created_at          | updated_at          |
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+--------------+---------------------+---------------------+
|  10 | App\Models\User |            1 | auth_token | 2bea84929f6a12012dd9492ba8a73a1cf450f52946487b4e0f0c3767a9cd1165 | ["*"]     | NULL                | 2022-07-10 08:14:12 | 2022-07-10 08:14:12 |
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+--------------+---------------------+---------------------+
1 row in set (0.00 sec)

login

次にログインしてみます。

トークン情報もはいりました。

 select * from personal_access_tokens;
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+--------------+---------------------+---------------------+
| id | tokenable_type  | tokenable_id | name       | token                                                            | abilities | last_used_at | created_at          | updated_at          |
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+--------------+---------------------+---------------------+
| 10 | App\Models\User |            1 | auth_token | 2bea84929f6a12012dd9492ba8a73a1cf450f52946487b4e0f0c3767a9cd1165 | ["*"]     | NULL         | 2022-07-10 08:14:12 | 2022-07-10 08:14:12 |
| 11 | App\Models\User |            1 | auth_token | d29b1ae55dbc78901a423298a20f1272992beee8f7fe5573d758086f0c290177 | ["*"]     | NULL         | 2022-07-10 08:14:12 | 2022-07-10 08:14:12 |
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+--------------+---------------------+---------------------+
2 rows in set (0.00 sec)

get user

取得したトークンをセットして ユーザー情報を取得してみます。

last_used_at にデータが入りました。

> select * from personal_access_tokens;
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+---------------------+---------------------+---------------------+
| id | tokenable_type  | tokenable_id | name       | token                                                            | abilities | last_used_at        | created_at          | updated_at          |
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+---------------------+---------------------+---------------------+
| 10 | App\Models\User |            1 | auth_token | 2bea84929f6a12012dd9492ba8a73a1cf450f52946487b4e0f0c3767a9cd1165 | ["*"]     | NULL                | 2022-07-10 08:14:12 | 2022-07-10 08:14:12 |
| 11 | App\Models\User |            1 | auth_token | d29b1ae55dbc78901a423298a20f1272992beee8f7fe5573d758086f0c290177 | ["*"]     | 2022-07-10 08:14:55 | 2022-07-10 08:14:12 | 2022-07-10 08:14:55 |
+----+-----------------+--------------+------------+------------------------------------------------------------------+-----------+---------------------+---------------------+---------------------+
2 rows in set (0.00 sec)

ログアウトしてみます。

トークン情報は全て消えました。

mysql> select * from personal_access_tokens;
Empty set (0.00 sec)

終わりに

laravel Passportを昔使ったことありますが、結構めんどくさかった記憶(忘れた...)があったので、これくらいかんたんな方がいいですね。

アビリティ使ったことがないので、つぎはアビリティ使ってどんな事できるか試してみます。

現場からは以上です

laravelのマイグレーションsquash試す。

はじめに

こんばんは。

今回はlaravelのマイグレーションsquashを試してみました。

readouble.com

マイグレーションの圧縮 アプリケーションを構築していくにつれ、時間の経過とともに段々と多くのマイグレーションが蓄積されていく可能性があります。これにより、database/migrationsディレクトリが数百のマイグレーションで肥大化する可能性があります。必要に応じて、マイグレーションを単一のSQLファイルに「圧縮」できます。利用するには、schema:dumpコマンドを実行します。

本題

とりあえず現在の状況はこんな感じです。

# php artisan migrate:status
+------+-------------------------------------------------------------+-------+
| Ran? | Migration                                                   | Batch |
+------+-------------------------------------------------------------+-------+
| Yes  | 2022_07_03_000001_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_115334_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_002226_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_162746_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_173628_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_145946_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_171927_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_231312_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_150115_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_232721_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_123222_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_000000_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_125829_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_130608_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_163742_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_182736_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_115056_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_111118_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_205804_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_180337_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_152910_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_201730_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_201142_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_150301_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_140639_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_140717_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_165047_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_171820_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_160136_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_160253_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_162213_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_234404_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_100606_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_100645_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_145901_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_013828_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_165741_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_101855_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_152852_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_190354_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_190424_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_155606_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 1     |
| Yes  | 2022_07_03_145650_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 2     |
| Yes  | 2022_07_03_145821_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 2     |
| Yes  | 2022_07_03_170137_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 4     |
| Yes  | 2022_07_03_104338_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  | 3     |
+------+-------------------------------------------------------------+-------+

実行するコマンドはこちら

$ php artisan schema:dump

ダンプを取りつつ現在のマイグレーションファイルを削除してしまうコマンドはこちら

$ php artisan schema:dump --prune

今回は、後者のコマンドを実行します。

# php artisan schema:dump --prune
Database schema dumped successfully.
Migrations pruned successfully.

実際にマイグレーションファイルが削除されているか確認します。

# ls -la database/migrations 
ls: database/migrations: No such file or directory

ディレクトリごとなくなっています。 では、取得したdumpファイルがどこにあるかというと

# ls database/schema/
mysql-schema.dump

migrations というディレクトリが削除されて schema というディレクトリが作成されて、その下に配置されています。

そしてDBの再構築をしてみます。

# php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Loading stored database schema: /path/to/database/schema/mysql-schema.dump
Loaded stored database schema. (159.91ms)
Nothing to migrate.

ダンプしたファイルが読み込まれています。

終わりに

何年も続いているプロジェクトとかはこういうのあると便利ですよね。

他のフレームワークとかでもないのかなぁとか思ったんですが、cakephpはなかったです。

提案はされてみたみたいですが、結局コマンドでよくね?ってなったみたいですね。

github.com

現場からは以上です。

6月のダイエット成果発表

はじめに

こんにちは。

ダイエット頑張っております。

6月のダイエット成果発表します。

前回のダイエット記事は以下

kojirooooocks.hatenablog.com

本題

前回のダイエットから確実に違うことが1点。

いわゆる停滞期に入りました。

運動しても今まで通り体重が減らないという状態です。

有効な解決策はチートデイを設けるって感じみたいです。

ただ、自分はこういったものを設けると確実に甘えが出ちゃうとおもったので、設けませんでした。

自分のやりかたは

筋トレで基礎代謝を増やす

です。

運動

とりあえず運動は前回と同様で

有酸素運動は FitBoxing

無酸素運動は腹筋ローラー

です。

これに加えて筋トレ増やしました。

増やしたのは腕立てとスロースクワット

www.youtube.com

これをやっていくようにしました。

食事

食事も基本前と変わらないですが、前回より少し緩めです。

朝食

  • ゆで卵x2
  • バナナx1

昼食

  • ゆで卵x2

夕食

炭水化物あってもいいから好きなものを食べる。 ただし、合計でざっくり1,000キロカロリー以下になるようにする。

新たに取り入れたもの

そして今月は以下を取り入れました。

女性のためのソイプロテイン ジェシカズ・フォーミュラ

筋トレ増やすにあたってプロテインって飲んだほうがいいのかな?と素人考えで飲み始めました。

最初は近所のドラッグストアで買おうと思ったんですがとにかく種類がいっぱいあったのでよくわかんないという感じでした。

なので、ネットで紹介されてたこれを購入。

女性用だからかもしれないですが、僕的には飲みやすいのが良かったです。

まだ飲み始めて少ししかたってないのですが、飲みやすいのと単純に美味いので続ける予定です。

結果

6/30時点での体重は 67.4kg

目標だった 66kg台にはわずかに届きませんでした。。。

終わりに

7月こそは 66kg台に行きたいと思います! (夏休み所用で遠出してしまうからそこで御飯食べる羽目になりそうで、無理かもだけど...)

現場からは以上です。