OmniAICreator/Qiita-1.07M huggingface dataset:
i18nによる日本語化対応【Rails】

docker環境で開発をしています。
Railsでデフォルトのロケール（言語）を設定するには、

## 1. config/application.rb ファイル内で config.i18n.default_locale を設定
```
config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
```

## 2. Gemfileにi18nを記載→インストールする
```
gem 'rails-i18n', '~> 7.0.0'
```
```
bundle install
```

## 3. サーバーを再起動
```
docker compose restart
```

## 4. rails consoleで「I18n.t('date.abbr_day_names')」と打ち、下記のように帰ってきたら設定完了。
```
irb(main):001:0> I18n.t('date.abbr_day_names')
=> ["日", "月", "火", "水", "木", "金", "土"]
irb(main):002:0> 
```
viewファイルに記載の仕方は下記参照

https://zenn.dev/redheadchloe/articles/ef6cfd9c129893

```
<%= link_to t('users.new.to_login_page'), login_path %>
```

※form_withの場合
form_withは優秀なのでmodel: @userという記述から「これはユーザーに関するフォームである」と認識してくれる。
なのでこんな風に書くこともできる。
↓
これを
```
<%= form_with model: @user, local: true do |f| %>
  <%= f.label :email, t('activerecord.attributes.user.email') %>
  <%= f.email_field :email %>
  ```

こう。
  ```
  <%= form_with model: @user, local: true do |f| %>
  <%= f.label :email %>
  <%= f.email_field :email %>
  ```

  ※lazy look up
  これを
  ```
  <h1><%= t('users.new.title') %></h1>
  ```
  こうすることもできる。
  ```
  <h1><%= t('.title') %></h1>
  ```
pygame テンプレート

pygameのテンプレート

import pygame

``` python
pygame.init()
BG = (50,50,50)
SCREEN_WIDTH = 1200
SCREEN_HEIGHT = 678
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

# clock
clock = pygame.time.Clock()
FPS = 120

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        # handle_event
    # update
    screen.fill(skyblue_color)
    # draw
    pygame.display.flip()
    clock.tick(FPS)
pygame.quit()
```
ViewModelに依存しているComposableをPreviewできるようにする。

ViewModel をコンストラクタ引数に取る Composable で Preview が使用できなくて困った（そして意外と情報が見つからなかった）ので、覚書きの意味も込めて書いておこうと思います。

### ViewModelをコンストラクタで受け取っているComposableはそのままではPreviewできない。

ViewModelをコンストラクタで受け取っているComposable メソッドを直接 @Preview アノテーション付きのメソッドの中で呼ぶと、
```
Failed to instantiate a ViewModel
This preview uses a ViewModel. ViewModels often trigger operations not supported by Compose Preview, such as database access, I/O operations, or network requests. You can read more about preview limitations in our external documentation.
```
という感じのエラーが出てプレビューが表示されません。
「ViewModelはしばしばコンポーズプレビューでサポートされていない処理を行うのでプレビューは利用できませんよ」って感じでしょうか。

### 解決方法

まあ要するに、ViewModelが担っている値の提供や処理を一つ一つ個別に受け取るようにしておいてそのコンポーザブルを、ViewModelを持っているコンポーザブルから呼んであげるようにする、という感じです。
使用する値や処理が多くなるとちょっと面倒ですが、最初にこうゆう風にしておけば、値や処理が増えた時にそれの要素だけ追加していけば良いので。

```TestFragmentComoose.kt

// こちらがフラグメントなどから呼ぶ方のコンポーザブル
@Composable
fun TestFragmentComoose(
    viewModel: TestViewModel = viewModel()
) {
    TestFragmentContent(
        comment = viewModel.comment.value,
        onChange = viewModel.onCommentChange()
    )
}

// 実際の表示内容のコンポーザブル
@Composable
fun TestFragmentContent(
    comment: String = "",
    onChange: (String) -> Unit = {}
) {
    TextField(value = comment, onValueChange = onChange)
}

@Preview()
@Composable
fun Preview() {
    // ViewModelを必要としない方をPreviewする
    TestFragmentContent(comment = "コメント")
}

```
一時的にしか使われないコードに有効期限を設定し、GithubActionsでチェック・通知する

本日 [レガシーソフトウェア改善ガイド](https://www.amazon.co.jp/dp/B01MSLAFPT/) の第4章で紹介されていた「期限切れのコード」を読み、心当たりしかなかったので早速実践として動くコードを書いてみる

# 期限切れのコードとは

広告キャンペーンで決まった期間だけバナーを表示するとか、A/Bテストを実施してみるとか。

そういう、役目が終わりもう使われないコードがリポジトリ内に残ったままだとコードリーディング時の認知負荷を上げてしまうため、使い終わったら即削除すべき。

なのですが**弊社は削除のためのタスクが発行されることもなくそのまま残してしまう傾向しかない**ため、消し忘れている場合はビルドが失敗するようにして、削除を促すようにする。

# やり方とサンプルコード

一時的にしか使われないコードには、決まったテンプレートを使って有効期限を付与する。サンプルコードでは [Expire] YYYY-mm-dd をテンプレートとする。

## PHP

2024年01月22日以降は使わないコード

```php
// [Expire] 2024-01-21
// バナー表示有効期限内であればバナー表示
if (CarbonImmutable::now()->lte(new CarbonImmutable('2024-01-21 23:59:59')) {
    // バナー表示
}
```



## Github Actions

### .github/workflows/main.yml

```yml
name: PR Workflow

on:
  pull_request:
    # プルリクオープン・プルリクリオープン・プルリク編集
    types: [opened, reopened, synchronize]

jobs:
  expire_comment:
    uses: ./.github/workflows/expire_comment.yml
```

### .github/workflows/expire_comment.yml

```yml
name: Check Expire Dates

on:
  workflow_call:

jobs:
  check-dates:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Check for expired date
      run: bash .github/scripts/check_expire_date.sh
```

## .gihub/scripts/check_expire_date.sh

```bash
#!/bin/bash

# 本日の日付を Y-m-d 形式で取得
current_date=$(date +%Y-%m-%d)

# pull request で新規追加・変更されたファイルのリスト
changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD)

for file in $changed_files; do
    # ファイルが削除による変更であればスキップ
    if [ ! -f "$file" ]; then
        continue
    fi

    # ファイル内の [Expire] タグを検索
    grep -Fn "[Expire]" "$file" | while read -r line ; do
        line_number=$(echo "$line" | cut -d: -f1)
        line_content=$(echo "$line" | cut -d: -f2-)

        # 日付を抽出（[Expire] Y-m-d の形式を想定）
        # \K はそこ以前の [Expire] を省略し、Y-m-d の部分のみを取得する
        expire_date=$(echo $line_content | grep -oP '\[Expire\] \K\d{4}-\d{2}-\d{2}')

        # 日付が抽出できなかった場合、または日付が過去の場合にエラー
        if [[ -z $expire_date ]] || [[ $expire_date < $current_date ]]; then
            # ファイル名と行番号を取得する
            echo "Invalid or expired date found: $expire_date in $file:$line_number"
            exit 1
        fi
    done
done

# 正常終了
exit 0
```

※リポジトリの全コードを参照する方が望ましいような気もしますが、大きなリポジトリだと参照に時間が掛かりビルド時間も伸びてコストも増えるため現状は新規追加・修正ファイルのみを対象としています。


# まとめ

問題なく有効期限の設定と有効期限切れ時にビルドで失敗できるようになりましたが、そもそも**みんなが有効期限があるコードに有効期限テンプレートを書いてくれるか**という大きな問題は残ったままですね…。
UnityでglTFを読み込む

https://docs.unity3d.com/Packages/com.unity.cloud.gltfast@6.0/manual/ImportRuntime.html

上記の記事のままなので特に書くこともないですが、触ってみた感想です。
また、すでに[パッケージをインポート](https://qiita.com/ELIXIR/items/b71ad622af492c0f42ad)していること前提です。

## 読み込むだけならノーコード

空のオブジェクトを作ったらGltfAssetをAddComponentして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/4f4c9710-9e73-9d23-58de-38be748f69b9.png)

[適当なglTF](https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF/Duck.gltf)をURLに入れて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/dff04662-df29-8c41-3df5-78c62b0726af.png)

実行すれば表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/7f37b79d-211e-5d95-fcbf-255ae0d06e46.png)

## プログラムからの読み込みも簡単
これだけです
```
using GLTFast;
using UnityEngine;

public class glTFLoader : MonoBehaviour
{
    [SerializeField] string url = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF/Duck.gltf";

    // Start is called before the first frame update
    async void Start()
    {
        var gltfImport = new GltfImport();
        await gltfImport.Load(url);
        var instantiator = new GameObjectInstantiator(gltfImport, transform);
        var success = await gltfImport.InstantiateMainSceneAsync(instantiator);
    }

    // Update is called once per frame
    void Update()
    {
    }
}
```

ヒエラルキーも保存されているので、（構造や名前がわかっていれば）読み込んだglb中にあるオブジェクト毎にさわることも簡単です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/4f4c2aba-3905-4a23-0830-a1811aa9bb8c.png)

UnrealEngoneでもこのくらい簡単に出来たらなあ、、
【JavaScript】しりとりコードでFizzBuzz


## ルール

* コード内のアルファベットの文字列同士がしりとりのように繋がっていること。
* コメントアウトの使用禁止（※）
* 文字列のみの使用禁止（※）
* 小文字大文字はしりとりのときに区別しない。

※ こういうことをされると一気に難度が下がるため

```js
ab = 0;
// bc
cd = 0;
"de";
ef = 0;
```

## コード

```js
el = "log";
gf = -1;
fb = "", bf = -1, fbr = 0, rf = "";
for (r = 1; r <= 100; r++) {
    r % 3 === 0 ? rf = "Fizz" : zr = -1; 
    r % 5 === 0 ? rf += fb + "Buzz" : zr = -1;
    rf === "" ? fr = rf = fbr + r : rc = -1;
    console[el](lr = rf);
    fr = -1;
    rf = "";
}
```

```text:しりとり
el → log → gf → fb → fbr → rf
→ for → r → r → r → r → rf → Fizz
→ zr → r → rf → fb → Buzz → zr
→ rf → fr → rf → fbr → r → rc
→ console → el → lr → rf → fr → rf
```

## 実装した感想

あまり面白くないコードだな。という感想。。。。
変数定義でどうにでもなるからね。
まあ、これが誰かのイノベーションに貢献する可能性があるのでよしとする。
GPTを作って公開するまで

## はじめに
　今回、収益化まで見据えてGPTを作るところから始めてみたのですが、GPTは現在収益化が始まってない状況でした。よって、今GPTを公開する意味はそこまで無いように思えます。しかし、収益化前に多くのユーザーに使ってもらって知名度を上げることで、収益化の準備になるでしょう。

## GPTを作ってみて得られた知見
### 今回作ってみたGPT
　まず、今回作ってみたGPTは以下です。
　　[関連IT用語紹介マン](https://chat.openai.com/g/g-YfdZooGVW-guan-lian-ityong-yu-shao-jie-man)
 <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/6cbc971c-a46c-70c6-bd2b-32d5431400d5.png">
 
使い方：まず知らない分野の単語を何かしら入力します。
 <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/ff84b3f3-8d3f-0454-4dd1-187b7a7627cd.png"><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/82bf7a7d-67f8-6733-2cf3-079a8c011756.png">
すると、その単語の意味とポイント３つをさらっと解説し（左図）、その後関連度の高い順に単語を提示してくれます（右図）。

次に、その中から興味のある単語を選んでコピペします（左図）。
 <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/5fbabdf0-c38f-90a2-a361-9144571cbbdd.png"><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/3a4bb18f-c7e9-261c-03f2-021209a5a634.png">
すると、また意味解説と関連用語を提示してくれます。
これを繰り返して、知らない分野のキーワードをざっくり理解するといったツールです。（まあ...大したものではないですが）

### 得られた知見
　今回のGPTを作る前までは、以下のサイト
 　　[GPTsで恋愛ゲーム作ってみたらすぐ作れた割に時間がトロトロに溶けました](https://note.com/hanagasa_manya/n/na3c75122463d?sub_rt=share_h)
からインスピレーションを受けて、RPGなどのエンタメ系のアイディアを色々と考えていました。

もちろんその方向性もありなのですが、
 　　[【未来予想図】GPTsの報酬形態を考えればどんなGPTsを開発すれば良いのかが分かる](https://note.com/ysk_prompt/n/n76fb37bd0bbb)
を読んで、「使われた回数によって報酬が決まると予想されるから、稼ぐことが目的なら仕事に使えるツールを作るのがベスト」と考えるようになりました。
　
 　先ほどの[関連IT用語紹介マン](https://chat.openai.com/g/g-YfdZooGVW-guan-lian-ityong-yu-shao-jie-man)はその点を考慮して、ユーザーが使いやすいものを作りました。
 　もっと改良するならば、例えば１つの単語をもっと深堀して理解したい場合に対応できるように、「その技術の有用性は？」のような疑問をリストで用意しておいて、ユーザーが疑問リストと入力するとそれを提示してくれて、その中から選んでコピペで疑問を入力するなどの方法が考えられます。
 　これは、「ユーザーが使いやすい」を通り越して、「ユーザーが全く工夫せずに使っても便利」を追求したものになります。そういう観点も必要になってくると学びました。

## 公開方法
### 全体公開
　まず問題として、普通に全体公開をしようとすると、本名が全世界に公開されてしまいます。が、その対応策は以下の記事で紹介されていました。
 　　[GPTs公開時に、本名が出てしまうのを変更する方法【作成者の名前を非公開にする】](https://prtn-life.com/blog/gpts-name#toc2)

　これを参考にして、作成者にドメイン名を設定する方法をやってみようと思ったのですが、どうやら独自ドメインを持っていないとできないらしく（私の調べた限りでは）、fc2の無料ホームページをちょっと公開したことがある程度の私には少しハードルが高めでした。
（ちなみに、独自ドメインの取得は年間1000円ちょっと払えばできるようです。私は面倒くさがり屋なので、この方法はまた今度にしたいと思います。）

### リンクを知ってる人にのみ限定公開
　おそらく、独自ドメインの方法は私以外にも少しハードルが高いと感じる方は多いと予想しています。そういう場合は、リンクを知ってる人にのみ限定公開する方法もありです。
 （下画像のようにBy community builderとなっていれば安心。Byの後に自分の名前が表示されてると危ない。）
 <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/6bb8a9ca-6012-647f-64f3-3c04c1a4c1c3.png">

　この方法は知り合いにしか共有できないなと考えていたのですが、よく考えてみればtwitterにこのリンクを貼る方法や、私のようにQiitaなどに貼る方法によって疑似的に全世界へ公開できます。
 
 　欠点としては、検索しても公開してないので出てこないことと、トレンドにも載らないだろうということです。限定公開の状態で収益化できるのかはまだ不明ですが、いずれ収益化を目指しているのならば最終的には全体公開が必要になってきそうですね。
   <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/865940c8-c9ee-c714-2620-f08c980d1276.png">


以上です。どなたかの参考になれば幸いです。
AWS LambdaでECRのコンテナイメージを指定したら、エラーが出た。

こんにちは、ユーゴです。今回は、私がコンテナイメージからLambdaを作ろうとした時に遭遇したエラーと解決策を紹介します。
難易度は、初歩レベルです。

# 問題
以下のようなエラーが出る
![スクリーンショット 2024-01-21 15.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/9f3108ea-4f10-fccc-bd2c-22b0f44d2666.png)

> Source image xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxxxxx is not valid. Provide a valid source image.

# 原因
リポジトリ自体のURIを指定してた
![スクリーンショット 2024-01-21 15.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/8349e5bc-ad40-7d26-b794-ad91ed21ac57.png)

# 解決
コンテナイメージのURIを指定する
![スクリーンショット 2024-01-21 15.47.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/f31ee5a5-abee-2360-ea93-485534825137.png)

# まとめ
いかがでしたでしょうか。今回は、ケアレスミス的な内容でした。
このように、初歩的な内容から、上級的な内容まで幅広く扱っていく予定です。また、UnityやGASなどについても取り扱っております。
お役に立てましたら、いいね, LGTM, フォローなどよろしくお願いします！！
「現代数理統計学の基礎」演習問題解法メモ　第4章問13～18

問17(3)は計算が大変です。
![第4章問13　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/edb5db5d-5073-a989-e847-a2720abdc5b6.jpeg)
![第4章問13　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/43f8f756-6045-b354-5a9d-5bf409dc4b0e.jpeg)
![第4章問14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/7deb7560-a5c5-199f-8048-b7956a01d81d.jpeg)
![第4章問15(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/65a5d36f-63ea-61bd-ad3c-89d1e65812f3.jpeg)
![第4章問15(2)(3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/66e93e73-ab03-b411-acbc-ed813f397166.jpeg)
![第4章問16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/54400df1-03dd-a754-72c8-feea5ae06a59.jpeg)
![第4章問17　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/6874b7b3-527b-7106-71dd-06a84a1d3d80.jpeg)
![第4章問17　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/b8347d5b-38b6-54cd-0015-8625bdde8aca.jpeg)
![第4章問17　P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/9ffc8a60-eebd-e0c2-3e08-c9ed107a1c29.jpeg)
![第4章問18 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/a680db65-a398-39df-c416-839295dbf61d.jpeg)
![第4章問18 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/b4e3d30b-2721-dbea-108c-f8c52d43412d.jpeg)
vue3 dayjs numberFormat

本番環境でbuildしたとき、

```
TypeError: Cannot read properties of undefined (reading '$dayjs')
```

のようなエラーが出る
(npm run dev)

globalPropertiesを使うとバグるので絶対に使わない。

以下のように `provide` , `inject` を利用して使うと問題解決

```app.js
import {createApp, reactive, ref,watchEffect} from 'vue'
import dayjs from "dayjs"

const app = createApp(App)
app.provide('dayjs', dayjs)
app.mount("#app")
```



```hoge.vue
<template>
{{dayjs('2023-12-24').format('YYYY年MM月DD日')}}
</template>

<script lang="ts" setup>
import { inject , ref , onMounted } from 'vue';
const dayjs = inject('dayjs')
</script>
```

また`numberFormat`については

```app.js
import {createApp, reactive, ref,watchEffect} from 'vue'

const numberFormat = (value) => {
    return new Intl.NumberFormat().format(value);
};

app.provide('numberFormat', numberFormat);
const app = createApp(App)
app.mount("#app")
```

```hoge.vue
<template>
{{numberFormat(10000)}} 円
</template>

<script lang="ts" setup>
import { inject , ref , onMounted } from 'vue';
const numberFormat = inject('numberFormat')
</script>
```

こんな感じで使える。


参考
https://programmer-note.hatenablog.com/entry/2021/09/29/182707
Raectでsrc以下のsvgをインポートした時に、cssで色を変える方法

# はじめに
Reactで、`src/assets`以下のSVGをimportして使用した時、うまいこと色が変えられなかったので調べてみました。

# 問題
いつも通りcssで`color: red;`のような形でSVGに色をつけようとしましたがうまくいきませんでした。
fillやstrokeも効果がなく、仕方ないのでググってて解決に至りました。

# 解決方法
主に二つの方法でうまくいったので、必要に応じて以下の二つを使い分けるといいと思います。

## 1 そのアイコンに設定したい色がプロジェクト全体で一色だけの時 -> SVGファイル自体を書き換えて色をつける
```xml:.svg
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.52859 ~~省略~~" fill="#000"/>
```
例えばこの時、色は`fill`プロパティに設定された`"#000"`、つまり黒となります。
ここを設定したい色に書き換えてあげればだけです。

## 2 場所によってそのSVGに設定したい色が違う -> cssのfilterを用いて色を変える
今回はこちらの方法を使って解決しました。
こちらの方法だと、cssでその都度色を変えられるので便利です。

```css:.css
.hoge {
    filter: brightness(0) saturate(100%) 
            invert(16%) sepia(96%)saturate(7359%) 
            hue-rotate(360deg) brightness(100%) contrast(112%);
}
```

要素に対してfilterを与えると、svgの色が変更できます。ちなみにこれは`#ff0000`、赤色になります。
みてわかるように人が書くのは無理なので、便利なサイトを使ってgenerateします。

https://angel-rs.github.io/css-color-filter-generator/

こちらのサイトで、HEX値またはRGB値を渡すと対応したfilterを生成することができます。
あとはコピペして貼り付けるだけです。


# おわりに
最後までお読みいただきありがとうございました。
GitHub PagesでReactアプリを公開する

# はじめに
React アプリを GitHub Pages で公開しようとしたときに躓いたので、備忘録としてここに残しておきます。
実際に公開したリポジトリは[こちら](https://github.com/tora-83863/population-trend)、React アプリの概要については[こちら](https://qiita.com/toraaa/items/744cc1c9faa504fb61fb)でまとめております。
# 環境
* Windows 11 Home(23H2)
* VSCode 1.85.2
* react 18.2.0
* npm 9.8.0
* gh-pages 6.1.1

# 全体の流れ
1. gh-pages をインストールする
2. package.json を修正する
3. リポジトリを作成する
4. デプロイを実行する
5. GitHub Pages の設定を変更する

## gh-pages をインストールする
[gh-pages](https://www.npmjs.com/package/gh-pages)とは、 Github Pages へのデプロイを自動化するライブラリです。
```powershell
npm install gh-pages --save-dev
```

## package.json を修正する
`homepage`, `predeploy`, `deploy` を追記します。

```json-doc:package.json
{
  "name": "population-trend",
  ...
  "homepage": "https://{GitHubのアカウント名}.github.io/{リポジトリ名}",
  ...
  "scripts": {
    "predeploy": "npm run build",
    "deploy": "gh-pages -d build",
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  ...
}

```

## リポジトリを作成する
ここでは VSCode での方法をご紹介します。

①左側のメニューから `ソース管理` を選択し、 `GitHub に公開` を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532684/84b70c3c-1587-1031-a920-4a532a17fff4.png)

②リポジトリ名を入力し、 `Publish to GitHub public repository` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532684/8a7a8f29-39ba-6eff-4c68-a4abd2020b83.png)

③GitHub を開き、リポジトリが作成されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532684/a9ab4e87-0bc2-9d25-f0d8-2cb8f2c9f630.png)

## デプロイを実行する
```powershell
npm run deploy
```
上記を実行することでビルドが走り、プロジェクトルート配下に `build` フォルダが作成されます。
さらに `build` フォルダの中身が格納された `gh-pages` ブランチが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532684/1b144dbe-a203-6cf7-264a-2714b8068f50.png)

## GitHub Pages の設定を変更する
上部メニューの `Settings` →左側メニューの `Pages` と移動し、
`Build and deployment` の `Branch` にて `gh-pages` `/(root)` を選択して `Save` を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532684/2713cbfa-ff68-b0c4-4379-fafcdda557cb.png)

上記実行後にビルドとデプロイが走ります。
上部メニューの `Actions` からビルド状況を確認し、 `deploy` に記載のURLに遷移してサイトが表示されていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532684/9dcf7bd8-21c5-a309-4a9f-fbab4016edfd.png)
メモ：フロッピー ディスク

当時使用していた

| 形式 | 機種 |
|:--|:--|
| 2D | PC-8801, X1 |
| 2DD/2HD | PC-9801 |

に関する覚え書き。

うろ覚えなので間違っている可能性あり。

# FDC

| 機種 | チップ |
|:--|:--|
| X1 | MB8876A |
| PC-88/98 | μPD765A , μPD7265 |

# フォーマット

**１セクタ分の情報**

| 内容 |
|:-:|
| ヘッダ部<br>セクタ番号など |
| (ギャップ) |
| データ部<br>データは 128,256,512,1024 バイト |

**１シリンダ分の情報**

| 内容 |
|:-:|
| (ギャップ) |
| セクタA |
| (ギャップ) |
| セクタB |
| (ギャップ) |
| ... |

セクタあたりのバイト数が増えると、シリンダあたりのセクタ数が減る。

**製品開発時の形式**

セクタあたりのバイト数は 1024 を使用していた。

|メディア | 2D | 2DD | 2HD | 2HD |
|:--|:--|:--|:--|:--|
| 回転速度(RPM) | 300 | 300 | 360 | 360 |
| シリンダ数 | 40 | 80 | 77 | 80 |
| セクタ数 | 5 | 5 | 8 | 8 |
| 容量 | 400KiB | 800KiB | 1232KiB | 1280KiB |

※ 2DD/2HD 両用ドライブは 77 を超えてヘッドが移動する

# 時々起きたトラブル

2DD ドライブでの 2D 読み出しは問題ないが書き込みは注意が必要だった。

例
- X1 でフォーマットして読み書き
- PC-98 で上書き
- X1 でエラー発生

2D ドライブの「物理的な書き込み幅」に対して、2DD ドライブは半分なので完全な上書きにならない。
Python 辞書

pythonでは、辞書が使用できる。
使用するためには要素のキー・値のバリューがセットになっている。
```Python
dict_sample = {
        '1': 'tanaka',
        '2': 'sato',
        '3': 'takahasi'
}

print(dict_sample['1'])
```
辞書での値の取得方法はキーを使用して値の取得を行なうことができる

```Python
dict1 = {'1':'japan', '2':'koria', '3':'china'}
dict2 = {'1':'japan', '3':'china', '2':'koria'}

print(dict1 == dict2)
```
二つの辞書を比較した場合は、
キーとバリューのペアが同じであれば順番が異なっていても同じとみなされる
上記の場合は、True


一方、リストはインデックス番号での値の取得を行う

```Python
list_sample = [
        'tanaka',
        'sato',
        'takahasi'
]

print(list_sample[0])
```

二つのリストを比較した場合は、
値が同じでも順番が異なれば同じとみなされない

```Python
list1 = ['japan', 'korea', 'china']
list2 = ['japan', 'china', 'china']

print(list1 == list2)
```

上記の場合は、False


```Python
list1 = ['japan', 'korea', 'china']
list2 = ['japan', 'korea', 'china']

print(list1 == list2)
```
こちらは、True
【AWS EC2】Amazon Linux2 にMySQLをインストールしようとしてGPGでつまづいた話

※この記事では、MySQLのインストール手順の詳細は割愛しています。
Amazon Linux2 にMySQLをインストールしようとした際、下記のエラーが出てつまづいた。

# 【起きた事象】
##### 実行コマンド
```
sudo yum install -y mysql-community-server
```

#### 実行結果
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663768/87f8a50f-50cc-409e-7dd4-04c682be8b9e.png)

#### エラーメッセージ
```
The GPG keys listed for the "MySQL 8.0 Community Server" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.

 Failing package is: mysql-community-client-8.0.36-1.el7.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
 ```
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663768/751ff4a7-e170-eaf2-3c10-6820c089d29f.png)


# 【試したこと】
調べたところ、下記コマンドで解消したとの記載を複数見つけたため実行。
```
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
```

上記実行後、MySQLのインストールを実行。
```
sudo yum install -y mysql-community-server
```

##### 実行結果
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663768/67abef07-5d0e-6c25-f127-1d51f58cc77d.png)
～～～途中省略～～～
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663768/206d4993-4361-95a5-75a8-b8c374f9c7f1.png)

最初のエラーメッセージが変わらず表示される。。。

コマンドが間違っているのか、MariaDBと競合しているのか、キャッシュが残っているのかなどを推測し
コマンド再実行やMriaDBの削除、キャッシュのクリア、サーバ再起動、GPGキーのURLを見に行くなどしたが、状況変わらず。

# 【解決策】
結果として、下記を実行したら上手くいった。
```
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
```

上記実行後、MySQLのインストールを実行。
```
sudo yum install -y mysql-community-server
```
##### 実行結果
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663768/3be3e901-9ec4-1bf1-43b7-43afc8198b09.png)
～～～途中省略～～～
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663768/fdd531d0-6044-1c27-dca3-4317d0194902.png)
～～～途中省略～～～
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663768/40846d46-bc3e-85b4-5a40-76c2fb816d2b.png)

2024/1/21 現在、2022年のGPGキーだけではなく、2023年のGPGキーのインポートも必要らしい。


# 【事象補足】
本記事では詳細を割愛したが、当初は2022年のGPGキーが必要なこともエラーメッセージに書かれていたため
下記コマンドを実行したが、それでも本記事冒頭の状況だった。
```
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
```

当初のエラーメッセージ（画像を撮り忘れたため、結果を直接記載）
```
The GPG keys listed for the "MySQL 8.0 Community Server" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.

Failing package is: mysql-community-client-8.0.36-1.el7.x86_64
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022, file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
```


ちなみに、年を指定しない場合のGPGキーも必要かと思い、下記コマンドも実行したが、状況は変わらなかった。
```
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql
```

# 【振り返り】
・GPGについての理解が浅い。対処法だけではなく、仕組みの理解が必要。
・上記につながるが、GPGキーの有効期限がいつなのかなど詳細を調べる方法が見つからなかった。
　（そもそも、そういうことは一利用者からはできないかもしれないが・・・。）
 ・Qiitaへの投稿は初めてだったが、記事を書ききるのに２時間程度かかった。より効率的に投稿できるように、まずは慣れていきたい。
GoでReactをSSRする

## 概要

GoでReactをSSRできそうだったので試してみました。
下記が動作の様子と実施のコードです。

![](https://storage.googleapis.com/zenn-user-upload/4f86b0635c6b-20240121.gif)

https://github.com/K-Sato1995/go-ssr-poc

やっている間に良い感じに実現されている下記のプロジェクトも見つけました。
私の現状のPOCだと実現できないことが色々実現されててすごいなと思いました。

https://github.com/natewong1313/go-react-ssr

## やりたい事

- Go環境でReactの[renderToString](https://react.dev/reference/react-dom/server/renderToString)でSSRを行う
- 実行結果をブラウザに渡す
- ブラウザでReactの[hydrateRoot](https://react.dev/reference/react-dom/client/hydrateRoot)でHydrationを行う

## 使用したもの

まず、Go環境でJSを実行するために[rogchap/v8go](https://github.com/rogchap/v8go)を使っています。他にも色々ありましたが、ES6が完全にサポートされていなかったりそれぞれ制約はありそうでした。
また、Reactの方で使われていた[Web APIs](https://developer.mozilla.org/en-US/docs/Web/API)はこちらのコード内で適宜置き換えています。

  - [dop251/goja](https://github.com/dop251/goja)
  - [robertkrimen/otto](https://github.com/robertkrimen/otto)
  - [rogchap/v8go](https://github.com/rogchap/v8go)
  - [quickjs-go/quickjs-go](https://github.com/quickjs-go/quickjs-go)
  - [elsaland/quickjs](https://github.com/elsaland/quickjs)

そして、React側コードのtranspile/bundleを行うために[esbuild](https://github.com/evanw/esbuild)(esbuild自体がGo製なので普通にGo環境で動きます)を使用しています。


## 流れ

あくまでも私が実行した流れです。

1. [esbuild](https://github.com/evanw/esbuild)でReact側のコードを実行可能な形にbuildする(Sever/Client側両方)
2. [rogchap/v8go](https://github.com/rogchap/v8go)でServer側のコードをSSR(`renderToString`)する
3. Goの標準ライブラリである[html/template](https://pkg.go.dev/html/template)で定義しておいたtemplateの中にSSRで生成されたもの＋Hydrationを行うClientコードを突っ込む
4. Goの標準ライブラリである[net/http](https://pkg.go.dev/net/http)で上記のHTMLをアクセス可能にする
Swiftでの初期化エラーの解決法：「Extra argument in call」

#### はじめに
Swiftでクラスや構造体のインスタンスを作成する際、しばしば遭遇する「Extra argument in call」というコンパイルエラーについて、その原因と解決法をわかりやすく解説します。

---

#### エラーの原因：悪い例の提示

**状況**:
SwiftUIでのアプリ開発中、`Match`という構造体のインスタンスを作成しようとしたところ、「Extra argument 'matchDate' in call」というエラーが発生。

**コード例**:
```swift
struct Match: Identifiable, Codable {
    var id = UUID().uuidString
    var matchDate: Date
    // 他のプロパティ
    init(date: Date, teamWhite: String, teamBlack: String) {
        self.matchDate = date
        // 初期化の実装
    }
}

class MatchSetupViewModel: ObservableObject {
    func saveMatchDetails() {
        let match = Match(matchDate: Date(), teamWhite: "White", teamBlack: "Black")
        // 保存ロジック
    }
}
```

**問題点**:
`Match`のイニシャライザは`date`という引数を期待しているが、`saveMatchDetails`メソッドでは`matchDate`という引数名を使用している。



---

#### 解決方法：良い例の提示

**修正後のコード**:
```swift
class MatchSetupViewModel: ObservableObject {
    func saveMatchDetails() {
        let match = Match(date: Date(), teamWhite: "White", teamBlack: "Black")
        // 保存ロジック
    }
}
```

**解説**:
`Match`のイニシャライザで要求されている引数名に合わせて、`MatchSetupViewModel`内の関数でインスタンスを作成する際の引数名を修正。

---

#### まとめ
型だけじゃなく変数名を合わせることが大事！
aibo（ERS-111）の復活チャレンジ #3

自分の記事をリンクいただいたのですが、いろいろすごくて、思い出したように、aiboに戻ります。

直接電源を繋ぐことは、目からウロコでした。

下記のまんまですが、自分もやってみました。ありがとうございます！
https://qiita.com/nakmura/items/12859bb67192f13170a0#_reference-792e52280b392279ad4e

# ACアダプタの準備
7.5V-3Aのアダプタを準備しました。
実際にはマルチ電圧のアダプタを7.5Vで使いました。
![IMG_9101.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/2608ec07-f3dc-0b64-57f7-98c76edafbd3.jpeg)

# バッテリーの殻割り
1つ目のバッテリーは前回の改造でぼろぼろ状態なので、もう1つ持ってたバッテリーの殻割りしました。
![IMG_9096.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/79ff670c-88e8-b85d-93a8-21a5567ca7ec.jpeg)

# ACアダプタのDCジャックの配線
プラグと同じサイズのジャックを半田付けしました。
今回は、5.5 X 2.1 でした。
![IMG_9098.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/30cc0933-4805-8b26-93ac-294467fa61c1.jpeg)

# 配線
バッテリーケースには隙間を開けて配線を通します。
![IMG_9099.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/f468eb83-8519-baf0-6876-c29a2f090be2.jpeg)

aiboのお尻も隙間を開けて配線します。
![IMG_9100.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/359daa47-5ed0-e662-06e0-553a5083439e.jpeg)

# 完成
動きました！！
しばらくしてたらスリープしましたが、大丈夫かな？
ちょっと放っておいてみます。
開発定例とは別でSRE定例を行うとヨカッタ話

# サマリ
## 状況
- 自社SaaSは新しくリリースされたばかり
- 新規機能追加に忙しい
- 専任のSREエンジニアがいない
- チーム全体の経験は受託開発が主

## 課題
- 監視・運用・保守の方法がわからない
- 新規機能開発に圧力を感じて保守開発がおろそかになっている

## 解決策
* チーム全員で通常の定例とは別でSRE定例を行うことにした

### アクション
- 週に1度のSRE定例を開催する
- サービスの品質、運用方法、手作業の改善について議論する
- 次回までに各自ができる小さなタスクを決めて実行する

## 結果
- 2ヶ月以上の取り組みで、不安が減り、後回しにされがちなことを進めることができた
    - メトリクスアラートの設定と改善
    - 監視シフトの決定
    - 運用ドキュメントの整備

## これから
* 継続して取り組み、後回しの部分を解消していきたい。例えば、ロガーの整備など。

# 雑記
## 背景
弊社は2023年10月に新しいバーティカルSaaSをリリースしました．3DCAD図面をアップロードすると図面解析を行い自動レビューしてくれる自動車関連メーカーや電機メーカー向けサービスです．

PdMが数年間かけて構想したサービスで，そのリリースはとてもめでたいことなのですが，一つ大きな課題があり，それが今回の記事のネタです．

サービスリリースしたばっかりということもあり，主体としている機能が市場に受ける，いわゆるPMF（ProductMarketFit)しているかわからない現在の状況は，市場探りと並行して第二第三新規機能を次々と開発するビジネス側の圧力として存在します．

ありがたいことに，そんな状況のなかで，お客様にサービスを契約していただき，利用数も伸びてきました．そうなると，ユーザーがいるということになり，ユーザーがいるということは，サービスの監視運用保守をしていかなければなりません．

しかし，我々の開発チームは，これまで受託開発でさらに保守経験も少ないというチームであり，SaaSをリリースしたものの，どのように監視運用保守をしていけば，イマイチわからないというのが今回の課題です．

## 対応
いまどき(?)の流行りとしては，例えば，SRE専任のエンジニアを採用してSREを行ってもらうというのがひとつあるかもしれません．

厳密にはSRE専任というのは存在しないという声もあるかもしれないし，スクラムだDevOpsだというのは，各々が自分の得意領域を活かしつつも全方位に対して新規開発から運用保守まで担えるようになるのが理想的です．

まぁそういう，あるべき論はどうだというのとは関係なしに，そもそもSREの経験値が少なくともチームとしては圧倒的に不足しているのが私たちのチームなので，全員野球でやるしかないのです．

そこで全員野球をするために考えたのが，今回のテーマである**SRE定例を行う**という解決策になります．

リリース前の開発時からデイリーミーティングを30分~60分ほど行っていました．デイリーとは別で，**SRE定例をウィークリーで30分行う**となかなか良かったというのが今回の話です．

具体的にその定例で何をやるかというと，**バグがある，ドキュメントが不足している，サーバーが時折止まっている，深夜対応は誰がするんだ**といった，できればワキに置いておきたいデイリーミーティングでは後回しにしがちだったものにフォーカスするミーティングにしました．

そして，哲学としては,**小さなことからコツコツと**で，**次の開催までつまり１週間でできることをTODOとして決めて，各自持ち帰って消化する**として，新規機能開発の合間に取り組めるような枠組みにしました．

大きな痛みを伴うハードルが大きな取り組みは，ガツンとやらないといけないので,おそらくそれは通常のデイリーのほうで計画しないといけないことで，そうではない，**小さくて面倒くさいけど必要な斧を研ぐこと**にフォーカスしたいというのが理由になるかと思います．


## 結果
取り組みを始めて２ヶ月がすぎたところですが，成果は表れています．

監視アラートはちゃんと設定されているし，それを誰が確認するかは決まっているし，どのような初動対応をすればよいのかもドキュメントが整っています．

こう文章に書くと，とても当たり前なことなんですけど，我々のような未熟で小さなチームでは，これはとても大きな成果で，このSRE定例の取り組みがないといつまでたってもできなかったことだと思います．

## 今後
書いた通り，まだ当たり前を整えるということに重きを置いた取り組みではありますし，それがとても大事なことではあるのですが，さらにもう一歩をこの取り組みの中で取り組めたらいいかもしれません．
まぁ，この取り組みが役目を終える可能性もありますけど．
Pythonだとクラス全体をスコープとする変数をメソッド内で定義できる？

[ゆるコンピュータ科学ラジオ](https://www.youtube.com/@yurucom)、というYoutubeのチャンネルがありまして。
その[「プログラミングの基礎を習得したので、相方botを制作してみる」](https://www.youtube.com/hashtag/108)という回に
関連した記事です。（以下、動画の視聴後にお読みいただければと思います）

で、そのコメント欄で、以下の指摘が挙がっていました。

:::note info
[24:48](https://www.youtube.com/watch?v=7HOuwBPuWJA&t=1488s)の「1回目なら○○、２回目以降なら××」という処理について、
パーソナリティは「できる」と言っているが、これは「できない」はず。
(環境変数に回数を保持する等の、現実的でない方法を想定しない限りは)
:::

私も、まあ、おおむねそうかな、とは思ったのですが、手元のPython環境で
以下を試したら「1回目の返事」「2回目以降の返事」と順に出力されまして。

```Test.py
class Test () :
    def 実行時プログラム(self):
        self.sendButtonWasCliecked = False

    def 送信時プログラム(self):
        if not self.sendButtonWasCliecked :
            print("1回目の返事")
            self.sendButtonWasCliecked  = True
        else:
            print("2回目以降の返事")

test = Test()
test.実行時プログラム()
test.送信時プログラム()
test.送信時プログラム()
```

ということは、「self.」(Java等のthisに近い？)の使用で目的の動作ができそうかな、と。
実行時プログラムと送信時プログラムは、同じクラスに属していそうなので。

まあ、この辺りは、まんま脆弱性になりそうなので、
環境側でサニタイズ(ブロック)されてる可能性も高いのですが。

にしても、プログラムは専門ではないのでよくわからないのですが
メソッドから~~クラス変数~~インスタンス変数を定義するこのやり方には、
強烈に違和感を覚えます。
自身のスコープを超えた変数を定義しているように見えるので。

これ、最近の言語では割と普通のことなのでしょうか…?
そんなこと、ないですよね…？

とりあえず、試してみてビックリだったので、メモをかねて記事にしてみました。

### 追記
コメント欄に識者の方からコメントをいただくことができました。
ざっくりとは以下になるかと思います。詳細はコメント欄をご確認ください。
 - メソッドからインスタンス変数を作成することは可能だし、普通に行う
 - 共通で使用する変数が冒頭で宣言されない点に違和感があるなら、コンストラクタで定義(+初期化)すればよい
exposed-0.46でdeprecatedのワーニングが出る

# exposed-0.46でdeperecatedのワーニングが出る
exposedの0.46が出ていたので0.44 ⇒ 0.46にバージョンアップしてみると、
```kotlin
implementation("org.jetbrains.exposed:exposed-spring-boot-starter:0.46.0")
```
DSLで何やら、deprecatedなワーニングが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/ab1019cb-cefb-8ef7-f79b-10f0d95b8e9d.png)
slice()とselect()のところで出ていますね。
```
'slice(Expression<*>, vararg Expression<*>): FieldSet' is deprecated. As part of SELECT DSL design changes, this will be removed in future releases.
'select(SqlExpressionBuilder.() -> Op<Boolean>): Query' is deprecated. As part of SELECT DSL design changes, this will be removed in future releases.
```
0.46.0でDSLの書き方が変わったようです。
exposd公式のドキュメントを見ても、何がどう変わったのか明確にはかかれていません。
[exposed DSL](https://github.com/JetBrains/Exposed/wiki/DSL)

[ChangeLog.md](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md)の0.46のところを見ると、
> Features:
feat: EXPOSED-65 Design query DSL consistent with SQL language by @bog-walk in #1916
More details in the Migration guide

どうやらこれのようです。[Migration guide](https://github.com/JetBrains/Exposed/blob/main/docs/MIGRATION_GUIDE.md#migrating-from-0450-to-0460)を見ると、
```kotlin
// Example 1
// before
TestTable
    .slice(TestTable.columnA)
    .select { TestTable.columnA eq 1 }

// after
TestTable
    .select(TestTable.columnA)
    .where { TestTable.columnA eq 1 }
```
slice ⇒ select
select ⇒ where
に変わっています。上記の[exposed DSL](https://github.com/JetBrains/Exposed/wiki/DSL)のドキュメントも、よく見ると
* [select](https://github.com/JetBrains/Exposed/wiki/DSL#read)
* [Where expression](https://github.com/JetBrains/Exposed/wiki/DSL#where-expression)

もこれに合わせた書き方に変わっています。
【Prisma】Supabaseの接続でSupavisor対応してみた。

## はじめに
Supabaseから何やらデータベース接続についてメールが来ていました。
とりあえず英語はあまり得意ではないので、chatGPTくんに翻訳してまうと、
どうやら、IPv4およびpgBouncerを介した直接のデータベースアクセスを廃止して、新しい接続方式になるらしい。
とにかくタイムリミットが2024年1月15日（26日まで伸びましたが）だったので、X(旧twtter)でタイラー(@dshukertjrjp)さんに質問しながら急いで対応した備忘録を残します。

:::note info
Supavisorの詳しい説明などは調べきれていないので、ここでは省きます。
:::

## この記事の対象
VercelでホスティングしているNext.jsからPrismaを使ってSupabaseに接続している方。

## 対応が必要な人
* PrismaなどのSupabaseのPostgresに直接繋いで使うサービスを使っている方。
* supabase-jsなどのクライアントライブラリーを使っている方は何もしなくて良いとのこと。

## 結局何をやればいいの？
「DATABASE_URL」を「Supabase」の「Database Settings」で二つ存在している「Connection String」で「~~Connection Pooling~~ Connect to your database via connection pooling」の枠内にある方を使えばいいらしい・・・が、
公式の[Prisma設定ドキュメント](https://supabase.com/partners/integrations/prisma)を見たら上記以外にもやることがありました。

### 書き換える箇所
* ローカル開発環境は「.env」、Vercelは「Project Settings」の「Environment Variables」
* schema.prismaファイル

まず、「DATABASE_URL」を、「Supabase」の「Database Settings」の「Connect to your database via connection pooling」の中にある「Connection String」に書き換えます。

:::note warn
末尾に「?pgbouncer=true&connection_limit=1」を付け加えるのを忘れないでください。
:::

次に、新たに「DIRECT_URL」を、先ほどの「Connection String」のポート番号を「6543」から「5432」に書き換えたもので追加してください。

:::note warn
こちらは末尾に「?pgbouncer=true&connection_limit=1」を付け加えないでください。
:::

![スクリーンショット 2024-01-21 13.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557007/0a130981-f9b6-cb36-f8b8-fe9919a394a4.png)


```.env
DATABASE_URL=postgres://[db-user].[project-ref]:[db-password]@aws-0-[aws-region].pooler.supabase.com:6543/[db-name]?pgbouncer=true&connection_limit=1
DIRECT_URL=postgres://[db-user].[project-ref]:[db-password]@aws-0-[aws-region].pooler.supabase.com:5432/[db-name]
```

最後に「schema.prisma」の「datasource db」の項目を以下のように書き換えます。
```shcema.prisma
datasource db {
  provider          = "postgresql"
  url               = env("DATABASE_URL")
  directUrl         = env("DIRECT_URL")
}
```

上記をデプロイすれば、これで対応は完了です。

## AWSのIPv4アドレス無料提供終了について
こちらもタイラーさんのツイートに質問させていただきました。
結論としては今回のSupavisorの対応を行なっておけば、VercelからIPv4にアクセスする場合でも1ヶ月あたり$4の支払いは発生しないとのことです。


## 最後に
メンションもついていない何をすればいいかわからないと言うツイートを拾っていただき、丁寧にやり取りをしていただいたタイラーさんありがとうございました。


## 参考
* https://supabase.com/partners/integrations/prisma
新職場に来て2週間経った。

# はじめに
1月より新しい職場に勤め始めた。
前職とは違い、メーカーではあるもののDXを専門的に進めることができる部署に所属することができた。
データサイエンスを基本的に学んできたが、メインの仕事は画像解析である。
画像解析の経験があまりないため、今後スキルを習得していくうえで有用な技術はどんどんまとめていこうと思う。
今回は、自分自身がどのように今後仕事を進めていくか簡単にまとめようと思う。

# 使用言語
まずは使用言語を紹介する。
部所員のスキルセットを聞いていても、基本的にPythonを使用している人が多い印象だが、中にはFortranやC++、TypeScriptを使用している人もいた。
自己紹介でJuliaを使用していることを話したところ何名からかは興味を持ってくれた。
Juliaを業務で使用してもいいのか相談したところ、問題なさそうだったので、PythonメインにJuliaのスキルを上げつつ、いずれJuliaも使用していけたらと思う。

# まとめ
こんな中身のない記事で申し訳ないが、新たなスタート地点に立ったことで自分自身のけじめとして書かせてもらった。
Python、Juliaのスキルを磨いていき、オリジナリティのある人材になれたらと思う。
また、有用な技術はどんどん紹介していこうと思う。
それでは！！！
『時系列分析と状態空間モデルの基礎』をPyStanで実装した（第6部4章のみ）

## やったこと
- 「時系列分析と状態空間モデルの基礎 RとStanで学ぶ理論と実装」の第6部4章をPyStanで実装した

## この記事の対象者
- 状態空間モデルをpythonで実装したいけど書き方が分からない！という人
- PyStanのバージョンを本記事執筆時点のもので動かしたい人

## はじめに
- 本記事は私が参考にさせて頂いた元記事に、以下の2点を追加しただけの記事になります。
    - 第6部4章に特化
    - 2024年1月時点（記事執筆時点）のPyStanのバージョンに対応
- 元記事様：https://qiita.com/takuto512/items/1c903564691e231e1b67
- 実際に動かそうとすると、第6部4章が無い（元記事は、第6部3章と5章はあるが4章が無い）、ライブラリのバージョンが古いという理由でハマったので、勝手ながら執筆させて頂きました。
- 実装はGoogle Colabを用いて行っています。
- コードはこちらから。
https://github.com/intrinsic-motivatio-n/hayabusa-bon

## 実装結果
コードはgithubをご参照ください。以下のような結果になります。


### 応用：複雑な観測方程式を持つモデル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667582/8b10ceaf-f267-da9c-0c48-fc2db230deac.png)
隼本と同様の結果となり、問題なく実装できていると思います。

### おまけ：実装時にハマったポイント
とにかくビルド周りでめちゃくちゃハマりました。
- ```import stan``` pystanではなく、stanに名前が変わっているので注意です
- ```import nest_asyncio``` これを入れないとstanのビルドでエラーが出ます
- ```array[n_sample] int catch_y;   // 捕獲数``` stanファイルの変数の指定方法（配列を扱う場合）が変わっています。array[XXX]+型+変数名が正しいようです。
- ```stm = stan.build(model, data=data_dict, random_seed=1)``` ビルド時にデータやseed値を指定するようです。詳細は公式ドキュメントをご確認ください。
    - https://pystan.readthedocs.io/en/latest/

## まとめ
- 隼本の第6部4章をpythonで実装した
    - 2024年1月時点のPyStanのバージョンに対応

## 参考サイト
- 隼本サポートページ:https://logics-of-blue.com/tsa-ssm-book-support/
- Rとstanのコードとデータ:https://github.com/logics-of-blue/book-tsa-ssm-foundation
- 「時系列分析と状態空間モデルの基礎」(隼本)をpystanで実装してみた
https://qiita.com/takuto512/items/1c903564691e231e1b67
- PyStan公式ドキュメント：https://pystan.readthedocs.io/en/latest/
LOOPだけで円周率を計算する

以下のアルゴリズムを参考にして、ループと四則演算だけで円周率を計算してみました


https://en.wikipedia.org/wiki/Midpoint_circle_algorithm#Jesko's_Method

```python
import time
import math

def calculate_pi(r):
	t, total = 0, 0
	y = r

	# 中心座標(0,0) 半径rの円を描く
	for x in range(r):
		t += x
		if t > y:
			t -= y
			y -= 1

		total += y

		# 45°まで
		if x >= y:
			return (total * 2 - x * y) * 4 / (r*r)


# 半径の値
radius_values = [1000, 10000, 100000, 1000000, 10000000, 100000000]

# 見出し
print("半径         タイム(秒)   π ")

# 結果を表形式で表示
for r in radius_values:
	start_time = time.time()
	pi = calculate_pi(r)
	end_time = time.time()
	print("%-12d %-12.4f" % (r, end_time - start_time), pi)

print("math.pi: %.16f" % (math.pi))
```

実行結果
```
半径         タイム(秒)   π 
1000         0.0000       3.15022
10000        0.0030       3.14246948
100000       0.0480       3.1416806076
1000000      0.3399       3.141601450108
10000000     1.8053       3.1415935333564
100000000    17.9820      3.1415927415701512
math.pi: 3.1415926535897931
```
コードの解説は、以下の記事を参照ください

https://qiita.com/takahasinaoki/items/78f1b5fbb6862fcfb8ac

<br>

2024.01.27 追記
同じ環境でjuliaでも試してみた

```julia
using Printf
function calculate_pi(r)
  t, total = 0, 0
  y = r

  for x in 0:r
    if t > y - x
      t -= y - x
      y -= 1
    else
      t += x
    end
    total += y

    if x >= y
      return (total * 2 - x^2) * 4 / r^2
    end
  end
end

# 半径の値
radius_values = [10000, 100000, 1000000, 10000000, 100000000, 1000000000]

# 見出し
println("半径         タイム(秒)    π ")
# 結果を表形式で表示
for r in radius_values
    start_time = time()
    pi = calculate_pi(r)
    end_time = time()

    @printf("%-12d %-12.4f ", r, end_time - start_time) 
    println(pi)
end

println("π: ", π*1.0)
```

```
半径         タイム(秒)    π 
10000        0.0240       3.14246948
100000       0.0000       3.1416806076
1000000      0.0020       3.141601450108
10000000     0.0210       3.1415935333564
100000000    0.2010       3.1415927415701512
1000000000   1.8970       3.141592665216587
π: 3.141592653589793
```
julia 速い
【個人開発】#1イラストレーター向け記事投稿サイトの開発記録【企画と要件定義と技術選定と】

# はじめに
初めまして、駆け出しエンジニアのただのんと申します。
触ったことがある技術はPythonのWebフレームワークのDjangoくらいで、
今回紹介する技術選定の技術は全て初心者です。

https://twitter.com/sumiresukinon

# 作ろうとしているもの
イラストレーター向けの記事投稿サイト

# なぜ作ろうと思ったか
1. 大勢いるイラスト初心者でもイラストに関する記事を気軽に投稿できるサイトがあったらいいなあ
2. 描いた絵をまとめてポートフォリオの代わりに使えたらいいなあ
3. いろんな人が書いた記事を見て暇を潰した～い(イラストスキルをアップした～い)
4. 自分のITスキル向上のため
5. ### ほぼ自分のために！！！



# 実装方法
開発する時間があまり確保できていない状況なので、まずは最低限の機能を作ってから、余裕があれば機能を後から追加で開発したいと考えています。
## 1. 要件定義

#### 最低限欲しい機能
+ ユーザー作成機能
+ Googleアカウントでのログイン・ログアウト機能
+ ユーザーページの表示
+ 記事の投稿、編集、削除機能
+ トレンドページの表示

#### できれば実装したい機能
+ SEOのためにSSRしたい
+ 検索機能
+ いいね機能、ブックマーク機能



## 2. 技術選定
記事やサイトを見ながら技術選定をしました。
開発中に変更になる可能性有。

<dl>
  <dt>言語</dt>
  <dd>TypeScript</dd>
  <dd>デファクトスタンダードであるTypeScriptの勉強したかったので</dd>
</dl>

<dl>
  <dt>フレームワーク</dt>
  <dd>Next.js</dd>
  <dd>あわよくばSSRをしたかったので調べた感じこれが良いっぽい</dd>
</dl>

<dl>
  <dt>認証機能</dt>
  <dd>NextAuth.js</dd>
  <dd>アカウントと認証機能のために</dd>
</dl>

<dl>
  <dt>デプロイ</dt>
  <dd>Vercel</dd>
  <dd>SSR</dd>
</dl>

<dl>
  <dt>ORM</dt>
  <dd>Prisma</dd>
  <dd>dbと繋げるために</dd>
</dl>

<dl>
  <dt>DB</dt>
  <dd>PlanetScale</dd>
  <dd>無料プラン！</dd>
</dl>



# おわりに
開発過程も記事にできればいいなと考えています。
開発過程などで至らない点やアドバイスなどがありましたら教えていただきたいです。
記事投稿は初めてで拙い文章ではありますがよろしくお願いいたします。

# 参考
参考にさせていただきました。ありがとうございます。

実装方法

https://qiita.com/mamimami0709/items/7ce5e26afea1fded0747

記事の書き方

https://qiita.com/Sicut_study/items/f31cdf9b19756238936b
AD CS 証明書失効の実施手順

# はじめに
AD CS を運用中に、証明書 を失効させたい場合の手順です。

なお、この手順は 以下の記事で 環境構築した場合を前提に記載していますが、単純に証明書を失効させたい場合の手順として見ていただいても問題ありません。

https://qiita.com/carol0226/items/149503bf49810942da5a

# 1. 証明書失効の手順
0. 「サーバーマネージャー」の「ツール」から、「証明機関」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/bddbdb8b-d7c0-11eb-e2bc-dfe9a2f965b0.png)
　<br>
0. 「発行した証明書」の中から、失効させたい証明書を探します。特に サブジェクト名やサブジェクトの代替名、拇印、発行日付 を確認して、誤って 違う証明書を失効させないように注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8ae6560e-7d6b-df15-f2da-c708f2620759.png)
　<br>
0. 失効させる証明書を右クリックして「すべてのタスク」－「証明書の失効」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/fec01207-f9ac-63f5-2a5b-197d6e81c1bd.png)
　<br>
0. 以下のウィンドウで、理由コードを選び 失効させる日付を指定してから「はい」を押します。
（理由コードの選択肢）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/0c4e2b18-354d-33ee-dad5-c2341e26b011.png)
（画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2723e409-bf8f-8171-1559-a02d9c44304b.png)
　<br>
0. 証明書の失効を実施すると「失効した証明書」欄に移動されますが、これだけでは 反映されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/21f0b65f-3944-d437-eccd-aba1764e54c3.png)
　<br>
0. 「失効した証明書」を右クリックし「すべてのタスク」から「公開」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ce9ce6a5-74aa-d254-a9d9-293b0bb55b52.png)
　<br>
0. 以下のウィンドウで、「新しい CRL」を選び「OK」を押すことで、失効リスト (CRL) へ結果が反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2e4c4eef-92f5-90b0-2a04-e84b91df6afe.png)

# 2. キャッシュのクリア
CRL が 変更されていても、証明書をチェックしたホストには CRL のキャッシュが残っています。
キャッシュが更新されるまでは、引き続き、失効が有効にはなりません。

すぐに、接続テスト を行いたい場合は、CRL のキャッシュクリアを実施します。
※サーバー証明書 の失効チェックは、クライアント PC 側で、そして、クライアント証明書 の失効チェックは、サーバー側 にて行われるため、そのホスト上のキャッシュをクリアします。

証明書をチェックするホスト上で、コマンドプロンプト（管理者）を開き、以下のコマンド ① と ② を続けて実行します。

（コマンド ①）
~~~
certutil -urlcache * delete
~~~
（実行結果 ①）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/58a0f93e-c9f1-8d68-2c67-9c9e4a00ee7d.png)

（コマンド ②）
~~~
certutil -setreg chain\ChainCacheResyncFiletime @now
~~~
（実行結果 ②）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e472e515-7063-76de-8e0d-b4a8837f21bc.png)

:::note info
「NPS + WiFi + 802.1x 認証 (EAP-TLS)」の環境でクライアント証明書の失効を実施した場合は、NPS サーバー上でキャッシュをクリアします。

その後、失効した証明書を持つ クライアントから WiFi 接続すると、以下の通り、失効エラーがでて 接続できなくなることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/435fba0a-998f-0b8a-1827-444c5ec90e12.png)
:::
Playwright と Magicpod 比較してみた(企業導入向け)

## はじめに
ウェブアプリケーションの開発において、品質保証は成功の鍵です。この分野では、PlaywrightとMagicpodが注目されています。Playwrightは、マルチブラウザのテスト自動化を実現するオープンソースツールです。一方、Magicpodは、AIを活用したクラウドベースのテスト自動化サービスを提供します。これらのツールはどのように異なり、どのような場面で最適なのでしょうか？

## Playwrightの概要
### 主要機能
**複数のブラウザサポート**: Playwrightは、Chrome、Firefox、Safariなど複数のブラウザでのテストをサポートします。
**ヘッドレスモード**: ブラウザをGUIなしで実行し、テストの速度を向上させます。
**クロスプラットフォーム**: Windows、Mac、Linuxで動作します。
### 利点
**高速なテスト**: ページのロードや操作が迅速に行えます。
**豊富なブラウザ対応**: 広範なブラウザ環境でテストが可能です。
**詳細なAPI**: 豊富なAPIにより、複雑なテストシナリオの作成が可能です。
### 制限と課題
**セットアップの複雑さ**: 初期設定にはある程度の技術的知識が必要です。
**視覚的テストに限界**: UIの視覚的な側面のテストは限定的です。
## Magicpodの概要
### 主要機能
**クラウドベース**: オンラインでテストを管理・実行します。
**AI画面認識**: 画面の変更に柔軟に対応できるAI機能を提供します。
**ノーコード/ローコード**: コーディング不要でテストケースを作成できます。
### 利点
**ユーザーフレンドリー**: 直感的な操作が可能なインターフェイスです。
**簡単なセットアップ**: クラウドサービスなので、設定が容易です。
**継続的インテグレーションとの統合**: CI/CDパイプラインとの簡単な連携が可能です。
**自動化の実装が圧倒的に速い**: UI上の操作のみで行えるためPlaywrightより早く実装を進められる
### 制限と課題
**カスタマイズの限界**: 特定のカスタムニーズには機能が提供されていないことがある
**高度なテストに制約**: 複雑なテストシナリオには向いていない
## どう使い分ければ良いの？
### 判断基準
- 自社にテスト用コードを運用できる人材が確保されているか
- E2Eテストで特殊な環境を再現する必要はあるか？
    - Googleログインや複数環境でのテストの実施
        - MagicpodはEdge・Chromeに対応
- 予想テストケース数
    - テストケースが100個以上必要になるとMagicpodはエンタープライズプランに変更する必要がある

## 用途別のおすすめ
### Playwrightがおすすめの場合
- さまざまな実行環境でテストを行いたい場合(Googleログイン等)
- 毎月の運用のための固定費を増やしたくない場合(無償で行いたい)

### Magicpodがおすすめの場合
- UI上のテストで完結する場合(クリック操作、入力操作等)
- 新機能をハイスピードで実装していきたい場合
- メンテナンスにかかる時間を減らしたい場合
- テスト担当者が非エンジニアの場合

## 結論
実際にどっちも触ってみましたがPlaywrightにもcodegenという画面操作でコードを出力機能はあるものの、Magicpodの方が圧倒的に早く実装できました
またAIによる運用補佐によってMagicpodでの運用コストの方が低く感じました。
しかし毎月44000円を払い続けないといけないという点が懸念点ですね...
また多くのプロジェクトを抱えている企業であればPlaywrightの設定ファイルを先に作っておけばUIのみの実装だけであればそこまでMagicpodと実装時間の差があまり変わらなくなると思うのでこちらもおすすめです。
graphql_codegenで生成したクラスをテスト実行時にモックする際の注意点

Flutterのテストコードを実装する上で、クラスをモック化するのにmockitoを使うと思います。
通常のクラスであれば特に気にする必要はないのですが、graphql_codegenで生成したクラスを更に、mokitoでモック化したクラスにするためには、build_runnerの設定を変更する必要があります。

具体的に、build.yamlに以下のような記述を追加します。
```yaml
global_options:
  graphql_codegen:
    runs_before:
      - mockito|mockBuilder
```

この記述がない場合、mockitoがgraphql_codegenで生成したクラスを読み込むことができず、意図したモック化ができません。
例えば以下のようなコードの場合、返却値の型は `Future<Query$User>` ですが、ビルドの設定を変更していない場合、モック化したクラスでは返却値の型は `Future<dynamic>` となってしまいます。
```dart
Future<Query$User> getUser(int id) async {
  final client = GraphQLClient(
    cache: GraphQLCache(),
    link: HttpLink('https://example.com/graphql'),
  );
  final result = await client.query$User(
    Options$Query$User(
      variables: Variables$Query$User(
        id: id,
      ),
    ),
  );
  return result.parsedData!;
}
```

https://pub.dev/packages/graphql_codegen

https://pub.dev/packages/mockito
StepFunctionsとKnowledge baseを使ってノーコードでRAGを実現する

StepFunctionsから<a href="https://qiita.com/minorun365/items/d2f376a708ad7cc8b931">Knowledge baseも呼べるようになったらしいので</a>、前に作った以下のお試しから、RetrieverとしてKnowledge baseに差し替えてみます。

https://qiita.com/cyberBOSE/items/8681183c38e970ac6869

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573242/c9848aa8-6bfc-683e-1e8e-678aa5e65521.png">

# 処理の流れ
1. 最初のステップではユーザー入力を元にLLM(Claude Instant)に検索キーワードを考えてもらいます
1. 真ん中のステップでは検索キーワードを元にKnowledge baseを検索します
1. 最後のステップで、ユーザー入力（≠検索キーワード）とKnowledge baseの検索結果からLLM(Claude2.1)で回答を生成します

# 最初のステップと最後のステップ

前回と全く変えていないので省略

# 真ん中のステップ
AgentのRuntimeから、<a href="https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_Retrieve.html">RetrieveAPI</a>を呼び出します。

設定タブの内容は以下
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573242/edf75780-d028-98ad-75fe-6de45202ca67.png">

```JSON
{
  "KnowledgeBaseId": "各自のKnowledge base ID",
  "RetrievalQuery": {
    "Text.$": "$.step1.result"
  },
  "RetrievalConfiguration": {
    "VectorSearchConfiguration": {
      "NumberOfResults": 10
    }
  }
}
```
取得件数は10件にしています。
気になった点として、API仕様書では各パラメータ名が小文字始まりになっていますが、大文字始まりに変えないとエラーで弾かれました。

続いて出力タブの内容は以下
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573242/b5300e01-a59d-452a-06c5-cfd90dc8a2a5.png">

ResultSelectorは以下
```JSON
{
  "result.$": "$.RetrievalResults[*].Content.Text"
}
```
雑ですが、検索結果全配列（10件）のTextを引っこ抜いてます。
こちらもパラメータと同様に、項目名を大文字開始にする必要があります。

ResultPathは以下
```
$.step2
```
これで$.step2.resultにKnowledge baseの検索結果が入ります。

実行時に権限不足を言われると思うので、実行ロールにAmazonBedrockFullAccessを付与しておきます（ReadOnlyでも良いかも？（試していない））。

# 感想

Agent経由のKnowledge base呼出し（5件固定）と比べて、取得件数を増やす事が出来るので使い勝手が良さそうに思いました。Knowledge baseはチャンクサイズをカスタマイズする事も出来ますし。

ところで、Knowledge baseのEmbeddingsとして、CohereのEmbed Multilingualが選択できるようになってました。
上限512トークンというのをどう見るかというのはありますが、チャンクサイズを上限の512トークンにして試してみても良いかもしれません。

<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573242/a7b0a245-35d4-0d8c-8688-a509e5fc0547.png">

<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573242/d6eef606-7554-ec5d-e1af-782002b1b907.png">

https://qiita.com/cyberBOSE/items/fe66c2049aaa04568d61
自己署名証明書　PowerShell でスクリプトに埋め込み方法

以下は、`-Subject`パラメータを使用して署名証明書を作成する方法です：

```powershell
# 証明書のサブジェクト情報を設定
$subject = "CN=YourCertName"

# 自己署名コード署名用証明書を作成
$cert = New-SelfSignedCertificate -Subject $subject -KeyUsage DigitalSignature, KeyEncipherment -Type CodeSigningCert

# 証明書をエクスポート
$certPath = "C:\Users\ユーザー名\Desktop\共有フォルダ\CodeSigningCertificate.pfx"
$cert | Export-PfxCertificate -FilePath $certPath -Password (ConvertTo-SecureString -String "YourPassword" -AsPlainText -Force)

# スクリプトにコード署名用証明書を埋め込み
$certPath = "C:\Users\ユーザー名\Desktop\共有フォルダ\CodeSigningCertificate.pfx"
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($certPath, "YourPassword")
Set-AuthenticodeSignature -Certificate $cert -FilePath "C:\Users\ユーザー名\Desktop\共有フォルダ\password.ps1"
```

これで、`-Subject`パラメータを使用して指定されたサブジェクト情報を持つ署名証明書が作成され、スクリプトが署名されます。適切なパスやファイル名に変更してください。