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

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

2024年の目標

はじめに

こんにちは。

2024年は厄年の始まりのkojirockです。

2024年の目標を建てようと思います。

2023年の目標はこちら

kojirooooocks.hatenablog.com

2023年の振り返りはこちら

kojirooooocks.hatenablog.com

本題

1. 体重を65kgにする

少しリバウンドをして70kgまで戻ってしまいました。

最後の方は運動やめて食事制限だけだったので、それがだめだったのかな...?

今年は少しだけでも運動しつつマイナス-5kgの65kgを目指します。

2. アドベントカレンダーに必ず1つ以上参加する

ここ2年全く熱量がわかず参加しなかったのですが、今年事は必ず1つは参加することを目指します。

3. 毎日10分〜1時間くらい必ず勉強する

去年は本当に勉強意欲がわかず何もしてませんでした。

とりあえず今年は、何を勉強するとかは決めず、勉強する姿勢を取り戻したいです。

そのため必ず毎日10分でも30分でも1時間でもいいので、机に向かって、勉強だけするということをしたいと思います。

終わりに

今年から厄年になりますが、老害と呼ばれないよう、少しずつでも勉強意欲を取り戻したいと思います。

現場からは以上です。

今年もよろしくお願いいたします!!

2023年のまとめ

はじめに

こんばんは。

あけましておめでとうございます。

2023年も本当にお疲れさまでした。

そして毎年恒例2023年の振り返りをやっていきたいと思います。

kojirooooocks.hatenablog.com

本題

1. ダイエットで62kgにする

ブログ書く前に測ってみましたが、70kgで残念ながら未達です。

2. 毎月1冊積本を読破する

今年は全く勉強らしい勉強しなかたので全くの未達です。

3. アドベントカレンダーを必ず1件参加する

去年同様全く参加しなかったので、未達です。

終わりに

2023年はここ3, 4年の中で一番何もできなかった年でした。

勉強もやる気にならないし、ダイエットもやる気にならない、完全なガス欠状態でした。

2024年は少しずつでもギアを上げたいなと思います。

今年もよろしくお願いいたします。

体調が悪いと気持ちも落ちてくる

こんばんは。

雑談です。

10月くらいから子供がインフルエンザ + 溶連菌のダブル感染でとんでもない状態になっていたのですが、その後子供は回復し、次は妻・自分がインフルエンザになり、大変な状況になっておりました。

今月ようやく体調不良が落ち着いたと思ったら、子供がまた溶連菌をもらってしまい、僕も2・3日前に発熱して、ダウンしておりました。

年末というのに体の不調が続いてしまって、仕事も勉強もなかなかうまくいかない状況でした。。。

最近本も買ったのですが、やる気が起きず積本しちゃってます。

最後の締めくくりブログもあんまり書く気になれない。

来年はお祓いでも行って、頑張らないとなぁ。

LaravelのHasOneOfManyを今更試した

はじめに

こんばんは。今回もLaravelネタです。

結構前から触ってたのに全然気づいてなかったのですが、 1:Nな関係のテーブルに対して擬似的に1:1を定義して取得できる機能がありました。

laravel.com

本題

テーブル定義

CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL COMMENT 'メールアドレス',
  `password` varchar(255) COMMENT 'パスワード',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


CREATE TABLE `articles` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL COMMENT 'ユーザーID',
  `type` int unsigned NOT NULL COMMENT 'タイプ',
  `title` varchar(255) NOT NULL COMMENT 'タイトル',
  `body` text COMMENT '本文',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `articles_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ユーザーが持っている記事で最新のもの

    /**
     * @return HasOne<Article>
     */
    public function latestArticle(): HasOne
    {
        return $this
            ->hasOne(Article::class, 'user_id', 'id')
            ->latestOfMany('created_at');
    }

ユーザーが持っている記事で最古のもの

    /**
     * @return HasOne<Article>
     */
    public function oldestArticle(): HasOne
    {
        return $this
            ->hasOne(Article::class, 'user_id', 'id')
            ->oldestOfMany('created_at');
    }

ユーザーが持っている記事で最新のもので type が2のもの

    /**
     * @return HasOne<Article>
     */
    public function latestArticleType2(): HasOne
    {
        return $this
            ->hasOne(Article::class, 'user_id', 'id')
            ->ofMany(
                ['created_at' => 'max'],
                static fn (Builder $query) => $query->where('type', 2)
            );
    }

終わりに

便利な機能があっていいですね。

簡単ですが以上です。

Laravel-PermissionのRoleやPermissionをInertiaに送る

はじめに

こんばんは。

Laravel-Permissionを使用している状態でLaravel + Inertia環境下で、RoleやPermissionを送るための方法を備忘録で残しておきます。

本題

方法は簡単で、HandleInertiaRequests でグローバルに送るのがよさそうです。

<?php

namespace App\Http\Middleware;

use App\Http\Resources\AuthResource;
use App\Models\User;
use Illuminate\Http\Request;
use Inertia\Middleware;

class HandleInertiaRequests extends Middleware
{
    public function share(Request $request): array
    {
        /** @var User|null $user */
        $user = $request->user();

        return array_merge(parent::share($request), [
            'auth' => [
                'user' => $user ? new AuthResource($user) : null,
                // ↓これ↓
                'can'  => [
                    'permissions' => $user ? $user->getAllPermissions()->pluck('name') : [],
                    'roles'             => $user ? $user->roles()->pluck('name') : []
                ]
            ],
        ]);
    }
}

Inertia側はv-ifとかで判定すればOK

例えばパーミッションとかなら以下

<script>
import { usePage } from "@inertiajs/vue3";

const hasPermission = (permission: string | string[]): boolean => {
  const can = usePage().props.auth.can;

  if (!Array.isArray(permission)) {
    return can.permissions.indexOf(permission) !== -1;
  }

  let result = false;
  permission.map((p) => {
    if (can.permissions.indexOf(p) !== -1) {
      result = true;
    }
  });
  return result;
};
</script>

<template>
  <div>
    <p v-if="hasPermission('blog.write')">みえるよ</p>
    <p v-else>みえないよ</p>
  </div>
</template>

終わりに

最近勉強が全然出来てないので、ブログもおざなりになってきました。

勉強ができないくらい忙しいというわけではなく、モチベーションが上がってないという感じです。

ちょっと自己啓発的な本読んで、危機感とモチベーションを高めたいので、なにかおすすめ本あれば教えて下さい。

現場からは以上です。

Laravel+Inertiaでのsentry設定

はじめに

こんばんは。

Laravel + Inertia環境で Sentryを使用することがあったので、めっちゃ簡単ですが設定方法を備忘録で残しておきます。

本番

やり方はとっても簡単で、 resources/js/app.ts に記載するだけです。

import "./bootstrap";
import "../css/app.css";
import { createInertiaApp } from "@inertiajs/vue3";
import * as Sentry from "@sentry/vue";
import { resolvePageComponent } from "laravel-vite-plugin/inertia-helpers";
import { DefineComponent, createApp, h } from "vue";

createInertiaApp({
  title: (title) => `${title} - アプリ`,
  resolve: (name) => resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob<DefineComponent>("./Pages/**/*.vue")),
  setup({ el, App, props, plugin }) {
    const app = createApp({ render: () => h(App, props) });

    // 初期設定
    Sentry.init({
      app,
      dsn: import.meta.env.VITE_SENTRY_DSN_PUBLIC,
      environment: 'development',
      tracesSampleRate: 1.0,
      profilesSampleRate: 1.0,
      trackComponents: false,
      logErrors: true,
      integrations: [new Sentry.BrowserTracing()],
    });

    if (props.initialPage.props?.auth) {
      // もしログインしてたらユーザーIDをセットする
      Sentry.setUser({ id: props.initialPage.props?.auth.id });
    }

    app
    .use(plugin)
      .mount(el);

    return app;
  }
});

 終わりに

もう12月になっちゃいました。

今年は全く成長できた気がしてません。

来年は少しでも成長できたといいたいですね。

今これいうとまとめのブログで言うことなくなるので、このへんで終わり。

laravel-permissionで関連テーブルのprimary keyをuuidにしたい

はじめに

こんばんは。

laravel-permissionを使用する際に専用のマイグレーションを実行すると思いますが、その各テーブルのprimary keyを通常のbig integerからuuidに変更する対応をしたので備忘録です。

本題

対応は以下を見れば大丈夫。

spatie.be

基本的に $this->bigIncrements となっている部分を $this->uuid となる感じです。

Model側は 他のModel同様に HasUuidsをuseするだけです。

Role.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Spatie\Permission\Models\Role as BaseRole;

class Role extends BaseRole
{
    use HasUuids;
}

Permission.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Spatie\Permission\Models\Permission as BasePermission;

class Permission extends BasePermission
{
    use HasUuids;
}

これで各種テーブルのprimary key は uuidになります。

終わりに

簡単な話になりましたが、現場からは、以上です。