OmniAICreator/Qiita-1.07M huggingface dataset:
Svelte5でn回ループしたいときの書き方が改善されたぞ！

# はじめに

Svelte 5.4.0では、`{#each}`構文を使ってn回ループさせる方法が改善されました！
本記事では、今までの書き方と比較しながらどのように変わったのかを説明します。

# 今までの書き方

Svelte 5.4.0以前では、次のような書き方をする必要がありました。

書き方1
```svelte
{#each Array(10) as _, i}
  <p>{i}</p>
{/each}
```

書き方2
```svelte
{#each { length: 10 } as _, i}
  <p>{i}</p>
{/each}
```

この方法では少し癖があり、冗長な書き方に感じるかもしれません。また、`_`を定義しているのに使用していないため、Lintで警告が出ることもあり、面倒です。

# 改善された書き方

新しい書き方では、`as`を使う必要がなくなり、よりシンプルになりました。`_`のような無駄な変数を定義する必要がないので、Lintの警告も発生しません。

```svelte
{#each { length: 10 }, i}
  <p>{i}</p>
{/each}
 ```

[デモ](https://svelte.dev/playground/c0dad46975754fe99055f670747731ab?version=5.4.0)

[ドキュメント](https://svelte.dev/docs/svelte/each#Each-blocks-without-an-item)

# さいごに

以前私は、[Svelteでn回ループ表示させたい時の書き方を考える](https://qiita.com/oekazuma/items/845adf3be476190b9a21)という記事を書き、どのような書き方がベストなのかを考えました。今回の構文改善によって、理想的な書き方ができるようになり嬉しいです！

Svelteは、「Advent of Svelte」と題してクリスマスまで毎日SvelteやSvelteKitの新機能やドキュメントサイトの改善をリリースするというおもしろい企画を実施中です。これからも注目していきたいですね！

https://svelte.dev/blog/advent-of-svelte

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Day 2 — `each` without `as`, for when you just want lots of one thing<br><br>- docs <a href="https://t.co/hUwTXtqI0t">https://t.co/hUwTXtqI0t</a><br>- demo <a href="https://t.co/Xl3Y0z5SX4">https://t.co/Xl3Y0z5SX4</a> <a href="https://t.co/2u8qhuDStd">pic.twitter.com/2u8qhuDStd</a></p>&mdash; Svelte (@sveltejs) <a href="https://twitter.com/sveltejs/status/1863597344031220191?ref_src=twsrc%5Etfw">December 2, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Pythonで時刻歴データの包絡線を書く

# 時刻歴データを扱っている時，ピーク値を俯瞰したようなグラフをプロットしたい．
![スクリーンショット 2024-11-07 8.18.20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/db256d23-3b86-35aa-cf84-97ed84783264.jpeg)

```envelope_both.py
# -*- coding: utf-8 -*-
import numpy as np
from scipy import fftpack
from matplotlib import pyplot as plt
 
# FFTをする関数
def fft_ave(data, samplerate, Fs):
    fft = fftpack.fft(data)                      # FFT（実部と虚部）
    fft_amp = np.abs(fft / (Fs / 2))             # 振幅成分を計算
    fft_axis = np.linspace(0, samplerate, Fs)    # 周波数軸を作成
    return fft, fft_amp, fft_axis
 
# サンプルの時間領域信号を生成
dt = 0.001
t = np.arange(0, 1, dt)
wave = np.cos(2 * np.pi * 50 * t)
wave *= (1 + 0.5 * np.sin(2 * np.pi * 2 * t))
wave *= (1 + 0.5 * np.sin(2 * np.pi * 10 * t))
wave += 1
wave_ave = np.average(wave)
plt.figure()
plt.plot(t,wave)
plt.show()
wave = wave - wave_ave

# FFTする
fft, fft_amp, fft_axis = fft_ave(wave, 1 / dt, len(wave))
 
# 負周波数域（ナイキスト周波数以降）を0にする（実部と虚部の両方）
zeros = np.zeros(int(len(fft) / 2))
fft[int(len(fft) / 2):len(fft)] = zeros
 
# 正周波数域（ナイキスト周波数まで）を2倍する
fft *= 2
 
# 操作した実部と虚部を持つ周波数波形をIFFTし、絶対値をとる（包絡線を得る）
ifft_time = np.abs(fftpack.ifft(fft))
 
# 下側の包絡線を計算
lower_envelope = -ifft_time
 
# ここからグラフ描画
# フォントの種類とサイズを設定する。
plt.rcParams['font.size'] = 14
plt.rcParams['font.family'] = 'Times New Roman'
 
# 目盛を内側にする。
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
 
# グラフの上下左右に目盛線を付ける。
plt.figure()
plt.plot(t,wave+wave_ave, label='original', lw=1)
plt.plot(t, ifft_time+wave_ave, label='upper envelope', lw=1)
plt.plot(t, lower_envelope+wave_ave, label='lower envelope', lw=1)

plt.legend()
 
# グラフを表示する。
plt.show()
plt.close()
```
![スクリーンショット 2024-11-07 8.19.29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/f1019a79-3f41-5e9e-b2c0-36567874910f.jpeg)
チームにスクラム開発を導入するにあたって効果的だった取り組み

この記事は ZOZO アドベントカレンダー Series7 の 3 日目の記事です。

# はじめに

はじめまして、ゆうき（[@tanayu7777](https://twitter.com/tanayu7777)）と申します。

以前、開発チームにスクラムマスターとしてスクラム開発を導入する機会があり、その際に効果的だった取り組みについてまとめました。
尚、本記事では、スクラム開発の基本概念や役割についての説明は割愛し、導入時に特に効果を発揮した取り組みに焦点を当てて解説します。スクラムの基礎知識については[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)をご参照ください。

スクラム導入の前提条件は以下の通りです。

- **筆者以外のチームメンバーはスクラム開発の経験がない**
- **チームは主にバックエンドと SRE 領域の開発を担当**
- **私自身は前職でスクラム開発を経験済み（Certified ScrumMaster® 資格取得)**

# スクラムを導入する理由

まず、チームメンバーに「なぜスクラムを導入するのか」「導入によるメリットは何か」を説明し、共通認識を持つことが重要です。事前にスクラムの概要を説明した上で、以下の導入にすることのメリットを共有しました（[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)を参考）。

- **透明性の確保**：「誰が」「いつまでに」「どの目標の達成のために」「何の作業をしているか」が明確になる
  - **早期にズレやミスを発見できる**
  - **情報共有が活発になり、属人化を防止できる**
  - **各メンバーが短いサイクルでのコミットメントを持ち、「何を」「いつまでに」行うべきかが明確になる**
- **検査と適応のサイクル**：短いスプリント（約2週間）で目標や成果物、開発体制を振り返り、改善できる
  - **潜在的な問題を早期に検知できる**
  - **プロダクトやプロセスの改善ポイントを特定できる**
  

以上の点をチーム内で合意し、全員が納得した上でスクラム開発を進める体制を整えました。また、プロダクトオーナー（PO）の役割を担うプロジェクトマネージャー（PM）にも同様の説明を行い、合意を得ています。

# スクラムの導入方法

次に、スクラムをどのように導入するかをチームと共有しました。具体的な準備事項や変更点が不明確だと混乱を招く可能性があるため、以下の2つの取り組みを行いました。

## 1. スクラム導入までのロードマップ作成

「いつまでに」「何を準備・用意する必要があるか」を示したロードマップを作成し、チームに共有しました。これにより、導入までのタスクとスケジュールが明確になり、見通しを持つことができると考えました。

![スクラム導入ロードマップ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634021/d3094d3f-cdda-fc1f-3d15-0699d682f4ef.png)

## 2. 開発プロセスの変更点の説明

スクラム導入によって既存の開発プロセスがどのように変わるのかを、下記の図を用いて説明しました。各セレモニーが開発プロセスのどの段階で、どのような役割を果たすのかを具体的に示しました。

![開発プロセスの変化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634021/10ca2488-e5d0-84ba-4d54-32528b673c84.png)


これらの取り組みにより、チームメンバーはスクラム導入までのプロセスを明確に理解し、混乱を避けることができたと考えています。

# おわりに

上記の取り組みを通じて、チームメンバーが納得し、混乱せずに比較的スムーズにスクラム開発を導入できたと感じています。スプリントを重ねるごとにチームは成長し、自己組織化が進んでいることを実感しています。

スクラム導入を検討されている方やチームの参考になれば幸いです。
C♯ の文字列の i 文字目と j 文字目を入れ替えるメソッド

C♯ で文字列の
i 文字目と j 文字目を入れ替える処理を書くのに
時間をかけたくないため
メソッドにして公開します。

```csharp:i 文字目と j 文字目を入れ替えるコード
public class ShiftStringer {
        public static string ShiftString(string targetString, int i, int j)
        {
            System.Text.StringBuilder resultString = new(targetString);

            char oneTime = resultString[i];
            resultString[i] = resultString[j];
            resultString[j] = oneTime;

            return resultString.ToString();
        }
}
```

効率的に入れ替えるために
StringBuilder を使用しています。
resultString を string にすると
resultString[i] に char を代入できません。

簡単な処理ですが
地味に実装に時間がかかったため
皆さんにこの処理を実装するための
無駄な時間を取って欲しくないため
今回公開する事にしました。

短いですがこの記事はここまで。

この記事が皆さんがこの処理を実装するための
無駄な時間を削る事ができたならば嬉しいです。

閲覧ありがとうございます。

***

追記

コメント欄にて
メモリ効率を考慮したバージョンを
提案頂きました。

そちらの方が
高速で動作するハズなので
是非コメント欄もご確認頂けると
幸いです。
PHPStan Larastan 警告対象のファイルに誤りが無いのにエラーが出る

## 概要

LaravelにLarastanを導入しチェックレベル2でコードをチェックした。
警告が出たが、対象のファイルに問題は見当たらなくてちょっと詰まったので簡単にまとめる。

## 警告内容

```
 ------ -------------------------------------------------------------------------------------------------------- 
  Line   Http/Controllers/Settings/IndexController.php                                                       
 ------ -------------------------------------------------------------------------------------------------------- 
  7      Class App\Http\Controllers\Controller referenced with incorrect case: app\Http\Controllers\Controller.  
         🪪  class.nameCase                                                                                      
  12     Class App\Http\Controllers\Controller referenced with incorrect case: app\Http\Controllers\Controller.  
         🪪  class.nameCase                                                                                      
 ------ --------------------------------------------------------------------------------------------------------
```

## 警告対象のファイル

とりあえず警告の対象のファイルを見てみる。

`use App\Http\Controllers\Controller;`は特段問題ないように思える。

```app/Http/Controllers/Settings/IndexController.php
<?php

declare(strict_types=1);

namespace App\Http\Controllers\Settings;

use App\Http\Controllers\Controller;
use Illuminate\Contracts\View\View;

class IndexController extends Controller
{
    /**
     * Handle the incoming request.
     */
    public function __invoke(): View
    {
        return view('settings.index');
    }
}

```

## 原因

継承元の`app/Http/Controllers/Controller.php`の名前空間の記載に問題があった。

```app/Http/Controllers/Controller.php
<?php

declare(strict_types=1);

namespace app\Http\Controllers;

abstract class Controller
{
    //
}
```

確かに名前空間の指定でappの頭文字が小文字のaになっている。本来はAになることが正しい。

## 解放方法

継承元の`app/Http/Controllers/Controller.php`の名前空間の指定を下記の様に指定したらエラーは解消された。

```app/Http/Controllers/Controller.php
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

abstract class Controller
{
    //
}
```
laravel sailで構築されたアプリケーションのコードをcloneして構築する

## 概要

下記で構築しリモートリポジトリにアップしたlaravel sailで作成したコードをcloneして再度構築する方法を簡単にまとめる。

## 前提

構築するPCのローカルに下記が入っていること

- Docker
- PHP
- composer

## 方法

1. コードをclone
1. cloneしたディレクトリに移動
1. 下記コマンドを実行

    ```terminal
    composer intall
    ```

1. .envファイルの作成

    ```terminal
    cp .env.local .env
    ```

1. 下記コマンドを実行してバックグラウンドで実行

    ```terminal
    ./vendor/bin/sail up -d
    ```

1. コンテナ内部でcomposer管理下のパッケージをinstall

    ```terminal
    ./vendor/bin/sail composer install
    ```

1. DBがある場合は下記コマンドを実行してマイグレーションを実行

    ```terminal
    ./vendor/bin/sail artisan migrate
    ```
laravel sail 便利そうなコマンド

## 概要

下記で構築したsailを使ったlaravelのアプリケーションで使えるコマンドを羅列しておく

https://qiita.com/miriwo/items/59e000f847c1b23eb377

下記の内容を実施し、sailコマンドのエイリアスを登録した。

https://qiita.com/miriwo/items/3627b70a5044f966fa88

## 環境の停止

```terminal
sail down
```

## 環境の起動（バックグラウンド実行）

```terminal
sail up -d
```

## artisanコマンドの実行

```terminal
sail artisan 〇〇
```

## composerコマンドの実行

```terminal
sail composer install
```

## Node npmコマンドの実行

```terminal
sail node --version
sail npm run production
```

## テストの実行

テストのDB設定は`phpunit.xml`に記載する

```terminal
sail test
```
laravel sail コマンドのエイリアスを追加してsailコマンドを楽に使おう

## 概要

sailは`./vendor/bin/sail`のようなコマンドを割と多様する。
そのまま実行しても良いのだがターミナルてタイピングするとちょっと大変なのでコマンドのエイリアスを登録してみる。

## 前提

筆者のPCのOSはMac OSでターミナルのシェルはBash

## 方法

`.bash_profile`に下記の様な記載をしている。

```.bash_profile
if [ -f ~/.bash_aliases ]; then
    source ~/.bash_aliases
fi
```

筆者はエイリアス系の記載を`.bash_aliases`に記載している。そのため公式ドキュメントでは`.bashrc`にエイリアスの指定をすると記載されているが、筆者は`.bash_aliases`に追記する。

1. `.bash_aliases`に下記の内容を追記

    ```.bash_aliases
    alias sail='sh $([ -f sail ] && echo sail || echo vendor/bin/sail)'
    ```

1. 下記コマンドを実行して`.bash_aliases`を再読み込み

    ```terminal
    source ~/.bash_aliases
    ```

1. 下記コマンドを実行してエイリアスの設定を確認

    ```terminal
    sail -h
    ```

エラーが出なければ完了

## 参考文献

https://laravel.com/docs/11.x/sail#configuring-a-shell-alias
[ポエム]　記事を書く理由

こんにちは、rickyです。

ある日所属しているコミュニティで記事を執筆する際に何を書けばいいかという質問を見かけました。
そこでこの記事では私がこれまでどういう意図で書いてきたのかをザックリと書いていきます。

まだ記事を書いたことのない方や記事を書くのに躊躇してしまう方の後押しになれば幸いです。

## 記事を書く理由
**・忘れるから**

これに尽きます。
とにかく新しいことが降り積もるIT業界においていちいちすべてを記憶することはできません。
もちろんそれができる方もいるとは思いますが、私は自分のスキルや記憶力に極端に自信がある方でもないのでしょっちゅう忘れます。
そこで忘れた時に自分の記事を見て再現できるように書いています。
そんな時にこのやり方はどうだったかな？という時に記事を見返します。
細かなテクニックやドキュメントのわかりづらい部分を解説した記事を作成しておき、それを読み返すことで再度調べ直す手間を省けます。

では何をどう書くと良いのかを説明します
・問題点
・参考にした情報
・環境

この３つが特に重要です。

### 問題点
ここはタイトルでわかるようにしましょう。
自分が探す時にも便利ですし何を意図した記事なのかが明確になっていると内容が散らからずに済みます。
あれもこれもと詰め込むのでなくタイトルの要素に必要な内容を漏れなく過剰にならず書くといいでしょう。

### 参考にした情報
これは極力ドキュメントのそれを引用するようにしましょう。
ドキュメントの内容はまず廃れにくいかつ正確なためまず正しいことが多いです。
ただドキュメントだけでは細かな単語の理解や背景知識までは提供してくれないので適宜個人ブログや別の方の記事を引用しましょう。

### 環境
意外と見落としがちな観点で環境の情報が抜けてしまうことがあります。
自分の環境をいちいち書くのはやや面倒ですが、書いておくと再現性が高まります。

## 最後に
記事を書くことは自分への一番の手助けになります。
なぜなら自分の書いた文体というのは何度も見返す上で比較的読みやすいものへと変化していきますしミスしやすい所や詰まってしまうところも大体自分がやるので同じような箇所に収束するからです。

記事の質や評価数を気にしてしまって手が止まってしまったり良い記事を書こうと気負ってしまう方もいるかもしれません。
また技術力のある方から鋭い指摘を受けることを恐れてしまっているのかもしれません。
ただ間違ったことを大っぴらに書いたり、他の技術やスキルをコケにするような文体でない限り大抵の人はそこまで記事に注意を払いません。
質を追求する姿勢は重要ですが記事を執筆するという行為で目立とうとするのではなく、エンジニアの能力は記事を書くことでなく、質の高いシステムの構築やチームのプロダクトに貢献できることの方が重要です。
記事はあくまでそのための一部であって主目的ではないということを意識されるといいでしょう。

記事を書くことは孤独な時間かもしれませんが懸命な姿勢は誰かしらの目に触れるものです。
SNSを通じて書いた記事についてポストや投稿することでそういった方からのアクションが得られやすくなるでしょう。

またもし間違いを指摘していただけるのであればそれは自分のスキルを向上させれるまたとない機会ととらえるのが健全です。
コメントでいきなり威圧的に話しかけてくる方はかなり珍しいですし、また問題提起をするタイミングではほとんどの方が丁寧に言うものです。
もちろん相手の方の意見や考えが自分の中で照らし合わせたものと違っている場合はそのことを率直にコメントしお互いがどうして意見の相違に至ったのかを明らかにすることが大切かと思います。

この記事を読んだ方が記事を書く良いモチベーションを得られたのでしたらこれほど嬉しいことはありません。
ここまで読んでいただきありがとうございました。
Stable Diffusion 3.5 にそっと触れる

まったく画像生成AIを触ったことがなかったので初心者になるために経験。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/43eba410-9245-93c7-17b9-5f5f606b946e.png)

`APIを使う`からアカウント作成画面に。
>Creating your account with Google's social login will grant you 25 free credits!

なのでGoogleアカウントで作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/5b71c65b-742d-0d38-084f-3e8c67d51664.png)

APIキーをもらう。右上のアカウントアイコンクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/804caf0d-d7d7-7c35-e12a-66ea4daf5a7d.png)

ページトップから`APIを使う`で表示されたページで`Request samples`が`curl`のものをこぴって、`sk-MYAPIKEY`をもらったAPIキーに変更して叩くのが簡単そうだ。
```sh
curl -f -sS "https://api.stability.ai/v2beta/stable-image/generate/sd3" \
  -H "authorization: Bearer sk-r4r*******************************2dA" \
  -H "accept: image/*" \
  -F prompt="Lighthouse on a cliff overlooking the ocean" \
  -F output_format="jpeg" \
  -o "./lighthouse.jpeg"
```

AWS CloudShellから実行してみた。まずはデモどおり、"Lighthouse on a cliff overlooking the ocean"なものができるのか確認。数秒でファイルできたみたいで`アクション`からダウンロード。ちゃんとできていた。
```sh
[cloudshell-user ~]$ ls -l
-rw-r--r--. 1 cloudshell-user cloudshell-user 325686 Nov 28 08:05  lighthouse.jpeg
```

ちょっと作りたい画像があったのでGoogleに英訳してもらったもので実行。
```sh
curl -f -sS "https://api.stability.ai/v2beta/stable-image/generate/sd3" \
  -H "authorization: Bearer sk-r4r*******************************2dA" \
  -H "accept: image/*" \
  -F prompt="A hawk moth resting on the nose of a small dog in cartoon" \
  -F output_format="jpeg" \
  -o "./skacyba.jpeg"
```

できたもの。うーん、漫画チックなのを期待してたのに。。。それに鼻にも乗っとらん！
基本的なところを理解してないけどこの程度のものはできるってことね。
![skacyba.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/ba1e6353-d6e3-a8b3-0216-90cd1e0810cc.jpeg)

### クレジット消費は？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/9b5183ca-7a2d-9808-2da6-333155d970d2.png)
上記までで13クレジット消費している？のか？最初の25の状態のスクショ取るの忘れてた。。。

> Credits
> - SD 3.5 & 3.0 Large: Flat rate of 6.5 credits per successful generation.
> - SD 3.5 & 3.0 Large Turbo: Flat rate of 4 credits per successful generation.
> - SD 3.5 & 3.0 Medium: Flat rate of 3.5 credits per successful generation.

だから、Largeのrate6.5で2回生成したってことでしょうな。
【React】React Zoom Pan Pinch を使ってみた

# はじめに
この記事では、React 用の Zoom / Pan / Pinch ライブラリである React Zoom Pan Pinch の利用手順を記載します。

https://github.com/BetterTyped/react-zoom-pan-pinch

# 開発環境
開発環境は以下の通りです。

- Windows 11
- React 18.3.1
- TypeScript 5.5.3
- React Zoom Pan Pinch 3.6.1

# インストール
まずは以下のコマンドでインストールします。

```powershell
npm install --save react-zoom-pan-pinch
```

# 基本的な利用方法
`TransformWrapper` と `TransformComponent` で Zoom / Pan / Pinch したい対象を囲むと実現できます。

以下の例では、img タグを囲んでいます。

```sample.tsx
import { FC } from "react";
import { TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";

export const ZoomPanPinch: FC = () => {
  return (
    <TransformWrapper>
      <TransformComponent>
        <img src="./snowman.jpg" alt="snowman" />
      </TransformComponent>
    </TransformWrapper>
  );
};

```

動作確認をします。

![Vite + React + TS - Google Chrome 2024-12-03 09-31-41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/7a91582b-7117-c65f-45a4-ae5812900426.gif)


# Zoom / Pan / Pinch の対象
img タグ以外も Zoom / Pan / Pinch することができます。

## テキスト

```sample.tsx
import { FC } from "react";
import { TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";

export const ZoomPanPinch: FC = () => {
  return (
    <TransformWrapper>
      <TransformComponent>
        <h1>Zoom Pan Pinch</h1>
      </TransformComponent>
    </TransformWrapper>
  );
};

```

![Vite-React-TS-Google-Chrome-2024-12-03-08-48-19.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/82d15f39-bf5a-9997-7309-bc02295bee4b.gif)

## SVG

```sample.tsx
import { FC } from "react";
import { TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";

export const ZoomPanPinch: FC = () => {
  return (
    <TransformWrapper>
      <TransformComponent>
        <svg width="600" height="400" xmlns="http://www.w3.org/2000/svg">
          <image href="./snowman.jpg" width="600" height="400" />
        </svg>
      </TransformComponent>
    </TransformWrapper>
  );
};

```

![Vite-React-TS-Google-Chrome-2024.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/184d7c88-1e41-9d06-2e5d-07d6f89b405d.gif)

# 参考
- [React Zoom Pan Pinch](https://github.com/BetterTyped/react-zoom-pan-pinch)
Linked Pastsコミュニティについて

昨日のヒストリーテック・アドベントカレンダー記事にて、[CODH](http://codh.rois.ac.jp/)からアナウンスされた、『[Joint Symposium of Linked Pasts 10 and Linked Pasts Japan 1](http://codh.rois.ac.jp/conference/linked-pasts-10/)』シンポジウムを紹介しました。
が、その主催である「[Linked Pasts](https://linkedpasts.hcommons.org/)」コミュニティ自体を、私は知らなかったのでざっと調べてみました。

### Linked Pasts 

のちに紹介する Linked Pasts Japan による説明によると、Linked Pasts コミュニティとは

> デジタル・ヒューマニティーズ分野において近年、セマンティックウェブ技術や Linked Data がますます広範に利用されるようになってきています。例えば欧州では、年に一度、Linked Pasts Symposium というイベントが各地で開催され、欧州各地から Linked Data を用いた歴史・考古学研究、あるいは文化財研究に携わる人々が集まり、意見を交わしています。

というものであるようで、欧州ではこのコミュニティは 10 年の歴史があるようです。

似たコミュニティ?として [Pelagios Network](https://pelagios.org/) という、研究者、科学者、キュレーターが、Linked Data の手法とツールを使って過去を調査するコミュニティがあるようで、両者の差は詳しくはわかりませんが、LP と Pelagious は綿密に連携しているようです。その Pelagios によって記されたこの記事「[From Linking Places to a Linked Pasts Network](https://medium.com/pelagios/from-linking-places-to-a-linked-pasts-network-ebc974f5b342)」によると、これまでの成果である「[Peripleo](https://github.com/britishlibrary/peripleo) (歴史的データの地理的視覚化)」「[PeriodO](https://perio.do/en/) (時代区分の集約、標準化)」「[SNAP](https://snapdrgn.net/) (古代人物記録の統合、標準化)」などを分散連携させて目指す概念であるようです。

### Linked Pasts Japan

日本では今年 3 月に「[Linked Pasts Japan 
Kick-off](https://sites.google.com/view/lpjkickoff/home)」というキックオフイベントが開かれ、現在 [Linked Pasts Japan](https://junjun7613.github.io/LPJ-site/) コミュニティが

> Linked Pasts Japanは、こうした国際的なコミュニティ形成の動向を踏まえ、日本におけるLinked Dataを用いた人文学研究に関わる研究者・実務者が集い、それぞれが直面する課題や論点を議論し、成果を共有する場を提供します。また、国内の研究動向を対外的に発信する際のハブとして機能することで、当該分野の研究における日本の国際的プレゼンスを高めることにも貢献します。

という形で準備されているということのようです。日本ではまだできたばかりということのよう。CODH でも、[Linked Pasts Japan](http://codh.rois.ac.jp/sig/linked-pasts-japan/) の特設ページが作られています。

さすがにレイヤーが上過ぎて、私のような市井の活動者が取り組むには難しすぎる活動ですが、面白そうなので注意を向けたいと思います。
crontab

### ステータス確認
```bash:Bash
# crondのステータス確認
systemctl status crond
# または
service crond status
```
```bash:Bash
### 起動・停止・再起動コマンド
# 起動
systemctl start crond
# 停止
systemctl stop crond
# 再起動
systemctl restart crond
```
### 自動起動の設定
```bash:Bash
# システム起動時に自動的に起動するように設定
systemctl enable crond
# 自動起動を無効化
systemctl disable crond
```
### crontabの設定確認
```bash:Bash
# 現在のユーザーのcrontab確認
crontab -l
# rootユーザーのcrontab確認
sudo crontab -l
```
### トラブルシューティング
```bash:Bash
# cronのログを確認
tail -f /var/log/cron
# システムログでcronの動作を確認
journalctl -u crond
```
進捗報告 (2024-12-03 09:25:36)

# 自動投稿アプリの進捗状況

## 概要
自動投稿するアプリが完成した。次のステップとして、インスタグラムにおいてランダムな時期に自動で投稿するボットの開発を進める。

## 次のステップ
1. **インスタグラムのAPI調査**
   - インスタグラムのAPIの有無や仕様について調査を行う。
   - APIを使用することで、どのような機能が実現できるかを確認する。

2. **ディープフェイク技術の活用**
   - ステーブルディフュージョンやオープンAIのAPIを利用して、フェイク画像を生成する。
   - 生成した画像を定期的に配信するスクリプトを作成する。

3. **開発環境の選定**
   - Googleアプリスクリプト、Webサービス(WS)、Googleクラウドなど、どのプラットフォームで開発を進めるかを検討する。
   - プラットフォームの特性を踏まえて、最適な環境を選ぶ予定。

## 今後の方針
- 上記の調査を基に、具体的な実装に向けた計画を立てて進行していく。
長ったらしいマークアップは Helper に押し込んで View をスッキリさせよう

この記事は[ソニックガーデン プログラマ アドベントカレンダー](https://qiita.com/advent-calendar/2024/sonicgarden)の3日目の記事です。

---

Rails の Helper に関する小ネタです。タイトルの通り、長ったらしいマークアップを Helper に押し込むことで、View をスッキリさせようという話です。

Stimulus を使っていると長ったらしいマークアップを要求されることがままあります。
例えばこんな Stimulus コントローラがあるとします:

```js
application.register('class-toggle', class extends Controller {
  static targets = ['element']
  static values = { className: String }

  toggle(ev) {
    for (const el of this.elementTargets) {
      el.classList.remove(this.classNameValue)
    }

    const { currentTarget } = ev
    currentTarget.classList.add(this.classNameValue)
  }
})
```

これを使うマークアップは、べたっと書くとこうなる想定です。

```haml
%div{ data: { controller: 'class-toggle', class_toggle_class_name_value: 'active' } }
  %button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } } 赤
  %button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } } 橙
  %button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } } 黃
  %button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } } 緑
  %button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } } 青
  %button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } } 藍
  %button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } } 紫
```

長ったらしいですよね。プロダクションコードではもっとたくさんの属性を指定するケースも珍しくありません。

そこで Helper です。

```ruby
module ButtonToggleHelper
  def toggleable_button_tag(label)
    tag.button(label, data: { class_toggle_target: 'element', action: 'class-toggle#toggle' })
  end
end
```

このヘルパーメソッドを使うと、マークアップは以下のようにスッキリします。

```haml
%div{ data: { controller: 'class-toggle', class_toggle_class_name_value: 'active' } }
  = toggleable_button_tag '赤'
  = toggleable_button_tag '橙'
  = toggleable_button_tag '黃'
  = toggleable_button_tag '緑'
  = toggleable_button_tag '青'
  = toggleable_button_tag '藍'
  = toggleable_button_tag '紫'
```

単にスッキリしただけでなく、マークアップが DRY になったので、Stimulus コントローラ側に修正が入っても、マークアップの修正を最小限に抑えることができます。

今回は長ったらしいマークアップを求められる状況の例として Stimulus を引き合いに出しましたが、他にも例えば TailwindCSS なんかも同じような状況になりがちかなと思います。Stimulus 以外にも応用できるノウハウだと思っています。

というわけで、Helper を有効活用することで、View をスッキリさせていこうというお話でした。

---

4日目は @kontikun です。お楽しみに！
AWS AIF合格記🎳

この記事は セゾンテクノロジー Advent Calendar 2024 3日目の記事です。

# はじめに
2024年10月にGAとなったAWS AIF資格の合格に向けて準備したことを記録します。(24/12/2受験)
これから試験を受ける方の参考になれば嬉しいです！

# AWS AIFを受けた感想
正直な感想ですが、プラクティショナー試験（CLF）と比べると難しく感じました。
プラクティショナーだからと余裕ぶらない事をおススメします！
わたしは余裕ぶった結果見事に砕け散りました。（いま振り返るとただの勉強不足だったなと反省）
ぴったり2週間後に再受験し合格しました:blush:

# 試験に向けてやったこと
だいたい2週間程度（1日1-3時間くらい）勉強しました。
AIF試験対策はとにかく、浅くても良いので「広く知識をつけること」が大事です。
インプットはもちろん、練習問題も沢山解いて知っているものを1つでも増やせるよう意識しました。

- **AWS公式試験ガイド**
- **Udemy**
- **AWS Partoner セミナー**
- **AWS SkillBuilder**
- **先人の知恵を借りる**

📝 詳細は以下に記載します。

### AWS公式試験ガイド
AIに関するキーワードについて聞いたこと
があっても、自分の言葉で説明できないものって沢山ありますよね。正しい定義を知らずになんとなくで使ってしまっている言葉など。

こうした基礎的な知識を整理するのに役立ちました。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ai-practitioner/AWS-Certified-AI-Practitioner_Exam-Guide.pdf

とにかく試験ガイドはやるべき。 :muscle_tone5:

### Udemy
2つの教材を使用し正答率が90%を超えるよう繰り返し学習をしていました。

https://www.udemy.com/course/practice-exams-aws-certified-ai-practitioner/?couponCode=CMCPSALE24JP

→英語版ですが翻訳して使ってください！丁寧な解説付きなのでおすすめです。これをやっておけば問題ないです（マストだ！）

https://www.udemy.com/share/10bP133@RpXG_pygZWRcqRlwad0Y8r6rDOIGpNQnfFHOKyVu4Q8ehzLXSZHiVMchoNxDap-9sA==/

→キーワードの確認にはもってこいですがあまり実践的ではないので基礎固めに使うのが良いかなと思います。（どちらでも良い。）

### AWS Partoner セミナー
パートナー企業向けですので条件付きではありますが、是非皆さんに参加してもらいたいです。参加後モチベーションが上がりAIFの受験を決めました :football:

### AWS SkillBuilder
以下のコースを学習しました。Udemyだけでも問題ないと思います。
**Exam Prep Official Practice Question Set: AWS Certified AI Practitioner (AIF-C01 - Japanese)**

### 先人の知恵を借りる
勉強を進めるうちに解説などの短いドキュメントだけでは理解できないものが沢山ありました。
難解な記事は読み込むだけでも大変です。
とにかく「ちょっと分かる」という状態にするため、Qiitaなど初心者向けに簡単にまとめられている記事を探すようにしていました。感謝 :pray:


https://qiita.com/kikuziro/items/9591b5dd9425acf04144#two-%E7%AC%AC%EF%BC%92%E7%AB%A0--aws-ai%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E7%B7%A8-

→初期段階にAIFのイメージを掴むならこれ！本当に役に立った記事です！楽しみながら読み進められると思います。おすすめ:stuck_out_tongue_closed_eyes:

https://qiita.com/NoriakiOshita/items/698056cb74819624461f

→紛らわしいものもこうした記事を読めば一気に分かるようになりました！

# 波に乗って取っちゃおう！:surfer_tone3:


### 再受験無料キャンペーン
https://pages.awscloud.com/GLOBAL-other-GC-traincert-aws-foundational-certification-2024-learn.html

25/2/15まで再受験無料キャンペーンです。試験申込の際にコード入力を忘れずに！


### アーリーアドプター
> 2025 年 2 月 15 日までにこの認定資格を取得すると、Early Adopter (アーリーアドプター) のデジタルバッジも授与されます。

今合格するとバッチが2つもらえるみたいですね！もらえるものはもらいましょう:dancer_tone3:


# 最後に
受験に向けた準備としては**試験ガイドを使ったインプット**と**Udemyでのアウトプット**をバランスよく勉強すれば問題ないと思います:ok_hand:

いい結果になることを祈っています！おしまい :wink:
Power BI workout - Power BI レポートの共有

いまさらだけどね。Power BI レポートを共有する手段にはいくつかあるのだけど、その選択が合理的ではないケースが多い。無茶を始めるきっかけにもなっているからさ、気を付けてねって感じ。

レポートの共有するためには、
- Power BI レポート
- ソースになる Power BI セマンティック モデル

に対し、Read / 読み取り 権限をレポートユーザに割り当てる**だけ**。どの方法で権限を割り当てるかについては、Microsoft Learn をよく読み、自分の手で確かめることだ。

https://learn.microsoft.com/en-us/power-bi/collaborate-share/service-share-dashboards

https://learn.microsoft.com/en-us/power-bi/connect-data/service-datasets-permissions

# 優先順位
Power BI レポートを共有する手段として検討する優先順位を整理する。ただし、合理的に選択し、どれでも必要なとき使用できるようにしておくことが重要である。
次の 3つの手段で共通なのは、共有されるセマンティック モデルと関連するレポート、それぞれに対し個々の権限を割り当てる機能である。Direct access でちまちまと権限を付与する必要がない。
ワークスペースのロールによる権限付与は、ワークスペース内のアイテムすべてを対象とするものである。なので、ワークスペースで Power BI レポートの共有を検討すべきではない。
## #1 Org apps (Preview)
複数の Fabric アイテム / Power BI アイテムをバインド
2024-12 時点でまだプレビューだけど、今から検証しておいた方がよい。Power BI app のあまりよくないポイントが大きく改善する。現時点では、F SKU が必要な Fabric アイテムではあるけれど、この機能は Power BI アイテムとして展開されるべきだと考えている。F64 まで大きなキャパシティでなくても試せるはずである。

https://learn.microsoft.com/en-us/power-bi/consumer/org-app-items/org-app-items

## #2 Power BI app
複数の Power BI アイテムをバインド
Power BI ワークスペースが "アプリ ワークスペース" と呼ばれ、かつての Office 365 グループに依存していた経緯もあって、現在の Power BI から考えるとずいぶん洗練されていない状態ともいえる。Audience 機能が追加されたけれども、ワークスペースでひとつのアプリしか発行できない。

https://learn.microsoft.com/en-us/power-bi/collaborate-share/service-create-distribute-apps

## #3 Share reports via links
アプリのように複数のレポートなどアイテムをバインドすることはできない。しかし、さっさと共有するのに都合がよいはずだ。

https://learn.microsoft.com/en-us/power-bi/collaborate-share/service-share-dashboards#share-a-report-via-link

# ワークスペースでの共有
ワークスペースのロールを介して Power BI レポートを共有しても別に構わない。ただし、ワークスペースだけの運用では解決できないことがあるので充分に把握しておかなければならない。こういうのはケースを想定して考えるとよいはずだ。想定としているけれど実際によくある話である。

たとえば、組織の階層をワークスペースの構成として使用することは自然である。営業部という組織単位に対し、営業部(ワークスペース)が用意される。営業部(ワークスペース)には、営業部に属するすべての部員がワークスペースのロールを介して参加できていれば、Power BI レポートの共有は十分に達成できる。シンプルだし使い始めにはマッチするでしょう。

**さて、ここで問題**
ワークスペースに配置されたレポートやセマンティック モデルで、マネージャとスタッフで参照できるデータに制限を適用したいというときにどうするか。このニーズは多くの場合で発生するので、ワークスペースの運用設計に必ず盛り込んでおくべきである。

**そして、回答**
マネージャだけのワークスペースを別途用意する
もしくは、
レポートを作成するメンバだけのワークスペースを別途用意する

**なぜか**
ワークスペースの目的用途機能は、作業とデータを共有するものだから。お気持ち的なことではない。ワークスペースでの運用にこだわるなら、要件に応じたワークスペースを常に追加するということである。

この説明をすると、RLS/OLS で実現できませんか？必ずと言ってよいほど問われるが、それは無理、できませんよって説明になる。
- RLS/OLS はセキュリティ機能なので常に適用されるべきである
- ワークスペースで管理されるアイテムは、セマンティック モデルとレポートだけではない

RLS/OLS が機能するのは Viewer(ロール)に属しているユーザのみ。そして、ワークススペースで管理されるアイテムすべてに対しても Viewer(ロール)である。セマンティック モデルに頑張って RLS/OLS を導入したとしても、ワークスペースに存在するソースデータへアクセス可能ということを理解できていない。

ワークスペースにソースデータを配置しないという運用をすればよいという考え方もあるでしょう。しかし、運用でカバーされなければならないセキュリティ機能って本当に必要なの？ってこと。

# そもそも的なポイント
- Power BI レポートを共有するために、ワークスペースのロールは必要ない
- レポートユーザはワークスペースに参加する必要もない
- ワークスペースの機能にはレポートの共有が含まれるが、レポートの共有目的にマッチするとは限らない

# 思ったこと🙄
レポートを共有するための情報はあるけれども、ワークスペースで共有なんてこと書いてないでしょ。

https://learn.microsoft.com/en-us/power-bi/collaborate-share/service-share-dashboards
# その他
https://powerbi.connpass.com/

https://www.microsoft.com/en-us/power-platform/products/power-bi

https://www.microsoft.com/en-us/microsoft-fabric
GitHubからリポジトリをクローンする方法

### 1. ターミナルを開く
ターミナルやコマンドプロンプト（Windowsの場合）を開く。  
Gitがインストールされているか確認する場合、以下コマンド実行。
```powershell
git -v
```
インストールされていない場合は、<a href="https://git-scm.com/" target="_blank">Git公式サイト</a>からインストールする。
必要に応じて、クローン先となるディレクトリに移動する。
```powershell
cd 移動したい/フォルダ/パス
```

### 2.リポジトリをクローンする
クローンしたいリポジトリのURLをGitHubの「Code」ボタンから「HTTPS」を選択し、コピーする。
以下コマンドを実行。
```powershell
 git clone https://github.com/ユーザー名/リポジトリ名.git
 ```
 クローンが完了すると、指定したリポジトリのフォルダが作成され、その中にファイルがダウンロードされる。

 ### 3.必要な依存関係をインストールする（Ruby on Rails）
 クローンしたディレクトリに移動し、プロジェクトが依存するライブラリをインストールする。
```powershell
bundle install
```
- bundle install はGemfileを元に必要なGemをインストールする。

### 4. 必要に応じてYarnを使用する

必要な場合は、下記コマンドでプロジェクトのディレクトリ内で依存関係をインストールする。
```powershell
yarn install
```
- yarn installはプロジェクトのpackage.jsonファイルをもとに、必要なNode.jsライブラリをインストールできる。

### 5.「ActiveRecord::PendingMigrationError」が出たら
以下コマンド実行。
```powershell
rails db:migrate
```

---

### Webpackerの再インストール
以下の手順でWebpackerを再インストールします。

1. **Webpackerを再インストール**

   ```powershell
   bundle exec rails webpacker:install
   ```

2. **依存関係の再インストール**
   ```powershell
   yarn install
   ```
3. **Webpackを再コンパイル**
   ```powershell
   bundle exec rails webpacker:compile
   ```
---
開発原則(SOLID, KISS, YAGNI, DRY)の理解

# 開発原則とは？
オブジェクト指向における原則を示すものであり、主義や格言の頭字語を取った呼び名である。
ソフトウェア開発において、これから紹介する原則を守ることでコードの品質、可読性、拡張性が向上し、プロジェクトの長期的な成功へと導くことができるようになる。

# 原則について
## SOLID
__・Single Responsibility Principle (単一責任原則)__
クラスやモジュールは単一の責任を持つべきである。

動作を分離することで変更時の影響範囲が限定されるため、バグが発生した際に他の無関係な場所への影響を最小限に抑えることができるようになる。

__・Open-Closed Principle (開放/閉鎖原則)__
クラスの拡張(新規機能の追加)には開放されていて、変更には閉じられているべきである。

クラスやモジュールが、既存のコードを変更することなく、新しい機能を追加できるように設計すべきだという考え方。
既存のクラスが使用されている箇所でのバグを防ぐことができるようになる。

__・Liskov Substitution Principle (リスコフの置換原則)__
親クラスのインスタンスは子クラスで置き換え可能であるべきである。

子クラスは親クラスと同じ、あるいは同様の結果を提供できるようにすることで、一貫性を保つことをことができる。

__・Interface Segregation Principle (インターフェース分離の原則)__
クライアントが必要なメソッドのみを実行するべきである。

クラスが必要なもののみを実行するように不要なメソッドを削除、もしくは移動することで予期しないバグを避けることができるようになる。

__・Dependency Inversion Principle (依存性逆転の原則)__
上位クラスは、下位クラスに依存してはならない。
詳細は抽象化に依存するべきである。

クラスは動作を実行するために使用するツールと融合すべきではなく、ツールがクラスに接続できるようにするインターフェイスと融合すべきである。
上位レベルのクラスが下位レベルのクラスに依存するのを減らすことができるようになる。

## KISS
__Keep It Simple, Stupid__
コードはできるだけシンプルにすべきである。

複雑すぎるコードはバグを引き起こしやすく、保守が困難になる。
プログラミングをする際に、「動作させるために、もっともシンプルなものは何か」と常に問いかけることが必要である。

## YAGNI
__You Aren't Gonna Need It__
いま必要なコードのみ追加するべきである。

あらかじめ備えてコードを盛り込むことは、余計な複雑性を盛り込んでしまい邪魔になる可能性がある。
汎用性よりも単純性を求め、「今」必要なものだけを実装する。

## DRY
__Don't Repeat Yourself__
同じコードは避けるべきである。

同じコードが複数あることで、量が多くなり、修正にかかる時間やコードの理解にも時間を要するようになる。
処理のまとまりには関数化するなどを行い意義していくことが重要である。
ffmpegを使ったタイムラプス動画の作成したメモ

ffmpegの詳細については割愛するが、[ffmpeg](https://www.ffmpeg.org/ "公式ドキュメント")公式ドキュメントから引用すると


A complete, cross-platform solution to record, convert and stream audio and video.
オーディオとビデオを記録、変換、ストリーミングするための完全なクロスプラットフォームソリューション。

とある。ビデオの変換を行えるこのツールを使って、タイムラプス動画を作成した。

30秒の動画ファイルのパスが複数記載されたファイル(ファイルの内容は[こちら](https://trac.ffmpeg.org/wiki/Concatenate#Instructions)を参照。動画の合計時間は3時間分)を読み込んで、それを連結しながら1080倍速したwebmファイルを作成する場合、以下のコマンドを実行。


```bash
/usr/bin/ffmpeg -f concat -safe 0 -i input.txt -vf "setpts=PTS/1080" timelapse.webm
```
あまりに実行完了まで時間がかかるので途中で処理を中断。(15分ほど待機して中断)
品質はあまり重視していなかったので、品質を落として効率を優先するために```-c:v libvpx-vp9 -quality realtime -speed 8```オプションを追加。

libvpx-vp9 ... CPUによるvp9エンコード
-quality realtime -speed 8 ... 最も品質を落として効率を優先

```bash
/usr/bin/ffmpeg -f concat -safe 0 -i input.txt -vf "setpts=PTS/1080" -c:v libvpx-vp9 -quality realtime -speed 8 timelaps.webm
```

結果、３時間の動画を1080倍にする変換が約六分で完了するようになった。

余談だが、上記の場合CPUリソースをすべて使っていたため、[tasksetコマンド](https://ysatoautonomous.github.io/jm-draft/man2html/util-linux/util-linux-2.34/draft/man1/taskset.1.html)で　ffmpegプロセスに関連付けるコア数を制限した。

```bash
taskset -c 0-2  /usr/bin/ffmpeg -f concat -safe 0 -i input.txt -vf "setpts=PTS/1080" -c:v libvpx-vp9 -quality realtime -speed 8 timelaps.webm
```


参考

https://developers.google.com/media/vp9/live-encoding?hl=ja
https://ffmpeg.org/ffmpeg-filters.html
https://trac.ffmpeg.org/wiki/Encode/VP9#speed
Bug Shooting Challenge に参加した話 #MIXI_BSC

今回は参加レポート系です．2024年12月1日，MIXIさん主催のBug Shooting Challengeに参加しました．そこで学んだ色んなことを書き起こしておこうと思います．本当はどんな問題でどのようなアプローチを取ればいいのかとか考えた軌跡を残したかったのですが...イベントの方針上問題は載せられないのでそこはうまく執筆したいと思います．

公式様の参考ページ

https://mixil.mixi.co.jp/report/3329

# Bug Shooting Challengeとは？

> バグを見つけたら、潰してしまえ！
> MiXI公式より

とのことで，バグを見つけ，その修正をするといったことが主であるイベントです．具体的には実際のユーザーからのお問い合わせに模したバグ報告に対して，BigQueryにあるログを解析したり，ソースコードから問題点を探したりして，障害対応するといった流れでした．

# 会場IN
Bug Shooting Challengeの会場は渋谷スクランブルスクエア36FにあるMIXIのオフィスでした．渋谷駅に10:30に着くといいよ〜とのことで，イベント自体の集合時間はゆっくりなスタートでしたが，私は東京人ではないのでかなりの早起きをしました...
ちょうど新幹線の中で地震の訓練で急に地震速報(訓練)がBig Soundで流れたのでかなり焦りました．1日中結構引きずっていたようななかったような...

# 説明とSample問題
午前中はひたすら説明の儀でした．今回使う技術スタックの話やシチュエーション，クリーンアーキテクチャの説明がメインでした．

> クリーンアーキテクチャの説明はよくみるあの丸い図が出てきました...

昼ごはんを経て，午後の初めは環境構築やサンプル問題を解く時間でした．私自身環境構築に手こずりました．ずっとPostgreに繋がらないし，localhostを認識しないし...運営の皆様お手数おかけしました．

> ちなみにPostgre繋がらない問題はbrewでインストールしたローカルにいるpostgreSQLとDockerコンテナ上のPostgreSQLが混合していたことが原因で，
> localhostの名前解決ができないのはローカルのDNSが変に書き換えられていたからでした．

# 問題とくぜ

https://x.com/HR_mixi/status/1863121128203694329

こんな感じで結構景色のいいところで問題解いていました．この日は天気もよく富士山が見えるくらい透き通ってました．

![550BF1EA-1999-4066-BCCC-29FD4C0B2062_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/b516c68e-3a0a-5373-c4d6-ba8b486b042b.jpeg)

問題の内容は言えないのですが架空のサイトの利用者からきた架空の問い合わせに対応していくみたいな形式でした．フロントはNext.js(TypeScript TailwindCSS)でバックはGo,gorm(クリーンアーキテクチャ)で，データベースはPostgreSQL，ログ収集はGoogleCloudBigQueryでした．

最初はIssueがあってどんどん解決したり，いい感じにスピードアップする某コンテストのような雰囲気を想像していました．
しかし，実際はかなり幅広い事象の問題があり，ソースコードの修正箇所がすごく単純だったり，そもそも修正しなくてもよいものがったりと...びっくりしたものもあり，先入観が邪魔だったという感想です！

> 朝，新幹線の中で，そー言えばNextてどう書くんだったっけ？とか，単体テストの粒度とか色々考えていたのですが...そこまで考えなくてよさそうでした

Goの知識というかプログラミング言語の特性を知っていると強いのかも...?そんなことを思わせていただいたいい経験でした！

# 懇親会では...
懇親会でもさまざまな話をさせていただきました．ログデータの収集，解析の話だったり，スケーリング大変だったり，DBの分散管理だったり，実際の業務で使うさまざまな考え方を伺えました．

> バグの話とかアーキテクチャの話をすると思っていましたが...なぜかインフラの話が多めだったような...

技術系の話ではないですが，オフィスの周りが全部ガラス張りだったので360度フルパノラマの渋谷36Fからの景色が綺麗すぎました．

# 終わりに
以前GitChallengeに参加したときは半分くらい難しい問題?(多分自分が知らなかっただけ)があったのですが今回はほどよう難易度でした．1問目は先入観が邪魔して混乱しまくったもですが2，3問目は結構しっかり溶けました．賞はなかったのですがプロフラムの特性を色々考え直すいいきっかけになりました．


それではQiitaアドカレ.24企画の今日のクリスマスツリーです．

> 詳しくは[こちら](https://qiita.com/JavaLangRuntimeException/items/1f4a6febf957f522ba45)の記事から

![スクリーンショット 2024-12-03 8.49.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/6ea995bd-6c40-2aa9-c2a3-2b81fa83fe0e.png)
WebエンジニアもCEDECに参加して（視聴して）みよう

ぼっちカレンダー1日目はWebのエンジニアリングにはあまり関係ないが、知らない人に教えたい __CEDEC__ というイベントについて書きました。

2年ほど前、当時の同僚から教えてもらったCEDECを初めて視聴したとき、子供の頃憧れていたゲーム業界がこんなにも身近に感じられる場があったとはと感動したことを覚えています。なぜ今まで知らなかったのかと後悔しているくらいです。

特に昨今のCEDECはゲーム開発のみならず、VRやAI、クラウドインフラ、開発組織など割とWebエンジニアでも興味を持ちやすい（あるいは業界的に近い技術やナレッジ）公演も存在します。
この機会にCEDECを知らなかった皆様、ぜひ参加してみてください。なお現地会場ではインディゲームもプレイできるしインタラクティブな体験もできます！

## CEDECとは

そもそもCEDECとはなにものかというのを引用で説明します。

> 「CEDEC」は、Computer Entertainment Developers Conferenceの略で、CESA（一般社団法人コンピュータエンターテインメント協会）が主催する国内最大のゲーム開発者向けの技術交流イベントです。

引用元: [SiliconStudio Agent](https://ss-agent.jp/column/game_words/gw09_cedec/)

要するにゲーム業界の集まった協会がワイガヤやっていたイベントが規模を拡大していって、外部の参加者を交えた交流会・技術イベントとなったやつです。
2019年までは現地開催がメインでしたが、それ以降オンライン→ハイブリッドと言うふうに形を変えています。
そのため、地方からの参加も比較的に楽になりました。

## 今すぐ見たい、どうすればいい？

実はいくつかのセッションはYoutubeまたはニコニコ動画で無料公開されています。

- Youtube
https://www.youtube.com/channel/UCmHaPXvwn9_4pMNAV6ewgoA

- ニコニコ動画
https://www.youtube.com/channel/UCmHaPXvwn9_4pMNAV6ewgoA

無料公開されているセッションは基本的にスポンサーセッションなので宣伝も入りますが、十分見ごたえのあるものばかりです。
個人的には長年プレイし続けてる__アナザーエデン__の動画が面白かったです。

https://www.youtube.com/watch?v=dEZ31MWhC40

このように、普段自分がプレイしている愛してやまないあのゲームの裏話が聞けるのもCEDECのポイントです。

## CEDECの亜種 CEDEC+KYUSHU

ちなみに本場のCEDECとは別に __CEDEC+KYUSHU__ があります。こちらもCEDEC同様昨今ではハイブリッド開催なので、逆に都心在住の方も参加しやすくなっています。
特にサイバーコネクトツーの松山さんのトークセッション（モデレーター含む）は聴き応えバッチリなのでおすすめです！

CEDEC+KYUSHUそのものはセッション動画を公開していませんが、各種協賛企業がそれぞれのYoutube公式アカウントで公開している場合があるようです。例えばバンダイナムコさんの講演動画が公開されています。

https://www.youtube.com/watch?v=wtQ47cLv8zk

過去動画を見たい方は「CEDEC+KYUSHU」で検索すると良いかもしれません。

https://www.youtube.com/results?search_query=CEDEC%2BKYUSHU


## 余談

ゲームを含めたソフトウェア開発での大規模交流イベントとしてはCEDECですが、個人・団体のものづくりとしては __[Maker Faire Tokyo](https://makezine.jp/event/mft2024/)__ もおすすめです。こちらは現地参加が必要ですが、ほんとに見事なモノづくりのプロダクトを実際に触ったり感じたりできるので、ガジェット好きな方や五感でプロダクトを楽しみたい方は参加必須です！
Chrome HOME画面を自分好みにカスタマイズする【Chrome拡張機能】

親の顔より見たChrome HOME画面、自分の使いやすいようにカスタマイズしてみませんか？

![1'.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/2efe8ded-af48-fccc-ebda-033810ea79e8.gif)

## そんなん必要ないやろ

と思うかもしれない。むしろGoogleが用意するブラウザショートカットを利用できねーじゃんか、と。

![スクリーンショット 2024-12-03 7.29.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/547eb185-6744-741b-fa7b-6e60140a0fee.png)

いや、**まさかマウスカーソルでChromeを開くたびに画面下のブラウザショートカット、検索バーを押していませんよね？？**

![スクリーンショット 2024-12-03 8.04.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/a7c1361e-7800-6230-097d-bbdf9c8ed1f6.png)

基本ブラウザは上のURLを叩いて利用してください。0秒でリンク・検索結果にアクセスできます。他のブラウザ閲覧中でも 「`Ctrl/Command` + `L`」 で速攻フォーカスできます。新しくタブを開く「`Ctrl/Command` + `T`」と同じようにフォーカスされた状態となります。

![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/0cb29869-ebec-27e8-86e3-81a76e87f584.gif)

## HOME画面を編集するメリット

上記の速攻フォーカスを知ると、要するに**ChromeのHOME画面は何でも良くなる**。じゃあ好きなものにカスタマイズしようね、てこと。

Chrome HOME画面は毎日見るもの。自分を元気づけたり、あるいは便利機能を配置するとQOLバク上がり間違いなし。ちなみに以下のサンプルは全て**HTML, CSS, JavaScript**のみでデザインしています。

|推しを表示|座右の銘を表示|
|-|-|
|![スクリーンショット 2024-12-03 7.10.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/572818f2-700f-7abb-1026-832165640b9b.png)|![スクリーンショット 2024-12-03 7.26.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/6115bb03-c614-8185-0e4a-b355965047e6.png)|

|現在時刻表示|TODOリスト|
|-|-|
|![スクリーンショット 2024-12-03 7.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/fe27f0b3-ad28-4bc9-e7b6-0e5365ee5020.png)|![スクリーンショット 2024-12-03 8.08.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/886e67dc-ce1f-44cd-d551-e165622cc9b3.png)|

## やり方

1. `html` を配置
2. `manifest.json` を配置 
3. 拡張機能を反映する

### 1. HTMLを配置

```shell
(フォルダ)
├── index.html
└── style.css(必要であれば)
```

### 2. manifest.json を配置

htmlらと同じフォルダに、`manifest.json`を配置します。

```json:manifest.json
{
  "manifest_version": 3,
  "name": "Chrome HOME画面を配置する",
  "version": "0.0.0",
  "chrome_url_overrides": {
    "newtab": "index.html"
  }
}

```

`"newtab": "index.html"`の部分に任意のHTMLファイルを読み込むことが可能です。

### 3. 拡張機能を反映する

[chrome://extensions](chrome://extensions) にアクセスし、拡張機能を読み込みます。先程のフォルダをドラッグ＆ドロップします。

![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/a839bd77-3609-e934-dbd9-66e41a9204fd.gif)

下記のようなポップアップが表示され、「そのままにする」を押すことで作業が完了します。

![スクリーンショット 2024-12-03 8.24.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538408/76fe3a05-32e5-351d-67c9-73d61542e7e8.png)

以上で、Chrome HOME画面を自分好みにカスタマイズが完了しました。
.NET 9 の Guid 新機能で UUID v7 を使う

# UUID v7 とは
## Copilot にざっくり教えてもらう
```
UUID v7の特徴
タイムスタンプ: Unixエポック時間（1970年1月1日 00:00:00 UTC）からのミリ秒を使用して48ビットのタイムスタンプを含みます。

ランダムデータ: タイムスタンプに加えて、ランダムなデータを含みます。

ユニーク性と順序性: タイムスタンプとランダムデータの組み合わせにより、ユニークで並べ替え可能なUUIDを生成します。

プライバシー: MACアドレスを含まないため、プライバシーに関する懸念がありません。

用途
UUID v7は、データベースキーとして使用されることが多く、特に時系列データの管理に適しています。
```

## 公式ドキュメント
### RFC 9562

https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-7

### 日本語訳

https://tex2e.github.io/rfc-translater/html/rfc9562.html#5-7--UUID-Version-7

## つまり……

- 見た目は UUID
- 先頭 48bit に UNIX 時間のミリ秒が含まれる
    - ソート可能
- 4bit のバージョンフィールド
- 2bit のバリアントフィールド
- 残りがランダム値

**DB の主キーに最適了解！**

# .NET 9 で System.Guid 構造体に追加された機能

- CreateVersion7 静的メソッド
- Version プロパティ
- NewGuid() で UUID v4 に準拠←今回はスルー

https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-9/libraries#systemguid

## CreateVersion7 メソッド

https://learn.microsoft.com/en-us/dotnet/api/system.guid.createversion7

### CreateVersion7()

UtcNow をタイムスタンプとして UUID v7 を生成します。

```csharp
Console.WriteLine(Guid.CreateVersion7());
Console.WriteLine(Guid.CreateVersion7());
Console.WriteLine(Guid.CreateVersion7());
```

```
019389a5-fe72-7386-ab2a-264948c37893
019389a5-fe73-7559-828a-33856ee76081
019389a5-fe74-7807-acbc-0de2d0822ce3
```

前2ブロックが近しい UUID が生成されました。
3ブロック目の先頭は `7` になってますね。

### CreateVersion7(DateTimeOffset)

指定したタイムスタンプの UUID v7 を生成します。

```csharp
DateTimeOffset timestamp = DateTimeOffset.UtcNow;
Console.WriteLine(Guid.CreateVersion7(timestamp));
Console.WriteLine(Guid.CreateVersion7(timestamp));
Console.WriteLine(Guid.CreateVersion7(timestamp));
```

```
019389a9-7b1f-7826-befc-ebdd9fa8dd60
019389a9-7b1f-759b-b5fb-72e834c68c60
019389a9-7b1f-7078-a9f8-e69238ff24e6
```

今度は完全一致します。

## Version プロパティ

https://learn.microsoft.com/en-us/dotnet/api/system.guid.version

UUID のバージョンを返します。

```csharp
Guid v7 = Guid.CreateVersion7();
Guid newGuid = Guid.NewGuid();
Guid empty = Guid.Empty;
Console.WriteLine($"{v7.Version} {v7}");
Console.WriteLine($"{newGuid.Version} {newGuid}");
Console.WriteLine($"{empty.Version} {empty}");
```

```
7 019389b2-7b85-748f-bb96-8f9881decf9b
4 095766fd-fcb3-46ea-abd5-655b779209fb
0 00000000-0000-0000-0000-000000000000
```
バージョンが取得できました。

# おわりに

さて、Create 処理をすべて書き換えますか。（遠い目）
Manage Configuration

[Previous << Configuration](https://qiita.com/flowcadence/items/aa32f56e7469e8fbe5f4)
[Next >> Security](https://qiita.com/flowcadence/items/82b619c30a90193904c7)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl

設定は、`config add`および`config remove`コマンドを使用して管理されます。addコマンドを使用することで、設定に追加される値の検証も行われます。
```ruby
flow config add <account|contract|network|deployment>
flow config remove <account|contract|network|deployment>
```
<h1>Example Usage</h1>

```ruby
flow config add account

Name: Admin
Address: f8d6e0586b0a20c7
✔ ECDSA_P256
✔ SHA3_256
Private key: e382a0e494...9285809356
Key index (Default: 0): 0
```

<h3>Configuration</h3>

* Flag: `--config-path`
* Short Flag: `-f`
* Valid inputs: valid filename

設定ファイルのファイル名を指定します。`-f` フラグを複数回使用して複数の設定ファイルを指定することができます。


*Last updated on **Nov 21, 2024** by **Jordan Ribbink***

翻訳元

https://developers.flow.com/tools/flow-cli/flow.json/manage-configuration

***
<b>[Previous << Configuration](https://qiita.com/flowcadence/items/aa32f56e7469e8fbe5f4)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Manage Configuration)

<b>[Next >> Security](https://qiita.com/flowcadence/items/82b619c30a90193904c7)</b>
GitHub Actionsを使ってgolangci-lintを設定しよう！

## 概要
GitHub Actions内でLinterを使用することでGOのソースコードを解析して、バグの検出や、言語のルールに沿ってコードが書かれているかをチェックすることができます
今回はgolangci-lintを使ったワークフローを作成する方法について解説します

## 前提
- GOのプロジェクトを作成済み

## golang-ci-lintとは
GOで使用できるLinterの一つで実行時に公式のgovetをはじめとする様々なLinterを一緒に使用できるのが特徴です

## ディレクトリ構成
```
├── .env
├── .github
│   └── workflows
│       └── lint.yml
└── backend
    ├── go.mod
    ├── go.sum
    └── main.go
```

## 実装
以下がワークフローです
詳細はこのあと解説します

```lint.yml
name: Lint Code

on:
  pull_request:
    types: [opened, reopened, synchronize, ready_for_review]
    branches-ignore:
      - 'release/**'
      - 'doc/**'

env:
  WORKING_DIRECTORY: backend

jobs:
  lint:
    if: |
      github.event.pull_request.draft == false
      && !startsWith(github.head_ref, 'release')
      && !startsWith(github.head_ref, 'doc')
    name: Lint
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ${{ env.WORKING_DIRECTORY }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup Golang
        uses: actions/setup-go@v5
        with:
          go-version-file: ${{ env.WORKING_DIRECTORY }}/go.mod
          cache: true
          cache-dependency-path: |
            **/go.sum
            **/go.mod
      - name: Install Dependencies
        run: go mod download
      - name: Lint Code
        uses: golangci/golangci-lint-action@v6
        with:
          version: v1.60
          working-directory: ${{ env.WORKING_DIRECTORY }}
```

### setup-go
公式が出しているsetup-goを使用することでGOの環境設定を行うことができます
go-version-fileを指定することでgo.modファイル内のGOのバージョンを自動で検出します
また、`cache: true`にすることでキャッシュを使ってインストールを高速化します
cache-dependency-pathに下記のようにgo.sumとgo.modファイルを指定します

https://github.com/actions/setup-go

```yml
      - name: Setup Golang
        uses: actions/setup-go@v5
        with:
          go-version-file: ${{ env.WORKING_DIRECTORY }}/go.mod
          cache: true
          cache-dependency-path: |
            **/go.sum
            **/go.mod
```

### golangci-lint用のActions
golangci-lintが公式で出しているActionsを使用します
公式ドキュメントによると公式のActionsを使用するとgolangci-lintをバイナリインストールするより早くインストールできるので推奨しているとのことです

https://golangci-lint.run/welcome/install/#github-actions

```yml
      - name: Lint Code
        uses: golangci/golangci-lint-action@v6
        with:
          version: v1.60
          working-directory: ${{ env.WORKING_DIRECTORY }}
```

## 実際に実行してみよう！
以下のようにワークフロー実行時にLinterが適用され、エラーを検知した場合はPR上にエラー箇所を表示できれば成功です

![スクリーンショット 2024-12-02 9.51.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/4f393f57-224e-95b1-9bf9-e8e11cdb78e5.png)


## 参考
https://github.com/actions/setup-go

https://golangci-lint.run/
LeetCodeを1日1題解いてみる (day34)

34日目に取り組んだ問題はこちら！
今まではアルゴリズムでしたが、今回からPandasについての問題に挑戦していきます。

# 175. Combine Two Tables

https://leetcode.com/problems/combine-two-tables/description/?lang=pythondata

## 問題文
Table: `Person`
```
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| personId    | int     |
| lastName    | varchar |
| firstName   | varchar |
+-------------+---------+
```
personId is the primary key (column with unique values) for this table.
This table contains information about the ID of some persons and their first and last names.
 

Table: `Address`
```
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| addressId   | int     |
| personId    | int     |
| city        | varchar |
| state       | varchar |
+-------------+---------+
```
addressId is the primary key (column with unique values) for this table.
Each row of this table contains information about the city and state of one person with ID = PersonId.
 

Write a solution to report the first name, last name, city, and state of each person in the Person table. If the address of a personId is not present in the Address table, report null instead.

Return the result table in any order.

## 僕の回答
```py
import pandas as pd

def combine_two_tables(person: pd.DataFrame, address: pd.DataFrame) -> pd.DataFrame:
    result = pd.merge(person, address, on="personId", how="left")
    return result.drop(["personId", "addressId"], axis=1)
```

## より効率の良い回答例
どれも似たような実装でした。


## コメント
Pandasの学習が初めてなので、調べながらの実装だったけど基本操作などのかなりの学びがありました。特に、
```py
result.drop(["personId", "addressId"], axis=1)
result.drop(columns=['personId', 'addressId'])
result[['firstName', 'lastName', 'city', 'state']]
```
のように複数の方法で必要な列を取り出す方法があると学びました。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/02dbb03a2f18c44ebeee
生成AIの活用事例：企業におけるビジネス革新の実例



## はじめに
生成AI（Generative AI）技術は、ビジネスの現場に革新的な変化をもたらしています。本記事では、実際のビジネスシーンにおける生成AIの具体的な活用事例を紹介し、その導入による効果や課題について解説します。

---

## 1. カスタマーサービスにおける活用

### チャットボットの高度化
従来のルールベースのチャットボットと比較して、生成AIを活用したチャットボットは、より自然な対話と柔軟な応答が可能になっています。具体的な導入例として、以下のような成果が報告されています：

- 対応時間の24時間化を実現  
- 一次応答の精度が従来比で30%向上  
- カスタマーサービス担当者の作業負荷が40%減少  

### 問い合わせ内容の自動分類と対応優先度の判定
生成AIによって、顧客からの問い合わせ内容を自動的に分類し、緊急度や重要度に応じて適切な優先順位付けを行うことが可能になりました。これにより、重要案件への迅速な対応が実現しています。

---

## 2. コンテンツ作成業務での活用

### マーケティング資料の作成支援
生成AIを活用することで、以下のようなコンテンツ作成業務の効率化が実現しています：

- 商品説明文の自動生成  
- SNS投稿用のキャッチコピー作成  
- ブログ記事の下書き作成  
- メールマガジンのテンプレート作成  

**特筆点**：初稿作成までの時間が従来の1/3程度に短縮される。

### 多言語コンテンツの展開
生成AIによる翻訳支援により、グローバル展開におけるコンテンツのローカライズが効率化されています。文脈を理解した自然な翻訳が可能になり、翻訳コストの削減と展開スピードの向上を実現しています。

---

## 3. 製品開発・設計での活用

### デザイン案の生成
生成AIを活用して複数のデザイン案を短時間で生成し、クリエイターの発想を支援します。具体例：

- 建築物の外観デザイン案の生成  
- 家具のデザインバリエーション作成  
- パッケージデザインの試作  

### コード生成による開発効率化
プログラミングの分野では、生成AIによるコード生成・補完機能により、開発効率が向上しています：

- ボイラープレートコードの自動生成  
- テストコードの作成支援  
- バグの検出と修正提案  

---

## 4. データ分析・レポート作成での活用

### データの可視化と解釈
生成AIを活用することで、複雑なデータを分かりやすく可視化し、インサイトを抽出する作業が効率化されています：

- データの傾向分析レポートの自動生成  
- グラフや図表の最適な表現方法の提案  
- 異常値の検出と原因分析  

### ビジネスレポートの作成
定型的なビジネスレポートの作成において、生成AIが以下を支援：

- 月次報告書の自動生成  
- 市場調査レポートの要約作成  
- 財務データの分析と解説  

---

## 5. 導入における課題と対策

### データセキュリティの確保
生成AIの活用にあたっては、セキュリティ面での懸念が重要な課題となっています。対応策：

- 機密情報の取り扱いに関するガイドラインの整備  
- データの匿名化処理の徹底  
- アクセス権限の適切な管理  

### 品質管理とヒューマンレビュー
生成AIの出力結果に対する品質管理も重要な課題です：

- 出力内容の正確性確認プロセスの確立  
- 人間による最終チェック体制の整備  
- 継続的な精度向上のための仕組み作り  

---

## まとめ
生成AIの活用は、業務効率の向上だけでなく、新しい価値創造の可能性を広げています。ただし、その導入には適切な計画と管理が不可欠です。特に重要なポイントとして：

- 明確な目的とKPIの設定  
- 段階的な導入と効果測定  
- セキュリティと品質管理の徹底  
- 人材育成と組織体制の整備  

これらを考慮しながら、各企業の状況に応じた最適な活用方法を検討することが重要です。

---