OmniAICreator/Qiita-1.07M huggingface dataset:
地方公共団体情報システム標準化の適合確認システム

地方公共団体情報システム標準化に関連して、[適合確認試験](https://lgsys-conformance.digital.go.jp/)というものがあります。
良い試験であり、重要なものです。
ところが、まだ合格したものは、2024年6月現在で、1件しかありません。
この確認試験のサブセットを開発しようというものです。

システムとしては、csv ファイルをアップロードして、適合しているか否かの判定をします。
第一段階としては、基本データリストを対象とします。
全部で、31システムがあり、1400あまりの csv ファイルの適否が判定できるものとします。

## 入力ファイルの例

001_住民基本台帳

```text
001001_kihon_20240624142821793926_1.csv
001002_kihon_20240624142821895917_1.csv
001003_kihon_20240624142821998728_1.csv
001004_kihon_20240624142822104958_1.csv
001005_kihon_20240624142822209567_1.csv
001006_kihon_20240624142822310866_1.csv
001007_kihon_20240624142822415047_1.csv
001008_kihon_20240624142822522849_1.csv
001009_kihon_20240624142822626639_1.csv
001010_kihon_20240624142822729142_1.csv
001011_kihon_20240624142822826760_1.csv
001012_kihon_20240624142822922133_1.csv
001013_kihon_20240624142823016123_1.csv
001014_kihon_20240624142823109998_1.csv
001015_kihon_20240624142823203255_1.csv
001016_kihon_20240624142823297957_1.csv
001017_kihon_20240624142823391368_1.csv
001018_kihon_20240624142823485946_1.csv
001019_kihon_20240624142823580970_1.csv
001020_kihon_20240624142823675227_1.csv
001021_kihon_20240624142823770309_1.csv
001022_kihon_20240624142823864748_1.csv
```

ファイル名は、
ファイル連携に関する詳細技術仕様書　第2.2版　に基づきます。
    独自システムを対象にするので、ファイル名に、kihon が入ります。

```text
2.3.1.連携ファイル命名規則
①
連携ファイルの命名規則は以下のとおり。
{連携 ID＋枝番＋版数}_YYYYMMDDhhmmssfff_{9}.csv
連携ファイル名（機能別連携仕様にて、I/O が output となっている連携
機能名の「連携 ID+枝番+版数」）の後ろにスネイクケース（単語間をアン
ダースコアで繋げる表記法）を使用し、ファイル出力したタイムスタンプ
（年月日時分秒ミリ秒）及び連番（タイムスタンプが重複しない場合は 1
固定として、重複する場合に限りカウントアップする）を含め、拡張子は
小文字の「csv」とすること。なお、版数は「version」を表す「v」（固
定）と 4 桁の数字で表現すること。
例）
版数 1.0 版の場合
003o00100v0100_20220126155422111_1.csv
7版数 1.12 版の場合
003o00100v0112_20220126155422111_1.csv
```

```text
⑤
「地方公共団体情報システムデータ要件・連携要件標準仕様書」の独自
施策システム等連携仕様によって、基本データリストを用いた連携におけ
る連携ファイルの命名規則は以下のとおり。
8{システム区分＋グループ ID4}_kihon_YYYYMMDDhhmmssfff_{9}.csv
「システム区分＋グループ ID」の後ろにスネイクケースを使用し、基本
データリストを表す「kihon」（固定）を含め、タイムスタンプと連番と
すること。
```

```text
2.3.2.連携ファイル
①
連携ファイルは CSV 形式とする。なお、CSV 形式の仕様は RFC4180 等
の規定を踏まえ、以下に従うこと。
半角スペースはフィールドの一部分として含むこと。なお、1 行のレコー
ドの最後は、カンマで終了しないこと。
データレコード単位に改行コード（CRLF）を付与すること。なお、ファ
イルの最後のレコードの末尾には、改行コード（CRLF）を付与してもしな
くてもよい。
※提供側業務システムが UNIX／Linux 系の場合は、LF を CRLF に変換す
ること。
ファイル内の各項目をダブルクォーテーションで囲むこと。なお、改行
コード（CRLF）、ダブルクォーテーション、カンマを含むフィールドは、
ダブルクォーテーションで囲み、項目の中にダブルクォーテーションを表
現しなければならない場合は、ダブルクォーテーションでエスケープ処理
すること。
②
1 行目をデータ項目名、2 行目以降をデータ行とすること。なお、データ
項目名は日本語とすること。
```

## 実装例

まだ、ありません。
RSSFeedLoaderで、「exception: newspaper package not found, please install it with `pip install newspaper3k`」が消えない

## LangchainのRSSFeedLoaderで、RSSからドキュメントロード時に以下のエラーが発生した


#### ソース(rss/test.py)
```python
from langchain_community.document_loaders import RSSFeedLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores.inmemory import InMemoryVectorStore

urls = ["https://rss.itmedia.co.jp/rss/2.0/aiplus.xml"]

loader = RSSFeedLoader(urls=urls)

text_splitter = CharacterTextSplitter(
    separator = "\n",
    chunk_size = 400,
    chunk_overlap = 0,
    length_function = len,
)

index = VectorstoreIndexCreator(
    vectorstore_cls=InMemoryVectorStore,
    embedding=OpenAIEmbeddings(),
    text_splitter=text_splitter,
).from_loaders([loader])
```

#### エラーメッセージ
```sh
Error processing entry https://www.itmedia.co.jp/business/articles/2406/25/news053.html, exception: newspaper package not found, please install it with `pip install newspaper3k`
```

#### newspaper3kをインストールした後でも、同じエラーがでる。
```sh
% pip install newspaper3k
% python rss/test.py
Error processing entry https://www.itmedia.co.jp/news/articles/2406/25/news101.html, exception: newspaper package not found, please install it with `pip install newspaper3k`
```

## lxml[html_clean]をインストールすることでエラーが解消した
#### lxml[html_clean]インストール
```sh
% pip install "lxml[html_clean]" 
```

#### エラー解消
```sh
% python rss/test.py            
Created a chunk of size 850, which is longer than the specified 400
Created a chunk of size 593, which is longer than the specified 400
```
Google Colab ProのGPUガチャを快適にまわす

# 背景
最近Colab Pro +に課金をしたのですが，最も強いA100は人気が高いせいか時々接続ができずに下位のGPUに接続されるということがあります。(通称GPUガチャ)
その場合，セッションをリセットしリソースを変更する必要があるのですが，複数回これを実行するとなると結構めんどくさいです。
L4も悪くはない気がしているのですがせっかく課金したなら強いGPUを使いたいですよね。そのためセルを実行するだけでイイ感じにリセットしてくれるコードを書きました。

# やりかた
下記コードをセルの最上部に張り付けて実行するのみです。
```python
import subprocess
import os
import re

def get_gpu_memory():
    result = subprocess.run(
        ['nvidia-smi', '--query-gpu=memory.total', '--format=csv,nounits,noheader'],
        stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    if result.returncode != 0:
        print(f"Error querying GPU memory: {result.stderr}")
        return None
    return int(result.stdout.strip().split('\n')[0])

vram = get_gpu_memory()

if vram is not None:
    print(f"Detected GPU VRAM: {vram} MB")
    if vram < 40960:  # 40GB = 40960MB
        print("VRAM is less than 40GB. Restarting the session...")
        os.kill(os.getpid(), 9)
    else:
        print("VRAM is 40GB or more. No need to restart the session.")
else:
    print("Unable to detect GPU VRAM.")
```

やってること自体は単純で，GPUのメモリ量を取得して40GB未満なリセットしてます。24年6月時点ではA100以外がVRAM40GB未満なのでA100に接続できれば以降のセルも正しく実行できます。

# おわりに
A100以外を使いたい場合，このコードを実行するとセッションリセットされるので消すかコメントアウトを忘れずに。快適にGPUガチャを回しましょう。
【Spring Boot + Thymeleaf】外部CSS読み込みに苦戦した話

# 背景
今年から新卒エンジニアになり、研修でSpring Boot+Thymeleafを用いてWebアプリケーションを作成していました。HTML上に記述していたstyleコードが長くなったので外部CSSを作成して読み込もうとしたところうまく表示できなかったので、解決までの一部始終を書きたいと思います。
# 動作環境
- Windows11
- Eclipse 4.30.0
- Spring Boot 3.3.0
- Thymeleaf 3.1.0
# ファイル構成
```
/src/main/resources
    ├ db.migration
    ├ templates
        ├ common
            └ head.html
        ├ style
            └ style.css
        ├ user
            ├ detail.html
            ├ list.html
        └ index.html
    ├ static
        ︙
```
# 状況
上のファイル構成で`style.css`にスタイルを記述し、HTMLには
```
<link th:href="@{style/style.css}" rel="stylesheet">
```
の一文を`head`に加えましたが、スタイルが適用されませんでした。
# 原因と解決法
[~~公式ドキュメント~~(正しくは公式ドキュメントを和訳していただいているもの)](https://spring.pleiades.io/guides/gs/serving-web-content#initial)によると、Spring BootではJavaScript、CSS などの静的リソースは src/main/resources/staticに配置する必要があるようです。また自分のHTMLではリンクの指定の仕方も間違っていました。正しいファイル構成は以下のようになります。
```
/src/main/resources
    ├ db.migration
    ├ templates
        ├ common
            └ head.html
        ├ user
            ├ detail.html
            ├ list.html
        └ index.html
    ├ static
        └ style
            └ style.css
        ︙
```
また、HTMLコードを以下のように変更すると、
```
<link th:href="@{/style/style.css}" rel="stylesheet">
```
無事にCSSに記述したスタイルが適用されたページを表示することができました！
同じような事象でつまづいている人の一助になれば幸いです。
Xunitでmemberdataで小数点からIntなどへの変換が発生している場合の挙動調べ

## 起こり
* 消費税計算などのテストを書いてるときmemberdataにdouble型になるような値がある、ただメソッド側の引数はint型指定になっているためmemberdata→どのような変換が行われているか知りたい。

例
``` cs
    public static object[][] SampleData
    {
        get
        {
            return new[]
            {
                (100 + 900) * 1.08 + (99 + 600) * 1.1
            }
        }
    }

    [Theory]
    [MemberData(nameof(SampleData))]
    public void someTest(int expected)
    {
        Assert.Equal(100, expected);
    }
```

みたいな状態。

### ひたすらデバッグで追う
https://github.com/xunit/xunit/blob/9f1684f5f74196d952f0085d7bde21aa20df6229/src/xunit.execution/Sdk/Frameworks/Runners/XunitTheoryTestCaseRunner.cs#L162
どうやらこのへんでMemberdataから引数への変換を行っているようだ。

https://github.com/xunit/xunit/blob/9f1684f5f74196d952f0085d7bde21aa20df6229/src/xunit.execution/Sdk/Reflection/Reflector.cs#L46
ここですね。

今回のケースだとDouble→Intへは

`Convert.ChangeType(arg, type, CultureInfo.CurrentCulture);`

となっている。なので単純な`(int)val`みたいなキャストとは違っていた。
Reactで作ったサイトをGCSで公開する為にやるべき事

##### 注意事項
私はインフラエンジニアでありフロントエンドエンジニアではない為、Reactの理解が間違っている可能性があります。
間違っている箇所は、適宜指摘いただけたら嬉しいです。

## GCSでReactのコンテンツを公開する為の基本設定

### GCSでWebホスティングする為の設定
省略します。
[公式ドキュメント](https://cloud.google.com/storage/docs/hosting-static-website?hl=ja)を見て公開すれば、問題なく公開できます。

### 特殊ページの割り当て
Reactは、index.html の読み込みでブラウザにダウンロードした JavaScript がURLのパス文字列を解釈して、実体のファイルを取得します。
この為、404で返ってくるパスに対しても index.html を返すように設定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177247/3284c88a-5a5c-4c51-6bc5-bbb53da06ef1.png)

## Reactでサブディレクトリを使う為の設定
GCSバケット上のトップディレクトリにindex.htmlがある場合で考えます。
例えば、https://example.com/hogehoge/ というサブディレクトリに対してのアクセスを行う場合、上記特殊ページの割り当てを行っておけば、表示自体は問題なくできます。
しかし、hogehoge へのアクセスは一度404となってからindex.htmlに着地する為、SEOの観点から問題が起きる可能性もあります。
動きとしては、以下となります。

1. https://example.com/hogehote/ へブラウザからアクセス
1. GCSバケット上に /hogehoge/index.html がない（hogehogeディレクトリ自体がない）為、404となる
1. 404の為、GCSバケット上の /index.html がブラウザに返される
1. ブラウザがReactの JavaScript を読み込み、パスを解釈して正常に動作する

Webコンテンツとしてはこれで問題なく動くのですが、2番の404が発生したタイミングで検索エンジンのインデックスから https://example.com/hogehoge/ が削除されてしまいます。
これを避けようとした場合、以下のどちらかを行う必要があります。

+ /hogehoge/ ディレクトリ配下にも、Reactでビルドしたファイルを配置する
+ /hogehoge/ ディレクトリ配下に来たアクセスを、/ に着地させる

本セクションでは、後者を Cloud Load Balancer で行う方法を解説します。

### Cloud Load Balancer 
この記事の対象となるロードバランサーは、`グローバル外部アプリケーション ロードバランサ` になります。
旧ロードバランサーや内部ロードバランサー、TCP/IPロードバランサーは対象外です。
（GCSでWebホスティングする為の設定 で公式ドキュメントを元に構築していれば、問題ありません）

### ルーティングルールの変更
作ったロードバランサーを編集し、ルーティングルールを変更します。

1. 詳細なホストとパスのルールに変更
1. ホストとパスのルールを追加
1. 新しいホストとパスのルールに、以下を記載して適用

ホスト：*
パスマッチャー：
```
defaultService: projects/<GCP project id>/global/backendBuckets/<backend bucket name>
name: matcher1
routeRules:
  - matchRules:
    - pathTemplateMatch: /hogehoge/**
    priority: 1
    service: projects/<GCP project id>/global/backendBuckets/<backend bucket name>
    routeAction:
      urlRewrite:
        pathTemplateRewrite: /
```

## まとめ
GCSを使ったWebホスティングは、React等のクライアントコンピューティングにとってコストパフォーマンスが高く、とても親和性が良いものになります。
その代わり、こういった痒い所に手を届かす為の設定が必要になります。
今回、Cloud Load Balancer でのURLマッピングの設定に手古摺った為、備忘替わりに記事を作りました。
具体的には、URLマッピング中に以下の事に困りました。

+ weightedBackendServices ディレクティブではバックエンドサービスしか使えない為、バックエンドバケットを指定したい時に何を使えばいいか分からない → service ディレクティブでバックエンドバケットを直接指定する
+ マッチ文字列にワイルドカードを使いたい場合に、prefixMatch は使えない（regexMatchはインターナルロードバランサーでしか使えない為、pathTemplateMatchを使う必要がある）

以上、皆様の参考になれば幸いです。
【Dockerfile】CMD で起動時にWebサーバーが起動する Python イメージをビルドする

# はじめに
この記事では、Dockerfile で起動時にWebサーバーが起動する Python イメージをビルドする手順について記載します。
Dockerfile の `CMD` インストラクションへの理解促進の一環で行っています。

https://docs.docker.com/reference/dockerfile/#cmd

:::note
Nginx イメージや MySQL イメージは、デフォルトで各サーバーが起動します。一方、Python イメージは、デフォルトで対話シェルが起動します。そのため、今回は `CMD` インストラクションを利用して、コンテナ起動時にWebサーバーが起動するようにします。
:::

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

- Windows 11
- Docker Engine 26.1.1
- Python 3.12.4

# ベースイメージとWebサーバー起動コマンド
今回のベースイメージは、2024年6月時点で latest タグと同等の 3.12.4 にします。

https://hub.docker.com/_/python

また、Webサーバー起動のためのコマンドは、`python3 -m http.server` を利用します。

https://docs.python.org/3/library/http.server.html

:::note
`http.server` では、シンプルな静的ホスティングのみを行うWebサーバーを起動します。
:::

# `docker container run` で Python コンテナをWebサーバーにする
Dockerfile でイメージを拡張する前に Python コンテナを操作してWebサーバーとして利用できるか確認します。

```powershell
docker container run `
--name web           `
--rm                 `
--detach             `
--publish 8000:8000  `
python:3.12.4        `
python3 -m http.server
```

ブラウザで http://localhost:8000/ にアクセスすると、ファイル一覧画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/45505759-34c4-3c05-5ef5-d9a9431569f5.png)

Python コンテナを操作してWebサーバーとして利用できることが確認できたので、webコンテナを停止します。

```powershell
docker container stop web
```

# `CMD` インストラクションで Python コンテナをWebサーバーにする
次は Dockerfile でイメージを拡張します。コンテナ起動時のコマンドの指定は `CMD` インストラクションで行います。

```powershell
CMD ["executable","param1","param2"]
```

先頭の `"executable"` がコマンド名で、それ以降が引数です。

https://docs.docker.com/reference/dockerfile/#cmd

:::note
`"executable"` はフルパスで書くことが推奨されています。
そのため、Dockerfile を書く前に python3 のコマンドのパスを確認しておきます。

```powershell
docker container run python:3.12.4 which python3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/74f1c5df-88f4-db92-bd87-7167e48d7a61.png)

:::

Dockerfile を作成します。

```Dockerfile
FROM python:3.12.4

# CMD ["executable","param1","param2"]
CMD ["/usr/local/bin/python3", "-m", "http.server", "8000"]
```

上記 Dockerfile からイメージをビルドします。

```powershell
docker image build --tag my-python:web .
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/2ad8ba34-3fe9-fa4f-0c8f-cd960571f5af.png)

`my-python:web` がビルドされたことを確認します。

```powershell
docker image ls my-python
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/867f9bec-e0b8-7064-6e76-00c748eab3a6.png)

次はビルドしたイメージからコンテナを起動します。

```powershell
docker container run `
--name web           `
--detach             `
--publish 8000:8000  `
my-python:web
```

ブラウザで http://localhost:8000/ にアクセスすると、先ほどと同じファイル一覧画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/3e39dec6-809c-c726-d4c8-2761ff0e88d8.png)

# 参考
- [Dockerfile reference](https://docs.docker.com/reference/dockerfile/)
- [http.server](https://docs.python.org/3/library/http.server.html)
- [	鈴木亮「開発系エンジニアのためのDocker絵とき入門」秀和システム、2024](https://www.shuwasystem.co.jp/book/9784798071503.html)

# 関連記事

https://qiita.com/Yasushi-Mo/items/17f755b9160767947d3e

https://qiita.com/Yasushi-Mo/items/f23a9234daa1ac4f547d

https://qiita.com/Yasushi-Mo/items/fe9edaaa1e368bd593a7
IPアドレスとは？

### はじめに
IPアドレスにまつわる単語の意味や役割についての概要を自身の知識のインプットを目的にQiitaでのアウトプットをしていきます。


### IP (Internet Protocol)
インターネット上のアドレス、つまり住所のこと
アクセスしているすべてのものに存在しています。
表記は192.168.xxxx.xxxx。

コンピュータは0と1しか扱えない＝2進数表記
11000000.10101000.xxxxxxxx.xxxxxxxx
人間としてはわかりづらい...そのため

:::note
32bitを8bitごとにドット(.)で区切られた4つの数字羅列の塊。
10進数に変換して表記しています。
現在主流のIPv4という通信規格。
:::
### LAN (Local Area Network) 
同一の敷地または、建物内等に構築されたネットワーク

:::note
プライベートIPアドレス
:::
ローカルIPアドレスともいう。
ローカル利用されるアドレス、LAN内で利用される住所のこと
端末ごとにある。
世界中で重複するアドレスが存在している。
割り当てはDHCP機能により。

### WAN (Wide Area Network)
LANとLANをつないでいる状態のこと
インターネットに接続すること

:::note
世界で一つのIPアドレスであり、グローバルIPアドレスという。
:::
WANで利用される住所のこと
インターネット利用のためには
・ネット接続サービスを提供している<font color="blue">**ISP(インターネットサービスプロバイダー**)</font> 
・物理的な回線の提供をしている<font color="Red">**回線事業者**</font> から成り立っている。

![スクリーンショット 2024-06-20 095558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806876/36a7a01a-11fb-ed98-3b04-b761dd00d734.png)



グローバルIPアドレスの割り当てはISPから。
もとをたどると
ICANN　→　JPNIC　→　ISP　→　個人や企業

### ICANN (Internet Corporation for Assigned Names and Numbers)
JPNICにグローバルIPアドレスを割り振る。アドレス(ドメイン名も)の管理をしている国際的な非営利組織。特定の国の影響下にない。

### JPNIC　(日本ネットワークインフォメーションセンター)
日本国内においてIPアドレスなどインターネットにおける番号資源の管理を行うための非営利組織。

https://www.nic.ad.jp/ja/profile/

### ISP (Internet Service Provider)
個人や企業に対してインターネット接続のための窓口の役割をしています。
物理的な回線提供をしている回線事業者のどちらかだけではインターネットを利用することができません。


![スクリーンショット 2024-06-20 093838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806876/42c51441-5d27-396f-f552-9b7b1c4b480d.png)

### 通信の流れに伴う機器、役割

### NAT(Network Address Translation) と NAPT(Network Address Port Translation)とは

:::note
プライベートIPアドレスをグローバルIPに変換する技術。
:::
NATは<font color="Red">**1対1**</font>で変換しますが、NAPTは<font color="Red">**複数対1**</font>で変換します。
1つのグローバルIPアドレスを複数の端末で共有するためのものがNAPTです。
一家庭内などで家族がそれぞれインターネットを利用するイメージが理解しやすいでしょうか。
NATで一家庭内の家族がインターネットを利用するとなると同じタイミングでインターネットを利用することが難しくなってしまいます。
この技術は「ルーター」が機能として備えているのが一般的。

### ルーターとは
ルーターとはネットワーク間の接続をおこなう機器。
複数の異なるネットワークの間に存在し、データを中継する役割があります。
※ネットワークは何かと何かのつながりのこと。
インターネット上の住所のような役割を果たすIPアドレスを確認することで、ネットワーク→***届け先***を決めている。

### モデム、ONUとは
インターネットを利用するにあたり、パソコンやタブレット、スマホなどのデータ＝<font color="green">**デジタル信号**</font>。
通信事業者の提供による物理的な回線の中は<font color="gray">**アナログ信号**</font>(電話回線)、<font color="orange">**光信号**</font>(光ファイバーケーブル)。
それぞれ異なる信号を扱っています。

:::note
**モデム**：デジタル信号からアナログ信号に変換(逆方向然り)
**ONU**：デジタル信号から光信号に変換(逆方向然り)
:::
***相互変換***する役割を担っているのがそれぞれの機器です。


### まとめ
・家や企業にデータを届けるためにはグローバルIPアドレス(WAN)を利用
・家や企業の中(LAN)でどの端末にとどけるかはプライベートIPアドレスを利用。
・IPアドレス＝住所である宛先を判別することでやり取りができている。
・変換機器(機能)を経てインターネットが利用できている。


やり取り＝ネットワークをつなげて大規模なインターネットとして利用するためには、そもそも「対象」とする相手住所を判別するIPアドレスがあることによって成り立っている。

グローバルIPアドレスが足りなくなってしまう枯渇(IPv4)問題に対するIPv6についての知識や動きも今後注意していきたいと感じます。

---

引用:参考元サイト

https://www.ntt.com/business/services/network/internet-connect/ocn-business/bocn/knowledge/archive_157.html

https://envader.plus/article/51

https://www.nic.ad.jp/ja/ip/ipv4pool/

https://prebell.so-net.ne.jp/tips/pre_240301003.html
https://xtech.nikkei.com/it/atcl/column/17/011900625/011900005/
https://www.bbiq.jp/hikari/column/provider/basis/
【ディズニーランド】AWS summit行ってみた

# 異様な京葉線
朝の京葉線は、ディズニーランドに行く人々が多くを占めていました。
ウッディの帽子をかぶった少年と目が合い、私はこう思いました。

---------ぼくもディズニーランドに行くんだ。

また違った行き先をもった多くの人が乗ってることは、ウッディたちは知る由もありません。

# 舞浜で下りずに

舞浜でディズニーに行くお客様方は全員降車されます。
すると、車内の状況は一変。

パソコンな雰囲気になりました。

ウッディたちはいなくなり、さながら、そこはAWSの資格試験のテストセンターの待合室に一変しました。

# 海浜幕張
サマーソニック以来に来ました。
Beckではなく、Jeff Bezosを見に来ています。

到着は初日は１０時半、二日目は９時半でしたが、
両日ともに、無料のお弁当はもう無くなっていました。

# 【覇気】基調講演はアツい

立ち見推奨な気がしました。
というのも、立ち見することで、映像ではなく、実際に講演している人をその目で見ることができるからです。（もちろん良い席に座れれば見れますが）

AWSに君臨する方々の生の声、身振り、それで覇気が伝わり、モチベーションになりました。

>高度な技術は魔法と見分けがつかない

こういう「盛ってるな」、感も動画よりも冷静に客観視できたのもよかったです。


# 【お土産】グッズが得られる。

AWS certのシールをもらいパソコンに貼りました。

そのほかにも、いつも使ってるdatadog、gitlabなど、や名前を聞いたことがある有名企業の話を聞いて色々もらえます。

個人的にはIBMのトートバッグが気に入りました。


# 話を聞ける

講演以外にもセッションが絶え間なく開かれていて、学びになります。
基礎的な内容をキャッチアップするのにも良いし、
気になっている内容からある程度詳しい内容を聞くのも良しです。

詳しくない部分の知識でも、
旅の恥はかき捨てってことで、理解が固まらない時点でも、話かけて帰ってくるので、良い感じに疑問点を整理できて良いです。
chatgptよりもやはり人ですね。

今までBlack Beltは無限に見てきたのですが、リアル世界は距離が近く同じ時間を経験することで、色々メリットがあると感じました。


# 偶然性

適当に回りながらなので、Google chromeから見る景色とは違って偶然の出会いもできやすくなるのではないかと思います。

偶然立ち寄った、CDKのOSSコントリビュートのセッションが良かったり、全然関係のない製薬のセッションを見たらチームビルディングについて述べられていたり、偶然の学びがありました。

# 認定者ラウンジ

AWS資格を持っていれば、飲み物あり、コンセントありのブースが使えました。
空港みたいでよかったです。通常の座席は混雑でほぼ埋まっていたのですが、
このラウンジは席が空いていないということがなく、便利でした。VIP待遇ですね。

# 目の前で表彰されてる

知ってる人が目の前で表彰されてるのを見て、
その遠さを感じられました。体感すべき。

# 以上

ウッディについて行かなくてよかったです。
TypeScript メモ

# はじめに
こんにちは！WEBエンジニア転職を目指しているK.Yです！
以下のJavaScriptコードをTypeScriptに置き換えてみました！

## コード
```javascript
//JavaScript

//   関数の定義
const getNameAge = (array,targetAge) => array.find( array => array.age === targetAge);

  array = [{ name: '太郎', age: 20 }, { name: '次郎', age: 30 }, { name: '三郎', age: 40 }];
  targetAge = 30;

const result = getNameAge(array, targetAge);

//   関数の呼び出して結果をconsole.logする
console.log(result);
```
```typescript
//TypeScript

//   関数の定義
const getNameAge = (array: Person[],targetAge: number): Person | undefined => array.find( array => array.age === targetAge);

const array: Person[] = [{ name: '太郎', age: 20 }, { name: '次郎', age: 30 }, { name: '三郎', age: 40 }];
const targetAge: number  = 30;

const result = getNameAge(array, targetAge);

//   関数の呼び出して結果をconsole.logする
console.log(result);
```

## メモ
TypeScriptに置き換えるためには、関数の引数と戻り値の型を明示的にする必要があります！
`array`は配列のため、Person型と`[](角かっこ)`を付け加えて明示する。
`targetAge`は数値なので、number型で明示する。
戻り値の型は、`Person | undefined`です。
`find`メソッドで条件に一致しなかった場合は、`undefined`で返すように書きました！


:::note info
文字列の型は`stirng`
:::
Case作成をシュッと効率化、テンプレート化する（備忘録）

# 前置き✋　
- Case作成をする際、毎度粒度が違うことを書いてしまうな…テンプレートがあるといいな
- という思いを、Caseクローズの度に思いつつ、忘れて、人は（＝私は）同じことを繰り返してしまうのです…
- 反省も含めて、個人的Caseテンプレートを備忘として残します

# Case作成
- 以下にアクセスする
    - https://www.ibm.com/mysupport/s/
- `Open Case`を押下
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/e667dd06-d86f-a759-159b-ba02e65125d9.png)
- IBMidのログインを行う
    - idがない場合は作成を行ってください
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/6a0c303f-3433-f400-c203-d02053d8780f.png)

- Case必要事項を記載していき、ケース・テンプレートにチェックを入れ、ケーステンプレート名を設定
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/44786917-e41f-398a-ae4f-229703be1537.png)
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/933ba2df-43cb-01c6-e2dd-5507ba794eef.png)
    - ![スクリーンショット 2024-06-25 093327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/6a93c7fe-3633-268a-c4ca-e7e52c0ee700.png)


- ケース・テンプレートに関する注意書きは以下の通り
```
ケース・テンプレートは、お客さまが頻繁に使用するフィールドを自動的に取り込み、
新規ケースをより簡単に開くのに役立ちます。 テンプレートを作成するには、ケースを送信する前に、
「将来使用するためにこのケースをテンプレートとして保存する」を選択します。
以下の点に注意してください。テンプレートの作成時に必要となる、
ケース・タイトル、ケース記述、ケース重要度のフィールドは保存されません。 
ケースを開くたびに、この情報を入力してください。
```
- え…！ケース記述（Caseの説明）はテンプレに保存されないのか～そりゃそうか～
- ですが、記事化して残しておいて悪いことはないので、今後は以下のケース記述を毎度コピーして使いたいと思います

# しばらく個人的に使っていきたいケース記述（Caseの説明）テンプレート
- 尚Case作成時、下書きはマークダウンファイルで作成派なので、マークダウン記述方式となっております

```
# 事象

## Caseで求めること
- 「回避策/ヘルプ」: 該当
- 「アドバイス」：該当なし
- 「説明」：該当なし

## 事象１概要
- XXXXを作成して開始すると成功するが、XXXXが上手く稼働しない。

## 事象１再現手順
1. ～を開始
2. XXXメニュー＞YYYY押下＞ZZZZ確認
3. ・・・
4. ・・・

## 事象２概要
- XXXXを作成して開始すると成功するが、XXXXが上手く稼働しない。

## 事象２再現手順
1. ～を開始
2. XXXメニュー＞YYYY押下＞ZZZZ確認
3. ・・・
4. ・・・

# 事象発生検知タイミング
- YYYYグループPTFを最新化したタイミングで、事象発生
    - 適用グループPTF
        - PTFID：LevelXX

# エラーログ内容抜粋
- エラーコード
- エラーメッセージ

# 解決のために試みたこと
- CCCCを実施
    - →事象解消せず

# 環境前提
- IBM i 7.5/TR3
- 利用ユーザープロファイル：TEST
  - ユーザークラス：*SECOFR 

# 添付
- 適用PTF情報
  - DSPPTF.txt
  - WRKPTFGRP.txt
```

# おわりに
- 保守コール電話をしていた頃より、Case作成は素早く、便利ですね。（過去、よ～くお電話していました）
- トラブルを早く解決するには、文章化スキルが求められるところです
- 簡潔にわかりやすく、受け取り手がすぐに調査に動けるような説明文の記載を心がけていきたいですね
- こんな項目もあった方がよいよね！等アドバイスがございましたら、コメントいただけましたら幸いでございます！
最小限の労力で寿司打10000円を達成するユニークな方法

僕の個人的な意見ですが寿司打10000円コースをクリアできるくらいのタイピング速度を獲得することは大学生（特に情報系学部の学生）や社会人にとって時間を割く価値があると思います。理由は至ってシンプルです。なぜなら**正確に、素早く文字入力ができるようになるから**です。これからもっと具体的に説明していきます。

## 10分でレポート１回分の差が生まれる
メリットが分かりやすいように数字を使って説明してみます。
私はタッチタイピングの習得を思い立ったとき、寿司打で4000円ほど食べられるぐらいのレベル感でした。平均キータイプ数を確認したところおおよそ2.5回/秒ほどでした。これが寿司打10000円のレベルになるとおおよそ4.5回/秒になります。
つまり、**1秒にタイプできる回数が2回増える**のです。つまりひらがな入力では1秒に１文字多く打てるようになるということです。ということは10分間で600文字という簡単なレポート１回分程度の違いが生まれてしまうのです。

## キーボードを見ることなく正確に入力できる
人間誰しも短所が少なからずあるのだから自分のことを許す心を持たないといけないですよね!ですが僕には唯一許せないものがあります。それは

すごくシンプルですが、正確に入力することができれば再入力をする必要がなくなり、さらなる速度向上につながります。また画面を見ながらタイピングできることによって間違いをすぐ発見できます。ブラインドタッチを習得すれば

## 具体的に寿司打10000円を達成する方法
### ひよこでもできるタイピング練習講座をやる
これ、一言でいうと神です。僕はタッチタイピングを始めて２週間ぐらいはベネッセのタイピング練習サイトで練習していましたが、スコアが伸び悩み、どうしようと悩んでいた時にこのサイトを見つけました。最初からこれをやればよかったと後悔してるくらいです。
**やること**
**①基礎編を一気に終わらせる**
最初の関門にしてここが一番しんどいと思います。ですが、1日30分できれば1時間ほどまとまった時間をとって一気に終わらせればかなりレベルが上がります。
**②習得編を進め、詰まったら特訓編をやる**
習得編を終わらせれば寿司打5000円くらいになれると思います。ですが途中で何回やっても合格できないところが出てくると思います。その時は特訓編をやりましょう。このサイクルを繰り返せば習得編を完了することができます。1日15分から30分程度やるといいと思います。

### キーボードステッカーまたはキーボードカバーを購入する
これはあまり紹介されているのを見たことがありませんがすごくいい方法だと自負しています。この時重要なのが印字が見えなくなるステッカーやカバーを買うことです。なんとこれを購入してしまえば普段のタイピングがタッチタイピングの練習へと強制的に変化します。
よく紹介されているタッチタイピングの練習法は**普段からキーボードを見ずにタイピングをすることを心がける**というものなのですが、むずいです。やってみるとわかるかと思いますが今までキーボードを見ながらタイピングしてきたのにそれを急に見ないようにするのはかなり意思力を使います。そこで僕はこれを購入してしまえば**強制的にブラインドタッチをせざるをえない状況にできる**と思ったのです。そしてこれは素晴らしい効果がありました。何も考えずに大学の課題やブラウジングをしているだけでレベルが上がっていき、気づいた時には寿司打10000円を達成していました。
注意点としてはステッカーを貼ってるとイキってる感がすごいです。僕のように友人や同僚に「すましてんな」と言われてしまう可能性が非常に高いのでそれが嫌な人はカバーを買うことをおすすめします。

#### やるべきこととしてはこれで以上です。
多くのサイトではホームポジションを覚えた後も1日に何分か時間をとって練習するように言われていますが、一つ工夫をするだけで労力を最小限に抑えることができます。２週間ほどあればひよこでもできるタイピング練習講座も終わらせられると思うので、ぜひやってみていただきたいです。

## 10000円達成しました！
久しぶりにやってみたら寿司打10000円達成していました。
![スクリーンショット 2024-10-31 16.47.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685116/b4c8faff-73b3-8a3f-63be-959b8b29a201.png)

かけた労力としては1時間×２週間をフォームを覚えるためにかけ、そこから３ヶ月ほどはブラインドシールを貼っていただけです。気づいたら達成していました。
AWS CLIでECRにログインする時にハマったこと。

レガシー環境の更新をしていて、awscli周りでハマったので残します。

## TL;DR
- AWS CLIのバージョンがv1だった
- Dockerのバージョンが17だった

## AWS CLIv1からv2へ
既存システムはこのように書かれていました。
```sh
aws ecr get-login --region ap-northeast-1
```

AWS CLIをv2に上げたことによって非推奨になった書き方を変える必要がありました。
(今はv1でも非推奨になっているらしい。。)
https://dev.classmethod.jp/articles/aws-cli-v2-ecr-get-login-password/
```sh
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin https://<AWS ACCOUNT ID>.dkr.ecr.ap-northeast-1.amazonaws.com
```

ここで`unknown flag: --password-stdin`エラーが発生

## `unknown flag: --password-stdin`
調査を進めると、Dockerのバージョンが17で稼働していることが判明。
Dockerバージョンを最新に更新したら治りました。

## さいごに
レガシーツライ
Web基礎


# はじめに
Webシステム開発において知っておきたい観点をまとめる
自身の備忘録と初級者向け
※アプリケーションのアーキテクチャとしては、
　サーバサイドとクライアントサイドを分離しない、システムを想定して記載している。
例）php laravel フレームワークなど

## テクニカル
HTTP method
Rest API
URL設計
非同期通信(ajax)
session管理（管理項目、影響スコープ、ライフタイム）
cookie
cache
暗号化
decode、encode
constant変数
環境変数
共通定義
正規表現
セマンティック バージョニング

## UI関連
favicon
paging処理
パンくずリスト
メニュー
header
footer
tabindex
ポップアップ（dialog）
表示件数上限
メッセージ（メッセージタイプ定義含め）
 - 情報メッセージ（青）
 - 成功メッセージ（緑）
 - 警告メッセージ（黄）
 - エラーメッセージ（赤）

SVG
レスポンシブ対応
マルチOS、ブラウザ対応

BuildVersion表記（デプロイ後の適用確認や、試験時動作バージョンの確認のため）
環境表記（誤った環境へのアクセスを予防する）

## データ関連
validation
 - 必須チェック
 - 種別チェック（文字種、ファイル種別）
 - 桁数（文字数）チェック
 - 重複チェック
 - 相関チェック
 - 上限チェック（文字数、ファイルサイズ）
 - 選択範囲チェック
 - フォーマットチェック（メールアドレスなど）

2重クリック対応
排他制御
トランザクション処理
ブラウザバック対策

## 性能関連
レスポンスタイム考慮
バッチ処理
スケジュール実行

## セキュリティ関連
ssl証明書
ssl通信
SQLインジェクション
XSS
CSRF

ログイン認証失敗時はIDとパスワードどちらが照合失敗したか悟られないようにする
パスワードを保持する際は cleartext で持たない（暗号化する）
Oauth
basic認証
digest認証

## 試験
コードレビュー
静的解析
自動テスト
負荷試験
シナリオ試験
セキュリティ試験
マルチOSブラウザ試験

## 運用関連
ログレベル
ログローテート
ログ種類
 - アクセスログ
 - イベントログ
 - エラーログ

多言語
トランザクションデータ（日々溜まっていくデータ）の考慮

ダウンタイムレスリリース

## ミドルウェア関連

WEBサーバ設定
テーブル正規化
DBチューニング（インデックス）
DBユーザ作成
クエリ最適化

## インフラ関連
コンテナ
プロキシサーバー
負荷分散
オートスケーリング
2024年注目のAIサービス6選：機能と特徴を徹底比較

AIテクノロジーの急速な進化により、様々な革新的なサービスが登場しています。本記事では、特に注目を集める6つのAIサービスについて、その特徴と機能を詳しく紹介します。

## 1. Genspark


**Genspark**は、AIを活用した検索エンジンで、カスタムサマリーを生成します。Perplexityの機能をほぼ全てカバーしながら、無料で利用できるのが特徴です。

### 主な特徴:

- カスタムサマリー生成機能
- OpenAI、Anthropicなど多様なAIモデルの利用
- 高品質な検索結果の提供
- フォローアップ質問に対応する内蔵チャットボット

[公式サイト](https://genspark.com)

## 2. Coze


**Coze**は、プログラミングスキルがなくてもチャットボットを作成できるプラットフォームです。無料でGPT-4oやGeminiを利用でき、使用回数の制限も緩やかです。

### 主な特徴:

- コーディング不要のチャットボット作成
- Discord、Instagram、Slack、Telegramなど多数のプラットフォームとの統合
- 60以上のプラグインを含む豊富なライブラリ
- GPT-4やGPT-4 128kの無料利用

[公式サイト](https://www.coze.com/docs/welcome.html)

## 3. Poe


**Poe**は、月額2500円で複数の高性能AIモデル（Claude 3.5 sonnet、GPT-4o）と画像生成AIを利用できるプラットフォームです。

### 主な特徴:

- Sage、Claude+、ChatGPT、Bardなど多様なチャットボット
- ユーザーフレンドリーなインターフェース
- カスタムチャットボットの作成と共有機能
- iOS、Android向けモバイルアプリ

[公式サイト](https://poe.com)

## 4. Perplexity Pro


**Perplexity Pro**は、AIを活用した高度な情報検索ツールです。LINEMOミニプラン（月額990円）を利用することで、通常年間約3万円のサービスが1年間無料で利用可能になります。

### 主な特徴:

- 無制限のプロ検索機能
- GPT-4o、Claude3Opus、Mistral Largeなどの高性能AIモデルの利用
- 無制限のファイルアップロードと画像生成機能
- Stable Diffusion XL、DALL-E 3などの先進的な画像生成モデル

[公式サイト](https://www.perplexity.ai/pro)

## 5. Quartzite AI


**Quartzite AI**は、プロンプト作成に特化した無料のAIツールです。高品質なプロンプトを効率的に生成できます。

### 主な特徴:

- 高度なMarkdownエディター
- バージョン管理と履歴機能
- カスタムテンプレートライブラリ
- コスト推定機能

[公式サイト](https://www.quartzite.ai)

## 6. AIチャットオー


**AIチャットオー**は、CozeベースのLINEアプリで、無料でGPT-4oや画像生成機能を利用できます。

### 主な特徴:

- LINEアプリ上での簡単利用
- GPT-4oや画像生成機能の無料提供
- ユーザーフレンドリーなインターフェース

[公式サイト](https://obot-ai.com/column/10028/)

## まとめ

これらのAIサービスは、それぞれ独自の特徴と利点を持っています。自分のニーズや使用目的に合わせて最適なサービスを選択し、AI技術の恩恵を最大限に活用しましょう。各サービスの詳細や最新情報については、公式サイトを参照することをおすすめします。

---
MySQL5.7で複数の文字列を同時に置換するSQL

## 文字列を同時に置換するSQL
MySQL8.0ではREGEXP_REPLACE()を利用して簡単に複数の文字列を同時に置換することができるが、MySQL5.7では利用できなかったため、以下で実施しました。

```SQL
UPDATE 
    accounts
SET 
    description = REPLACE(
        REPLACE(
            REPLACE(
                REPLACE(description, 'テスト禁止語句', '〇'), 
                'サンプル', 
                '〇'
            ), 
            'テキスト', 
            '〇'
        ), 
        'テスト', 
        '〇'
    ) 
WHERE 
    description REGEXP 'テスト|サンプル|テキスト|テスト禁止語句';
```

実際は対象の文字列が多かったため、REPLACE(を追加していった。手動で行うのは大変ですが、ChatGPTの利用（「テスト|サンプル|テキスト|テスト禁止語句|文字列A|文字列B|・・・バージョン作成して」と指示を出すこと）で問題なく作成できました。

## 指定する順番
注意点として長い文字列から順に指定する必要があります。以下の場合、「テスト」が最初に「〇」に置き換えられてしまうため、「テスト禁止語句」は「〇禁止語句」となってしまいます。

```SQL
UPDATE 
    accounts 
SET 
    description = REPLACE(
        REPLACE(
            REPLACE(
                REPLACE(description, 'テスト', '〇'), 
                'サンプル', 
                '〇'
            ), 
            'テキスト', 
            '〇'
        ), 
        'テスト禁止語句', 
        '〇'
    ) 
WHERE 
    description REGEXP 'テスト|サンプル|テキスト|テスト禁止語句';
```

## 実行時間
REPLACEが増えても実行時間への影響はなく、以下を実行するのとほぼ同じでした。
```SQL
SELECT *
FROM accounts
WHERE description REGEXP 'テスト|サンプル|テキスト|テスト禁止語句';
```
レコード数が多くてもREPLACEが見るのは、1つのdescription文字列内であるため、description文字列が非常に長い場合でなければ特に影響はありませんでした。ただし、レコード数が多い場合はWHEREで絞る箇所に時間がかかると考えられるので、DBをロックする場合は複数に分割して上記のUPDATE文を実行する方が良さそうです。
【ER図】カーディナリティ「必ず1」「1つだけ」と「1」の違い【テーブル設計】

# はじめに

テーブル設計においては、リレーション（関係）を書く必要があります。

以下の画像がわかりやすいです。

> ## ER図のリレーション表記法一覧
> ![](https://camo.qiitausercontent.com/31f43981443496f8965eb9ec2c72d23cfc5e53da/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531333532342f62646135666136352d646135352d313535322d303830312d3966616433613364613135322e706e67)

https://qiita.com/ramuneru/items/32fbf3032b625f71b69d

この時
- `--|-`：1（one）
- `--||-`：1つだけ（one and only one）（「必ず1」とも呼ばれる）

この違いはなんでしょうか？

大きく、2つのパターンがありました。

# パターン1：対象が入れ替わるかどうか

具体例を見てみましょう。

![](https://i.sstatic.net/lRUbs.png)

https://stackoverflow.com/questions/33781451/crows-feet-one-vs-one-and-only-one/48009414

- LoginIDを持つユーザーは世界に１人だけ。入れ替わることはない：1つだけ / 必ず1
- その部屋を持つユーザーは１人だけだけど、そのユーザーがいなくなったら他のユーザーも使える：1

# パターン2：アプリによる / 区別はしない

アプリ・サービスによっては、`--|-` / `--||-`を区別しなかったり、どちらかしか使うことができなかったりします。

例えば、mermaidを使用しER図を作成する場合、`--|-`は使用できません。
"1"を表すには`--||-`を使用します。

```mermaid
---
title: Order example
---
erDiagram
    CUSTOMER ||--o{ ORDER : places
```
```
---
title: Order example
---
erDiagram
    CUSTOMER ||--o{ ORDER : places
```

↓ `--|-`ではエラーになる
```mermaid
---
title: Order example
---
erDiagram
    CUSTOMER |--o{ ORDER : places
```
```
---
title: Order example
---
erDiagram
    CUSTOMER |--o{ ORDER : places
```

# まとめ

- `--|-`（1）と`--||-`（1つだけ / 必ず1）は、区別する場合と区別しない場合がある
- 区別する場合は「対象が入れ替わるかどうか」がポイントになる
- 区別しない場合もある

個人的な意見としては、（それなりに有名なツールである）Mermaidが区別しない方針である以上、基本的に区別はしなくてよいのではと思います。
# 余談：カーディナリティ

`--|-` / `--||-` これらの「対応関係を表すもの」を「カーディナリティ」と呼びます。

> リレーションシップのカーディナリティ
> ER図などによるデータモデリングやRDBMSのリレーションシップ機能では、項目の対応関係が一対一、一対多、多対多のいずれであるかを指してカーディナリティという。「多重度」と訳されることもある。

https://e-words.jp/w/%E3%82%AB%E3%83%BC%E3%83%87%E3%82%A3%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3.html#Section_%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B7%E3%83%83%E3%83%97%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%87%E3%82%A3%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3
レンダリングパターンの理解【CSR/SSR/SSG/ISR】

Next.jsの勉強を進める中で、
レンダリングパターンを考える時に ?? になることが多いので、
自分なりにまとめてみました。


## CSR：クライアントサイドレンダリング
クライアント（ブラウザ）側でレンダリングされる

### メリット
- - 初回読み込み以降は高速
    - サーバー側にリクエストを出すことがないから
- サーバーの負荷が軽い（Node.jsの実行は必要ないため）
- サーバーには静的なファイルの配置のみで動く
    

### デメリット
- 初回読み込みは遅い
- SEOの懸念（検索エンジンがコンテンツをクロールしにくい）


### 採用タイミング
- ユーザー側で頻繁に更新が発生する、UX重視のWebアプリケーションに向いている
    - 予約サービス
    - ダッシュボード管理



## SSR：サーバーサイドレンダリング

初期ロード時（リクエストが来たタイミング）に、サーバー側で動的にレンダリングし、クライアントに返す。


### メリット
- 生成済みのHTMLを取得するので、SEOに強い
- クライアントのスペックに依存しない

### デメリット
- 生成処理をサーバー側でするので、サーバーの負担が大きい
    - コンテンツによっては、クライアント側でJSの実行を待たずに表示できる（ブラウザに返すだけ）ので速い
- 複雑なページや大量のデータを扱う場合は、初期ロードは遅くなる
- 2回目以降のレンダリングは、サーバーに再びリクエストを送ることになるので、CSRに比べると遅い

### 使用タイミング
- コンテンツ重視・SEO重視のWebアプリケーションに向いている
    - ブログ
    - ECサイト
    - コーポレートサイト


## SSG：スタティックサイトジェネレーション

- ビルド時にデータフェッチやpropsの値の決定を行い、静的なHTMLファイルを構築、それを再利用する。
- クライアントからリクエストされたら、サーバー側で構築することなく、生成済みHTMLを返却する。

### メリット
- 既にビルド済みの静的ファイルを表示するだけなので、表示速度は高速
- クライアントのスペックに依存しない
- SEOに強い

### デメリット
 静的ファイルを再生成してデプロイする必要があるため、即時性が求められる場合には不向き

- リアルタイムのデータ変更を反映することはできない
- 修正するたび、ビルドしなければいけない

### 使用タイミング
- コンテンツ更新頻度が少ないWebアプリケーションに向いている
    - ヘルプページ
    - ポートフォリオサイト
- 静的サイトだったら、SSG一択


## ISR：インクリメンタル スタティック リジェネレーション

- ビルド時はSSGと同様にサーバーサイドでプリレンダリングされる
- ブラウザ側で受け取った後、HTMLをキャッシュしておける
    - 2回目のアクセスは、キャッシュを参照する

- 再生成時間（`revalidate`）を設定できるので、一定時間ごとにデータの再取得を行い、HTMLを再生成する

### メリット
- SSG・SSRと一緒

### デメリット
- Vercelでしか使えない
- `revalidate`で設定した秒数が経過するまでは、古い情報が返される
- 再ビルドされた後、リクエストがあっても、最初はキャッシュを返される

### 使用タイミング
- SSRよりも更新頻度が高くないが、そこそこ更新があるWebアプリケーションに向いている
    - ブログなどの記事投稿サイト



----


ISRは使うタイミング限られそう...

Next.js は、ページごとにレンダリング方式を選択することができるので強い！
「Next.js=アプリ開発」ってイメージがどうしてもありましたが、
むしろ静的なWebサイト制作で使うのも全然良さそうですね。

しっかり理解していないと勿体無いので、最善の選択をして構築を進めたいと思います！
OACのビジュアライゼーションのタイトルを動的に変更する

# はじめに
OAC（**Oracle Analytics Cloud**）でビジュアライゼーションを作成すると、使用した属性やメジャーでデフォルトの名前（タイトル）を付けてくれます。
タイトルは任意のテキストに変更することもできます。

今回は、対話的に変更可能なフィルタを設置して、フィルタで選択した情報が自動的にタイトルの一部になるようなカスタマイズをしてみたいと思います。

# サンプルデータ
sample_order_lines2023.xlsxを使用します。
公式チュートリアルの冒頭でダウンロード用のリンクが示されているので、ダウンロードしてOACのデータセットとして登録しておきましょう。

https://docs.oracle.com/en/cloud/paas/analytics-cloud/tutorial-create-first-visualization/#before_you_begin

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b4c909a3-2c35-1f32-66ad-e5586c4be63e.png)

「Sample Order Lines」という名前で保存しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/d9d03615-34cf-87b4-8dd9-e801c0450720.png)

# ワークブックの作成
Sample Order Linesデータセットを使用して新規にワークブックを作成します。
もし、Auto Insightが起動するようであれば、今回は閉じておきます。

## ビジュアライゼーションを追加
「Customer Segment」と「Sales」をCtrlキーを押しながら同時に選択し、右のキャンバスにドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b2312243-a991-59c7-f4ff-56da0083c5f8.png)

こんな感じになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/adc01751-68ff-4d94-0e74-e4fb58ae9bbe.png)

## フィルタの追加
「Product Category」を「ここにドロップしてフィルタを追加」の位置にドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/0e8e8afd-a9c6-4548-8b2e-7ce78aab751f.png)

ひとまず、「Office Supplies」を選択しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/5b439f00-f200-0942-efcc-cb9aaf306aa9.png)

パラメータにバインドするために「*(x)*」をクリックし、「パラメータの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/8a56d519-41b8-6278-d406-5af4bde9a7f0.png)

「Product Category」という名前でパラメータが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/6922f5d3-222a-8c42-af12-c9eb4b18b108.png)


## ビジュアライゼーションのタイトルをカスタマイズ
ビジュアライゼーションのプロパティを開きます。
一番上のタイトルの「自動」をクリックし、「カスタム」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/84b8b5b5-b45f-b5ba-5d7a-e9617f7e5231.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f49a0a54-13f9-9a1e-e19f-37142fae3f4c.png)
デフォルト値の「Sales / Customer Segment」を削除して次のテキストを入力します。
```
@parameter("Product Category") 販売実績
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/5947ffb0-7bfe-f4e1-5045-0b017a2b7553.png)

# 完成
タイトルのフォントを大きくし、ワークブックを保存します。
あらためてビューモードで開くとこうなります。

フィルタで設定した値がパラメータに入り、そのパラメータを使用してビジュアライゼーションのタイトルが動的に変更されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/e4ab9b0e-594b-87c7-0792-2cfdbcc63107.png)
mass action scheduler 

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [mass-action-scheduler ](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler)

レポートとリストビューからプロセス自動化を宣言的にスケジュールします。

プロセスビルダー、フロー、クイックアクション、電子メールアラート、ワークフロールール、または Apex を宣言的にスケジュールして、レポート、リストビュー、SOQL、または Apex からのレコードを処理します。

レコードが更新されるのを待ったり、レコードを更新してこれらのアクションを起動するための巧妙な回避策を作成したりする必要がなくなります。

# Apex から一括アクション設定を呼び出す/トリガーするにはどうすればよいですか?

+ [Run a Mass Action Configuration from Apex](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JzAcrSAF)

:::note
 MAS configurations can be invoked from Apex. Please see this example, https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Example:-Schedule-Mass-Actions-with-Process-Builder,-Flow,-or-Apex#apex-instructions
:::

 # 一括アクション設定の実行ユーザーを変更する

 + [Change running user of Mass action configuration](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007SqqwJSAR)

:::note
Update: I deactivated and reactivated while logged in as the user I wanted to be the new running user and that resolved the issue.

更新: 新しい実行ユーザーになりたいユーザーとしてログインした状態で非アクティブ化してから再度アクティブ化したところ、問題は解決しました。
:::

# タイムアウト

+ [I am getting the common LC_API: Timeout trying to establish connection to iframe error. Suggestions?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BtcgYSAR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e5989be5-8980-8e09-fcb6-547022ae6b85.png)

:::note
わかりました。そこで、直感で有効にしていたリリース更新に戻ってみると、「Lightning コンポーネントの安全な静的リソースを有効にする」更新テスト実行が有効になっていることに気付きました。これを無効にすると、再び動作するようになりました。

コンソールのスクリーンショットを見ると、ブラウザが aura.enabled javascript ファイルにアクセスできないことがわかります。このリリースが原因だったのです。Salesforce の「有効にしないでください」という警告をもっと注意深く読みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c928ced4-9f5b-51ab-1a95-8a791bc662af.png)

:::

+ [Error Getting Mass Action Configuration: Timeout trying to establish connection to iframe](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epkZP)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8a53e9f0-286c-c2f0-37e1-7055bf693df3.png)

実はこの組織ではリリース アップデートが有効になっていました。サポートに連絡して無効にしてもらいました。無効にした後も、同じエラーが引き続き発生します。他にご意見がありましたらお知らせください。

ここにある方法でもダメだったようです

https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues/93
React19にuseActionStateが導入されて非同期処理がシンプルになった

## はじめに
React19で新たに追加された`useActionState`は、非同期アクションの状態管理を簡素化し、エラーハンドリングや状態管理を容易にします
本記事では、`useActionState`の使い方とその利便性について解説していきます

## `useActionState`関数とは
`useActionState`は非同期アクションの実行状態、成功時の状態、エラー時の状態を一元管理できるフックです
これにより、非同期アクションの実装が簡潔になり、コードの可読性が向上します

### React 19の実装例: useActionStateの使用
```js
import { useActionState } from 'react';

const [error, submitAction, isPending] = useActionState(
  async (previousState, newName) => {
    const error = await updateName(newName);
    if (error) {
      // エラーが発生した場合
      return error;
    }

     // 成功した場合
     return null;
    },
    null,
);

// 使用例
const handleSubmit = () => {
  submitAction('New Name');
};
```

第1引数がアクションであり、非同期関数となっています
それに伴って、返り値に`isPending`が追加されています
これは`useTransaction`の`isPending`と同じかと思われます

返り値に含まれる`submitAction`というのは、アクションを実行する関数です
このようにステート更新に非同期処理が必要だったり、更新系の処理に紐づいたステートがある場合には、`useActionState`を使うと良いでしょう

### React18以前の実装方法
React18以前は、useStateとuseEffectを組み合わせて非同期処理の状態管理をしていました

### React18以前の実装例

```js
import { useState, useEffect } from 'react';

const [isPending, setIsPending] = useState(false);
const [error, setError] = useState(null);
const [name, setName] = useState('');

const handleSubmit = async (newName) => {
  setIsPending(true);
  setError(null);
  try {
    const result = await updateName(newName);

    if (result) {
      setError(result);
    } else {
      setName(newName);
    }

  } catch (e) {
    setError(e);
  } finally {
    setIsPending(false);
  }
};

useEffect(() => {
  // コンポーネントのマウント時または更新時の副作用
}, []);
```
（副作用とは、コンポーネントのレンダリングに直接関係しない操作のことを指すらしいです）

## `useActionState`の利点
- 状態管理の簡素化
    - `useActionState`は、非同期アクション中の状態管理を自動化し、コードを簡潔にします
- 進行中状態の明示化
    - 非同期処理中の進行状態を明示的に扱うことで、ユーザーに対して明確なフィードバックを提供します（処理実行中、処理完了など）

## まとめ
React19の`useActionState`は、非同期処理の状態管理を大幅に簡素化します
このフックを活用することで、効率的に可読性の高いコードを書くことができ、開発者の負担を軽減することができるでしょう

## 参考リンク

https://ja.react.dev/blog/2024/04/25/react-19

https://zenn.dev/uhyo/books/react-19-new/viewer/useactionstate
いいアイデアの出し方

## はじめに

こんにちは！ みなさんは、アイデアを出すのは得意ですか？

個人開発などでも、「何か面白いものを作りたいけど、アイデアが出てこない…」という経験、誰にでもあるのではないでしょうか？ 

私も、いいアイデアを出すのは苦手な方でした。しかし、試行錯誤を重ねるうちに、いいアイデアを出しやすくなったんです。

今回は、私がどのようにしてアイデアを出しやすくなったのか、そのプロセスをお伝えしたいと思います。

## アイデアは、すぐに出るのか？

結論から言うと、すぐにひらめくこともありますが、そうではないことの方が多いです。

トレーニングを積めば、よりスピーディーにアイデアを出すことも可能です。しかし、トレーニングをしていなくても、ふとした瞬間に素晴らしいアイデアが降ってくることがあります。

## アイデアをひらめいたときの感覚

アイデアをひらめいたとき、点と点が繋がって線になるような感覚がありますよね。

人それぞれ表現は違うと思いますが、私の場合は、数学の問題が解けたときのような、霧が晴れて視界が開けるような感覚です。

## 点と点が繋がるとは？

繋がる点は2つの場合もあれば、もっと多くの場合もあります。

重要なのは、どの点も自分の中に存在する知識や経験から来ているということ。頭の中にないものは、繋がるはずがありません。

## では、どうすればいいのか？

人間の脳は、寝ているときや他のことをしているときも、無意識のうちに情報整理をしてくれているそうです。

私はこの脳の働きを最大限に活用するために、 **常に様々な情報をインプットするようにしています**。

最新の技術情報だけでなく、ニュース、ビジネス本、雑誌、Xなど、様々なソースから情報を得て、自分の頭にストックしていくんです。

この時大切なのは、ただ漫然と情報に触れるのではなく、「いつか何かに活かせるかも」という意識で能動的にインプットすることです。

興味のある情報はブックマークしたり、メモやスクショに残すなど、後から見返しやすいように整理しておくと、さらに効果的です。

このひと手間を加えるだけで、情報が頭に残りやすくなるだけでなく、後から調べ直す手間も省くことができます。

## ひらめくタイミング

私の場合、 **全く別のことをしているタイミングでアイデアがひらめくことが多い** です。

散歩中や料理中、読書中など、リラックスしているときにふと思いつくことが多いように感じます。寝ている間にアイデアがひらめいて、飛び起きたことさえあります。

## 例えば

[Cryptokitties](https://www.cryptokitties.co/) というweb3ゲームをご存知ですか？ これも、誰かの「面白い！」というひらめきから生まれたものです。

- ブロックチェーン
- 猫
- カードゲーム
- 合成（繁殖）できる
- 売買できる

など、複数の要素が組み合わさって、唯一無二のゲームが誕生しました。そしてこれらの要素は、決して突拍子もないものではなく、既存の技術やアイデアを組み合わせたものですよね。

## 結局、どういうことか？

アイデアは、自分の中に蓄積された情報が組み合わさって生まれます。

より多くの、そして質の高いアイデアを生み出すためには、 **良質な情報を意識的に、そして継続的にインプットしていく** ことが重要です。

## まとめ

今回は、いいアイデアの出し方について、私の経験を交えながらお話しました。

もちろん、人によって合うやり方は様々だと思います。今回の記事が、少しでもみなさんのアイデア出しのヒントになれば幸いです。

私の会社のビジョンに「もっと、もっと面白い未来」という言葉があります。

面白い未来を創造するために、一緒に頑張っていきましょう！🙂
RSS Hackathon2024 Beyond に参加してきました！

初めてハッカソンに参加してきたので記事を書きます


今回はレイスシステムソリューションズ株式会社主催のRSS Hackathon2024 Beyond
https://race-ss.co.jp/hackathon

に参加しました！
![IMG_9429.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/b6e2eeee-bd9f-edf0-2c54-8b2fcbef88f6.jpeg)


# イベントの概要
今回は6/21から6/23まで
6/21はアイデアソン、6/22-23はハッカソンという内容でした。
ハッカソンのテーマとしては、
「"あたりまえ"の、その先へ」
というテーマでした。

チーム数は合計6チーム、初対面でランダムで組まれたチームもあれば、前からの友人たちと参加しているチームもありました。
今回は僕は初対面のチームで参加しました。
また、選考には書類選考がありました。一度何か自分で開発した経験がある方はぜひ来年度のRSSハッカソンで応募してみてほしいです！！
参加する際にチームアップを希望すれば、チームを組んでもらえるので一人でも安心です！

# アイデアソン
今回テーマは「"あたりまえ"の、その先へ」というテーマでしたが、このテーマが難しい！！！
なかなか最初はどのような当たり前を超えたものを作るか、ということを考えるのが難しかったです。
実際にアイデアソンでは、ブレインストーミングや意見交換をして作成するプロダクトを考えていきました。
![スクリーンショット 2024-06-21 15.55.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/5dfdc763-bda4-fd36-01e7-baa6f92cb659.png)



結果として、「適材適所は難しくて当たりまえ」、「悩みを解決するのは当たりまえ」という二つの当たりまえを解決するプロダクトを作成することにしました。

# 完成した作品
アイデアソンで決めた当たりまえを解決するための作品として、社内SNS「SeeReal.」という作品を開発しました！

![スクリーンショット 2024-06-24 16.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/a9100a6e-998b-68a9-4da4-44ffda81955c.png)

着想はBeReal.から得ており、なぜBeReal.から着想を得ているかというと、
社内SNSであるため社内の多くの人が使うようにしたい→
実際には投稿をたくさんする人と、全くしない人がいる→
投稿を見るためには、自分も投稿しないと見られないように制限する→
たくさんの人が投稿してくれる！！！

という考えのもと、BeReal.から着想を得て開発しました。
## 機能
- 投稿をしないと他の投稿が見られない、翌日にはその投稿は見られなくなる
BeReal.のように不定期で通知が送られ、通知が来ると投稿できるようになります。

    また、他の人の投稿を見るためには、自分自身も投稿しないと見ることができないため、投稿をするきっかけも作っています
    
- 投稿によってその人のスキルシートが更新される
その人が投稿すると、その投稿内容から、その人自身のスキルとして保存されていきます。

    運用する場合、社内のSNSとしての運用を想定しているため、不定期で通知が来た際に取り組んでいる仕事内容などを投稿することにより、その人のスキルとして更新されていくことを想定しています。



- 投稿によって、悩みがある場合、その悩みに適した人へのメンション、解決
    もし投稿が悩んでいるような内容の投稿だった場合、その投稿は悩みとして処理され、悩んでいる内容がスキルとして登録されている人に対してメンションされるようになっています。
    メンションされることによって、悩みを解決できるようになることを想定しています。

実際の例としてのシステム構成は以下です。![スクリーンショット 2024-06-24 17.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/f717eece-8759-ae38-bc76-90153e6e7998.png)


このような流れで悩みを解決できるようなSNSを開発しました。

## 使用技術
![スクリーンショット 2024-06-24 17.19.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/0c80eadd-38b0-80c5-f4a2-bc1623d671b1.png)


使用技術としては、かなりモダンな構成で開発しました。
期間がかなり短かったのでフロントとバックエンド両方を一気にできるNEXT.jsを採用しました。
また、mongoDBを採用した理由としては不定形のデータを使用するので、RDBではないデータベースを選択しました。

# 感想
初チーム開発でのハッカソンでしたが、最高でした！！！

チームアップされた初対面チームでしたが本当に最高のチームでした
それぞれの強みを生かして開発、発表することができたと思います
実際、db周りや、openaiを使ったメンション、ユーザー識別などはかなり任せて開発してもらいました😥
僕は、主にfirebaseを用いたプッシュ通知機能の実装をしていきましたが、これがムズカシイ！！！！
環境を作るだけで一日中の多くの時間を使ってしまいました、、、
また、NEXT.jsを使ったことがなかったのでかなり調べたり、聞いたりしながら開発しました。初めてNEXT.jsを触る機会になって本当によかったです。
結果としては、優秀賞をいただきました！！！！
![IMG_9438.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/593f2869-158d-8c4b-5b95-2b2d42d22ece.jpeg)

初めてのチームハッカソンで、このような結果を頂けてとても嬉しいです！！！
また、僕は情報学部ではなかったので、実際にエンジニアを目指している方々と交流する機会を頂けて、参加して本当によかったです！！！
また、賞金として20万円をいただきました！
これはチームで山分けしたのでなかなか嬉しいポケットマネーになりました笑
ちなみに最優秀賞は50万円だったそうです、うらやましい〜

# 最後に
初めてのチームハッカソンでしたがとても楽しい三日間でした。
ぜひ来年開催されるであろうRSS Hackathon2025にも参加したいと思っています。
また、これからチームや周りのレベル感の高さからとても刺激を受けたのでこれからも頑張っていきたいと思います！！
チームになった皆さんや、運営に携わっていただいたRSSの社員の皆様、本当にありがとうございました！！！
Yolov9をトレーニングする

# 2024年最先端モデル

ということで、アヒルのおもちゃを検出してみましょう⤴︎

![pexels-neosiam-590750.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/c9349b72-082f-659e-dbdd-b4c3a5199e38.jpeg)

### Install

```bash
git clone https://github.com/WongKinYiu/yolov9.git
cd yolov9
pip install -r requirements.txt
wget https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-s.pt
```

### データの準備

アノテーションする。今回はRoboflowを使いました。

![スクリーンショット 2024-06-25 8.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/c6b2274c-575c-05ac-dc16-60a92bb0033c.png)

以下の形式で用意。trainとvalの割合は9:1か8:2推奨。

```
my_dataset
  |
  |__images
  |    |__train
  |    |    |__image1.jpg
  |    |    |__image2.jpg
  |    |    |__...
  |    |
  |    |_val
  |         |__val_image1.jpg
  |         |__val_image2.jpg
  |         |__...
  |
  |    
  |__labels
       |
       |__train
       |    |__image1.txt
       |    |__image2.txt
       |    |__...      
       |
       |__val
            |__val_image1.txt
            |__val_image2.txt
            |__...
```

data/coco.yamlファイルを以下の形式に書き換える。

```yaml
path: my_dataset  # dataset root dir
train: images/train  # train images directory
val: images/val  # val images directory

# Classes
names:
  0: duck
```

### Training

```shell
python train_dual.py --workers 8 --device 0 --batch 16 --data data/coco.yaml --img 640 --cfg models/detect/yolov9-s.yaml --weights 'yolov9-s.pt' --name my_dataset --hyp hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15
```

runs/train/my_dataset/weights/best.pt　に重みが保存される。

### トレーニングしたweightsで推論

保存したweightsを指定して実行

```shell
python detect.py --source 'test_images' --img 640 --device 0 --weights 'runs/train/my_dataset/weights/best.pt' --name yolov9_c_c_640_detect
```

![a7dd8cf4-4c20-4a2f-ae3a-4183f39d52f7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/ee3110ae-c8d4-92c3-7763-646d95e5ec9a.jpeg)

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)