OmniAICreator/Qiita-1.07M huggingface dataset:
尤度関数/最尤法入門(未完)

# Abstract
最尤法について、例を中心に入門的概要を述べる。
# Introduction
統計学における我々の問題は、
**データから母集団の(真の)分布関数の形を推定すること**
である。その際、
- 関数の形を(ガウス関数とかベルヌーイ関数とか)を仮定する
- 仮定した関数のパラメーター(山の中心とか、裾の広さとか)を決定する
という2段階を踏む。
最尤法は、2段階目の、関数のパラメーター決定の手法である。

パラメーター決定の手法は、最尤法以外にも、たとえば「普通の期待値計算」「ベイズ法」などがある。これらについては付録で述べる。

# 本論
最尤法の心は、
**「実際に起きたこと＝最も起こりやすいこと」**
である。
この原理の下、コイン投げの例を考える。

「あるコインを1000回投げた結果600回表が出たというデータ」があるとする。
ここで、表が出る確率を$\theta$、「1000回投げた結果600回表が出る確率」を$L(\theta)$とすると、我々が推定するべきパラメーターは「表が出る確率$\theta$」である。

すると、
実際に起きたこと＝「あるコインを1000回投げた結果600回表が出たというデータ」
最も起こりやすい＝$L(\theta)$が最大

といえる。最尤法の心に従えば、パラメーター$\theta$の最適値は、$L(\theta)$の最大点、ということになる。

コイン投げの試行をベルヌーイ試行と解釈すると、$L(\theta)$は、
$L(\theta)$=$\binom{1000}{600} \theta^{600} (1 - \theta)^{1000 - 600}$
となる。冪関数は滑らかな関数なので、最大点においては$\frac{dL}{d \theta} = 0$ となっているはずであり、これにより最大点は、$\theta^{*} = 0.6$ と計算できる。
(実際に計算する上では対数尤度の微分を考えた方が計算が楽である)

この結果が我々に教えてくれることは、

**コイン投げをベルヌーイ試行と解釈したときに、「あるコインを1000回投げた結果600回表が出たというデータ」を説明するとき、表が出る確率$\theta$として"最も確からしい"値は0.6である**、ということである。

$L(\theta)$を尤度関数、または単に尤度という。
最尤法とは、尤度の最大値を与えるパラメーターを最適な推定値とする考え方である。
(ただし、尤度関数は付録で述べるベイズ法にも登場する)

\footnote{ここで、$\theta$として$0.5$や$0.8$ではダメな理由は以下のとおりである。
$\theta$として$0.5$や$0.8$を代入すると、$L$ の値は$\theta = 0.6$と比べて小さくなる。より大きな$L$ を与える$\theta$ があるにもかかわらず、そうではない$\theta$を採用することは、
「実際に起きたこと=最も起こりやすいこと」
という思想に反している。}

# 確率分布関数と尤度の関係
このコインを1000回投げたときに表が出る回数の確率変数を$X$として、確率分布関数を$f(X|\theta)$ とすると、$L(\theta) = f(X = 600| \theta) $ の関係がある。

# ガウス分布



@@@ 続く
ko
# 付録A: 最尤法以外のパラメーター推定手法
ここでは、最尤法以外のパラメーター推定手法で表が出る確率$\theta$を推定する手順を紹介する。
## 普通の期待値計算
1000回のコイン投げのうち600回表が出たというデータから、表が出る確率$\theta$は
$\theta = 600/1000 = 0.6$ 

## ベイズ法
ベイズ法は、ベイズ統計学というとても変わった特殊な統計学に立脚したパラメーター推定法で、頻度論的アプローチである最尤法とは大きく異なる。
ベイズ法は、パラメーター$\theta$についての確率密度関数を使って$\theta$の期待値$E[\theta]$を計算し、それを最適なパラメーター推定値とする方法である。
(ベイズ法、ベイズ論を知らない人は先に[このページ](ht)を見てください)

$ P(\theta | X)$ は$X$回表が出たというデータを与えられた後の$\theta$の条件付確率分布であり、事後分布と呼ばれる。これがまさに期待値計算に使える確率密度関数である。

ベイズの定理の式
 $P(X|\theta) P(\theta) = P(\theta | X) P(X)$
の両辺を$\theta$で積分すると、確率条件 $\int P(\theta | X) d\theta = 1$を用いると、
$P(X) =\int_{0}^{1} P(X|\theta) P(\theta) d\theta$
が得られ、
$P(\theta | X) = \frac{P(X|\theta) P(\theta)}{\int_{0}^{1} P(X|\theta) P(\theta) d\theta}$

よって、

$E[\theta] = \int \theta P(\theta|X)d\theta = \frac{\int_{0}^{1} \theta P(X|\theta) P(\theta)d\theta}{\int_{0}^{1} P(X|\theta) P(\theta) d\theta}$

計算に必要な$P(\theta)$と$P(X|\theta)$の関数形を仮定する必要がある。
$P(X|\theta)$は尤度であり、先ほどと同様、二項分布を仮定すればよい
 $P(X|\theta) = Bi(X;N,\theta)$

$P(\theta)$は何かというと、「表がでたコインの枚数$X$」というデータを考慮せず、それとは別のデータ(たとえばコインの曲がり具合など)をもとに恣意的に見積もられる$\theta$の確率分布であり、事前分布と呼ばれる。今回は見積もるための何も情報がない。このような状況での事前分布は「無情報事前分布」と呼ばれ、一様分布を仮定する場合が多い。よって、そうする。

その際、計算の労力を減らすテクニックとして、一様分布をベータ関数の$(\alpha,\beta) = (1,1)$のケースとして表現する。すると、





@@未完
Falsk-Loginを使いメールアドレスとパスワードによるサインイン、サインアウトを実施してみた

## 目的

- 自身のスキルの棚卸

## ソースコード
https://github.com/daruma30610/flask_login_sample

## 実行方法

### 1.コンテナをビルドする

```
docker compose up -d
```

### 2. 以下のページにアクセス

```
http://localhost:5000
```

## 機能

### サインアップ
#### 名前、メールアドレス、パスワードを入力して登録する
- エラー時に再度名前とメールアドレスを手間なのでセッションに保管する
- 入力したメールアドレスはメールアドレス形式になっているかチェック
- 入力したメールアドレスが存在すれば「Already registered」と表示
- 入力したパスワードはBcryptで暗号化

### サインイン

- メールアドレスとパスワードを入力しかつパスワードが問題点なければメインページへとリダイレクト

### サインアウト

- セッション内に保存した名前とメールアドレスを破棄
- logout_user()を実行しサインアウト


## 開発言語

- Python 3.10

## フレームワーク

- Flask
- bootstrap5

## フレームワークプラグイン

- Flask-SQLAlchemy 3.0.3
- Flask-Login 0.6.2
- Flask-Bcrypt 1.0.1
- pymysql 1.0.3
- email-validator

## DBサーバー

- MySQL 8.0.33

## サーバー等の設定

### アプリ

- とくになし

### MySQL

- 文字コード：utf8mb4
- 照合順序：utf8mb4_0900_ai_ci (MySQL8系デフォルト値)
2019年くらいの 「Windowsプログラムでディレクトリ丸ごと削除」 4/4

シリーズもの一覧

1/4 https://qiita.com/macchan/items/30d81c4cb66a52fe4b0b
2/4 https://qiita.com/macchan/items/282db3e735ed0ad4bed8
3/4 https://qiita.com/macchan/items/19a06f30e8f3c553d4cb
4/4 https://qiita.com/macchan/items/9853a6d7b4e01ad4dc8d

C++17 から std::filesystem::remove_all()
が使えます。でも、これ「読み取り専用」でも消える。結局チマチマ消していくのが無難?

```C++:main.cpp
#include    <iostream>
#include    <locale>

#include    <filesystem>

int main()
{
    setlocale(LC_ALL, "Japanese");

    std::error_code err;
    uintmax_t   uRet = 0;

    try {
        uRet = std::filesystem::remove_all("D:\\Work\\Dir", err);
    }
    catch (const std::filesystem::filesystem_error& e) {
        std::wcout << L"例外 " <<  e.what() << std::endl;
    }
    std::wcout << uRet << L" " << err.value() << std::endl;

    return 0;
}

```
VisualStudio 2019 あたりから使えます。オプションはここ。
![20230528.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305607/b277e58e-aacc-dbbf-9db3-764978437108.jpeg)
【Slack】RSSの通知を特定のチャンネルで受け取る方法まとめ

# はじめに
RSSの更新通知を特定のチャンネルで受け取っているのですが、時間が経つと設定方法を忘れてしまうので、備忘録的にまとめておこうと思います。

# ①SlackにRSSフィードアプリを追加する

RSSフィードアプリは以下になります。

https://slack.com/apps/A0F81R7U7-rss

上記ページで【Slackに追加】をクリックします。
次のページで【RSS インテグレーションを追加する】をクリックします。

これで導入は完了です。

# ②フィードの登録
アプリを導入したら次に、登録したいページのフィードを登録します。

![スクリーンショット 2023-05-28 19.35.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/4d13b14a-5521-fd0a-1898-9e7002c979ed.png)

上記の入力欄にそれぞれ購読したいページのURL、通知を受けたいチャンネルを設定します。
設定が済みましたら購読するボタンから登録して完了です。

# ③おまけ：コマンドでの操作方法
一連の操作はslack上からでも実行可能です。
それぞれ購読されているチャンネル上から行います。

```
// 登録する場合
/feed subscribe 登録したいURL

// 削除する場合
/feed remove 削除対象の購読id

// 購読されている一覧取得
/feed list

```

上記をメッセージ入力欄に入力し実行することで対応可能です。
一つのチャンネルに対して一度にたくさん登録する場合はコマンドが便利ですね。

RSSに関する設定は以上になります。

# さいごに
社内のQiita更新通知などをslackで受け取ると便利ですよね。
あとは言語の更新通知なども受け取るようにしています。
Nest.js で Jest を使った E2E テストのエラー解消方法

## 以下のエラーはいろんなケースで発生する

```
Jest has detected the following 1 open handle potentially keeping Jest from exiting:

  ●  TCPWRAP
```


```
ReferenceError: You are trying to `import` a file after the Jest environment has been torn down. From domain/common/constants/constants.e2e-spec.ts.

      at Object.getCodec (../node_modules/mysql2/node_modules/iconv-lite/lib/index.js:63:27)
      at Object.getDecoder (../node_modules/mysql2/node_modules/iconv-lite/lib/index.js:125:23)
      at Object.<anonymous>.exports.decode (../node_modules/mysql2/lib/parsers/string.js:10:25)
      at Packet.readNullTerminatedString (../node_modules/mysql2/lib/packets/packet.js:412:25)
      at Function.fromPacket (../node_modules/mysql2/lib/packets/handshake.js:62:33)
      at ClientHandshake.handshakeInit (../node_modules/mysql2/lib/commands/client_handshake.js:98:40)
      at ClientHandshake.execute (../node_modules/mysql2/lib/commands/command.js:45:22)
      at PoolConnection.handlePacket (../node_modules/mysql2/lib/connection.js:456:32)
      at PacketParser.onPacket (../node_modules/mysql2/lib/connection.js:85:12)
      at PacketParser.executeStart (../node_modules/mysql2/lib/packet_parser.js:75:16)
      at Socket.<anonymous> (../node_modules/mysql2/lib/connection.js:92:25)

```

なので、今後もどんなケースで上記が発生するかを追記していこうと思う。

## 1. 不要なクラスを読み込んでいた

動作確認をするためにいろいろいじっていた際にファイルを削除し忘れていた。
 
``` .module.js
@Module({
  controllers: [HogeController],
  imports: [
    TypeOrmModule.forFeature(
      [XXX, YYY]
    )
  ],
  providers: [
    HogeService,
    NeedlessService // これを削除
  ],
})
```

## 2. Mockができていない

外部サービスにリクエストをとばすメソッドなどのMockがうまくいってない場合

``` .e2e.ts
  let app: INestApplication;
  const mockS3Service: MockType<S3Service> = {
    getPreSignedUrlForPut: jest.fn().mockResolvedValue({url: 'url'})
  };

  beforeEach(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [
        ...buildDefaultImportedItems(), //テスト用の自作メソッド
        //FilesModule, ここでモジュールを読み込まずに
      ],
      controllers: [FilesController], // テスト対象のコントローラを読み込む
      providers: [
        {
          provide: S3Service,
          useValue: mockS3Service,
        },
      ],
    }).compile();

    app = await initApp(app, moduleFixture); //テスト用の自作メソッド
  });
```
JetpackCompose簡単なロード中のグルグルサンプル

JetpackComposeを触ろうと思ったので、簡単なサンプルを作ろうと思いました。
ロード中のグルグルを実装してみようと思います。

```Progress.kt
@Composable
fun Progress() {
    Box(
        modifier = Modifier
            .fillMaxSize()
            // onClickの処理グルグル中に操作を受け付けるなら必要ない。
            .clickable(
                interactionSource = remember { MutableInteractionSource() },
                indication = null,
            ) {
                // 空にしておけばonClickの処理グルグル中に操作を受け付けない
            },
        contentAlignment = Alignment.Center
    ) {
        CircularProgressIndicator(color = Color.Blue)
    }
}
```

こちらので使用したい画面中央にグルグルが表示されます。

新規でプロジェクト作成する時など、事前にシンプルなサンプルを作っておくと便利ですね。
Djangoテンプレートでincludeを使う時にurlパスを調べてページごとに表示内容を変える方法

## 動機
Djangoのテンプレートにおいて、base.html内で部品としてナビバーをincludeを使って読み込もうとした。
そのときナビバーで表示するリストの要素を、ページごとに変更したかった。

## 完成形
- トップページの画面
![Screenshot_2023-05-28-18-20-30-06_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288404/354396fb-c336-3ffc-bb65-476e2fae6be4.jpeg)
- トップページのナビバー部品
![Screenshot_2023-05-28-18-20-54-03_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288404/725ddaa7-8098-c137-e691-2ddb9a048e27.jpeg)
- 試しに「POSTS」をクリックするとトップページ内のPOSTSのセクションまで自動でスクロールする
![Screenshot_2023-05-28-18-21-05-20_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288404/6d351021-ef95-59a1-11eb-57d4f30996b2.jpeg)
- 投稿記事の詳細画面
![Screenshot_2023-05-28-18-23-13-72_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288404/155cac30-7e7d-1fcd-d70a-8a09721d5ed6.jpeg)

- トップページ以外のページでは自動スクロールの機能は不要なので、ナビバーのリスト要素から要らないものを消したい（LOGIN, SIGNUPはそのまま残したい）
![Screenshot_2023-05-28-18-23-25-08_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288404/c38011c1-e650-48d4-52aa-e637702fb971.jpeg)

## base.htmlでナビバー部品を読み込む場合の問題点
- base.htmlでincludeしてナビバー部品を読み込む場合、共通部品が各ページで読み込まれてしまうため、ページごとに異なるリスト要素の表示を実現できない
- そこで、base.htmlではナビバー部品を読み込まず、各ページのhtmlファイルにて必要なナビバー部品をそれぞれ用意してincludeすることを考えた。

## base.htmlでナビバー部品を読み込まない場合の問題点
- base.htmlでナビバー部品を読み込まない場合、各htmlファイルでナビバー部品をわざわざincludeする必要がある。
- ナビバー部品のhtmlファイルが増えて管理が大変。
- 修正の手間が増えてとても面倒くさい。

## 解決策
- やはりbase.htmlでナビバー部品を読み込むことにし、リクエストページのurlパスを調べ、if文を使って各urlパスごとに表示する内容を変えることにした。

        #django-recursive-post/templates/includes/header/header-nav.html

        <ul class="nav-menu">
          {% url 'top' as top_url %}
          {% if request.path == top_url %}
            <li><a href="#pickup">PICK UP</a></li>
            <li><a href="#posts">POSTS</a></li>
            <li><a href="#contact">CONTACT</a></li>
          {% endif %}
          {% if user.is_authenticated %}
            <li><a href="{% url "account_logout" %}">LOGOUT</a></li>
          {% else %}
            <li><a href="{% url "account_login" %}">LOGIN</a></li>
            <li><a href="{% url "account_signup" %}">SIGN UP</a></li>
          {% endif %}
  </ul>



##### 以下の2行がポイント
{% url 'top' as top_url %}
{% if request.path == top_url %}

{% url urlpatternsのname as 変数名 %} とすることでurlパスを変数に格納することが出来る。
その値とrequest.pathの値を比べることで目的の動作を実現できた。

今回は以上となります。少しでも参考になれば幸いです。
⚡️Pull RequestをReady for reviewにしたときにslackに通知するGithub Actions

## 最終的な成果物
![](https://storage.googleapis.com/zenn-user-upload/43b614a366da-20230527.png)

### コードサンプル
使用したworkflow: [action-slack-notify](https://github.com/rtCamp/action-slack-notify)

```yml
con:
  pull_request:
    types: [ready_for_review]
name: Slack Notification When PR become ready for review
jobs:
  slackNotification:
    name: Slack Notification
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2.2.0
    - name: Slack Notification
      uses: rtCamp/action-slack-notify@v2
      env:
        SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_FOR_PR_READY_FOR_REVIEW }} # あらかじめGithubのSettingにてSecretsを設定しておこう
        SLACK_LINK_NAMES: true # メッセージ内でのメンションを有効にする
        SLACK_MESSAGE: |
          レビューをお願いします🙏 @engineers
          <${{ github.event.pull_request.html_url }}|${{ github.event.pull_request.title }}>
        SLACK_USERNAME: 'レビューお願いします！Bot'
        MSG_MINIMAL: true # メッセージだけを通知文にする
```

## やりたかったこと
Githubで、Pull RequestをReady for Reviewにした時にこれまではSlack上で「レビューお願いします！」と言っていたが、そのコストを削減したかった。


## 実装する中で気づいたこと

- yml内で改行を反映するには`|`を用いれば、改行やスペースが反映されること（逆に反映されないのは`>`）
- Slack上でhyperlinkを作るには、markdown記法ではなく以下のように記述する必要があること
  - `<link|text>`
- Pull RequestのGithubでのURLを取得するには
  - `github.event.pull_request.html_url`(string型)
- Pull Requestのタイトルを取得するには
  - `github.event.pull_request.title`(string型)

ref: [yamlの記法について](https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html#yaml-basics)  
ref: [プルリクエストにアクティビティが発生したときに発生するイベント](https://docs.github.com/ja/webhooks-and-events/webhooks/webhook-events-and-payloads#pull_request)
AccessのVBAでエクセルシートの特定セル以外は編集不可設定に

# やり方

参照設定に『Microsoft Excel 16.0 Object Library』追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6cc03820-de1c-0a05-770a-240b8b30157a.png)

```vb:サンプル
Dim excel_ As New Excel.Application
Dim excel_sheet_ As Excel.Worksheet

'バックグラウンドで起動
excel_.Visible = False
excel_.UserControl = False
'Accessファイルと同じフォルダーにあるtes.xlsxが対象
excel_.Workbooks.Open FileName:=CurrentProject.Path & "\tes.xlsx"

'一番左のシートのみを選択状態に
Set excel_sheet_ = excel_.Worksheets(1)
excel_sheet_.Select Replace:=True

'全セル編集不可。
excel_sheet_.Cells.Locked = True

'1行3列目（C1セル）のみ編集可に。
excel_sheet_.Cells(1, 3).Cells.Locked = False

'セルの編集不可にはシートの保護もセットで必要。
excel_sheet_.Protect Password:="abcd"

'Excelファイル保存してExcelアプリケーション終了。
excel_.Workbooks(1).Close SaveChanges:=True
excel_.Quit
```

編集不可セルに入力等をしようとすると下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d9217d3c-75d9-2834-aea7-2767171a3bf7.png)

# 参考サイトさん

https://www.moug.net/tech/exvba/0050079.html

# バージョン

Windows 10 Pro 22H2 19045.3031
Microsoft Access for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット
Microsoft Excel for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット
日本語に適した「ホームポジション」

　妙に合理的なキーボードの「ホームポジション」の人を見つけたのでご紹介。
　左手小指は[A]からほとんど動かず、そのほかの指は
左手中指が[E]
右手人差指が[U]
同中指が[I]
同薬指が[0]
　ようするに母音がすぐに叩けるように待機しているのだ。

　なんと合理的な。これでUS配列なら、Enterキーもさぞ叩きやすかろう。
　ものすごく高速にタイプしている人におどろいて観察したところそういう動きに気が付いた次第。
　本人に伺うと「まるで意識していない」「そんなこと言われたの初めて」。いや、その「勘」が頭の良さというものなのですよ。だから私、先生を個人的に信用します。(さすが東京医科歯科大)

　そもそも今のQWERTY配列は、機械式キーボードの活字を支える「柄」の部分がこんがらがらないように、あるいみ「高速だと打ちにくいように」考えられたものだ。コンピュータ時代になってDovrak配列のように叩きやすさ優先の合理的な配列が提唱されたが、一度規格化されたものはそう簡単に変わらない。それを母音の使われる数が極端に多い日本語ならではの使いこなしで無意識に乗り越えてしまったこの人に拍手。

　どっちかというと私もキータッチは速い方らしい。仕事で重要なオペレーションがあり、一人が端末を操作して一人が横でチェックするというとき、オペレーション役を仰せつかることはまずない。というのは「速すぎて何やっているか見て分からない」からだそうだ。
　しかし私は四天王最弱。いや、嫁さんやうちの子供の方がずっと速いから家族で一番遅いってことなんだけど。3人ともピアノやっていたからなあ。とくに嫁さんは(ぼーっとした外観とは異なり)ベートーベンの「月光」第三楽章を「速いだけ」と言い切るくらい速い。

　よし、おとーさまの威厳のためにこのホームポジションを身に着けて、、、と思ったが、どうしても左手はA,S,D,Fに、右手はJ,K,L,+に指が落ち着いてしまうのでした。習慣とは恐ろしい。
C# internal 型・メンバーを指定した Assembly からアクセス可能にする

# 環境
Visual Studio 2022
※執筆時 v17.6.2

# 概要

主に UnitTest を実装中、別 Assembly の internal な型やメンバーにアクセスしたくなります。そんな時はプロジェクトファイルに数行追加して外部 Assembly からアクセス可能にしてあげましょう。

:::note warn
通常はせっかく internal に設定した型やメンバーを公開する必要はありません。
僕の低能では用途は UnitTest くらいしか思いつきません。。。
:::

# 手順

1. プロジェクトファイルを開く（「プロジェクトファイルの編集」）
1. `<Project></Project>` 内に以下を追加する
```xml
  <ItemGroup>
    <InternalsVisibleTo Include="<アクセス可能にさせる Assembly の完全な名前>" />
  </ItemGroup>
```

:::note
Assembly の完全な名前はプロジェクト名を入れてあげればいいです。
:::

# 結果

クラスライブラリ側で internal に設定した型とメンバーに UnitTest プロジェクトからアクセスすることができました。

#### クラスライブラリプロジェクト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/b5588090-c07c-7385-77c8-43927c73554b.png)

#### xUnit プロジェクト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/bd2e7cdd-3680-71a2-2682-e5795834fbbf.png)

# 参考

https://learn.microsoft.com/ja-jp/aspnet/core/migration/50-to-60-samples?view=aspnetcore-6.0#project-file-csproj

https://stackoverflow.com/questions/4234064/where-to-put-internalsvisibleto
React公式ドキュメント(英語)を隅から隅までやる冒険 1-1 [JSを実行できない]

# 1-1 [JSを実行できない]

記事範囲
[ドキュメント](https://react.dev/learn)
最初の1ページの1/10くらい

# 対象読者

- Reactという単語は聞いたことがあるが全く触った事がない方
- フロントエンド・バックエンドの言語をprogateレベルでちょっと触った事があり、少し手を広げたい人
- 公式ドキュメントを読んでみたい方
- 駆け出しエンジニアの雛の辿々しい歩みを眺めて和みたい方


# 経緯

先日
Twitter経由で認知を頂き、
OGOBの元でインターンシップの機会をいただけるかもしれないチャンスを頂いています。


弱小勉強用アカウントでこんな事が起き、
本当に種はまいておくものですね。


Reactを使い開発を行なっており、
基本的な技術を身につけるといいとのことで
公式ドキュメントを通読することにいたしました。

ただどんなプレッシャーもかけられておりませんので、
この勉強にお金はいただいておりません。

（、、
受けたい試験や行きたい場所はあるので、、
もちろんいただけるものはありがたい、、）

ですがそれも、お金を出したくなるレベルの記事をかいてからのご相談だと思っています。

以下、Reactに触れてみようかな！
でも英語ドキュメント読むのやだな！
という方にはピッタリの内容になっているかと思います。
（和訳もちろんあるんですが）

是非お楽しみください。

# 内容概略

公式ドキュメント
[Quick Start - React](https://react.dev/learn)
から、
[Escape Hatches](https://react.dev/learn/escape-hatches)
まで。

# 使用環境

MacBook Air

チップ:Apple 1M
メモリ:8 GB
OS:Ventura 13.3.1

# 筆者スキル

- あまあま片手間エンジニアもどき
- 大学講義ではR・Pythonをいじる。（経験数ヶ月レベル）
- Progate レベル82 （どれもチラッと触った感じ。HTML・CSS・Javascript・PHP・Git・コマンドライン、、）

# Reactとは

Javascriptのフレームワーク
ではなく**ライブラリ**
Facebook社が開発し、
WebサイトのUIパーツを構築するためのもので、
Facebook、インスタグラムにも使用されているようである。

# Reactの特徴

- 宣言的なView（このような見た目になります）
- コンポーネントベース（部分的な補修が可能）
- 一度学習すれば、どこでも使える（元々開発環境に途中から使うことを前提にしている）
- 仮想ROM（レンダリング機構）が備わっている
- Simple Page Applicationが作りやすい
- React Nativeが使えるようになる。

# Quick Start

簡単なボタンを作る仕組みを作っている。

```
function MyButton() {
  return (
    <button>
      I'm a button
    </button>
  );
}

export default function MyApp() {
  return (
    <div>
      <h1>Welcome to my app</h1>
      <MyButton />
    </div>
  );
}

```

しかし、どうも手元で動かしてみないことには、わからない。
Reactはパッケージと言いながらpackage.install library()していないのはどういうことなのだろうか。

Javascriptの理解が足りないからである可能性も大きい。
上半分はI,m a button と書かれたボタンを作るとわかるが、
後半がよくわからない。
ルートコンポーネントを作っているようである。

MyAppは
JSXで書くことができる。
と記述されているが、これはJavaScript XMLのことである。

Javascript XMLとは、
Javascriptの中に、HTMLやXMLの
タグ構文を入れ込むことができる。

タグの中には属性も追加することができ、
Babelなどのツールを使用することによってJavascriptへ変更できるようである。

ただレンダリングをよく理解していない。
一般的にはデータやコードを、最終的に表示するまでの加工のことを行っているのではないか。
HTMLからDOMツリーというものを作り、
CSSのスタイル情報より、実際にブラウザなどで表示することを指すようである。
ここまでを調べ、
VScodeのGoliveという拡張機能にて、実行したところ以下のようになりました。

![スクリーンショット 2023-05-28 17.16.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3303427/a6b55b7a-8e12-a6ce-03cd-2b910bddb0e7.png)

早速微妙に違ってしまいますね。
書いているファイルをクリックできるようになっていますが、
これはただ単にGoliveの動きで、
クリック先に、JSのコードが出てきたので、

これはJSの実行方法をしっかりと理解する必要がありそうです。
ただ検索してもヒットしない系の基本的すぎる事項っぽいです。

HTMLに入れてみましたが、ボタンも出力されません。

ただドキュメントから、直接実行できるようでそのサポートには震えてしまいました。
![スクリーンショット 2023-05-28 18.20.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3303427/f1b3d37a-2079-f636-f4b6-86000b43f615.png)
胸熱な統合開発環境があるようですね。

以下のコードからGo Liveでも動かなかったので、これはお世話になるしかありません。

```
<body>
    <script>
        function MyButton() {
  return (
    <button>
      I'm a button
    </button>
  );
}

export default function MyApp() {
  return (
    <div>
      <h1>Welcome to my app</h1>
      <MyButton />
    </div>
  );
}
        //ここにJavaScriptを記述する
 
    </script>
</body>
```
# 参考文献

https://react.dev/learn

https://www.sejuku.net/blog/108338


# あとがき

想像の十倍わからなかったので、一回切らせていただこうと思います！

体力を蓄え続きを書いてゆきます。
[翻訳] LangChainにおけるドキュメントに対するQ&Aのコンセプトガイド

[Question Answering Over Documents \| 🦜️🔗 LangChain](https://docs.langchain.com/docs/use-cases/qa-docs)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note
[Pythonガイド](https://qiita.com/taka_yayoi/items/aa9c53bd0fb97e0a4513)
[JS Guide](https://js.langchain.com/docs/use_cases/question_answering/)
:::

LLMはパワフルですが、トレーニングしていない情報についての知識を持っていません。トレーニングされていないドキュメントに対する質問に回答するためにLLMを活用したいのであれば、ドキュメントに関する情報を提供しなくてはなりません。これを行う最も一般的な方法は、「収集拡張生成(retrieval augmented generation)」を通じたものです。

収集拡張生成のアイデアは、質問があった際には、最初に適切なドキュメントの収集ステップを行うというものです。そして、これらのドキュメントをとオリジナルの質問を言語モデルに引き渡し、レスポンスを生成させます。しかし、これを行うためには、最初にドキュメントをこのような方法で検索できるようなフォーマットに変換しなくてはなりません。このページでは、これら二つのステップ：(1)ドキュメントを検索可能なフォーマットで取り込み(2)収集拡張生成チェーンにおけるハイレベルなアイデアをウォークスルーします。

# 取り込み

皆様のデータとやり取りを行うために言語モデルを活用するには、最初に適切なフォーマットにしなくてはなりません。このようなフォーマットは`Index`となるでしょう。データをインデックスにすることで、やり取りを行ういかなる後段のステップを簡単なものにします。

インデックスにはいくつかのタイプがありますが、現時点で最も一般的なものはベクトルストアです。ドキュメントのベクトルストアへの取り込みは以下のステップで行うことができます：

1. (Document Loaderを用いた)ドキュメントのロード
1. (Text Splitterを用いた)ドキュメントの分割
1. (Text Embedding Modelを用いた)ドキュメントのエンベディングの作成
1. ドキュメントとエンベディングをベクトルストアに格納

# 生成

これでインデックスができたのですが、生成を行うためにどのようにこれを活用するのでしょうか？これは、以下のステップにブレークダウンすることができます：

1. ユーザーの質問の受け付け
1. 質問に適したインデックス内のドキュメントを検索
1. (PromptTemplateを用いて)質問とすべての適切なドキュメントからPromptValueを構築
1. PromptValueをモデルに引き渡し
1. 結果を取得し、ユーザーに返却
AI分析でわかった トップ5%社員の時間術（トップ５%シリーズ）を読んでみて

# **AI分析でわかった トップ5%社員の時間術（トップ５%シリーズ）**

学んだことを簡単にまとめました。

## 生産性を高めるための心得

### 昼休憩は、昼寝とエネルギーの分散補給

- 午後は集中力を切らさず行動を続けることが難しいため
    - 昼寝前にカフェインをとって、30分ほど仮眠するのがオススメ
- 分散補給で血糖値をコントロールする
    - 午後のちょっとした休憩時に軽いものを摂取する（ナッツやドライフルーツなど糖質が低いもの）
- 同僚とのランチの場合など
    - ご飯を少なめに摂るなど糖質を低めに摂取することを心がける

### 情報収集は一日5分以下

- 調べたいことをmemoなどにまとめて置き、一気に調べる

### 英語は勉強しない。

- 外資に行ったら、給料が上がるのでは？という邪念や妄想を消し去ることで仕事に集中できる。
- 日本人が英語を喋れない理由は恥ずかしさから
    - 外国人がいるバーに行って積極的に話しかけて勉強した方がコスパがいい

### 小休憩を挟み、無駄な作業興奮を抑える

何か作業を開始するとドーパミンの分泌により、作業興奮することがある。

作業興奮状態になると、作業することに対して快感になるので作業時間が伸びてしまう。

心理学的にも、作業を途中で強制的に止めると仕事の続きが気になり、休憩後も集中力を切らすことなく継続することができる

- 水分を机に置かないことで、席を離れる口実を作る
    - 定期的に作業から離れることで作業興奮を防ぐ

## やる気スイッチ
### 出勤前にルーティンを作る
儀式(ルーティン)を行うことで仕事がすぐに始められると暗示をかける
例
- 朝コーヒーを淹れる
- 会社の近くのカフェで紅茶を飲む
- ガーデニングをする
### 承認欲求を満たす
- トイレを一週間に一回綺麗にする。
- 誰もやりたくないことをやったという達成感があるらしい。
- 意外と経営者でやっている人は多いらしい。
### モチベーションの維持方法
- 苦手なタスクなどを行うときは、タスクが終わってたら自分にご褒美をあげるなどをする
### 金曜日に来週の大きな仕事を二つまとめる
重要タスクを予め予定を入れ、空いた時間に小さなタスクを処理する
- 時間を短縮するのではなく、何をするのかを明確にする。
## その他
### 作業は必ず目的を明確にしてから
作業の必要性と必要最低限のプロセスを描いてから作業を開始する
成果に繋がらなかったり、目標達成にインパクトのない作業によるロスを防ぐため
### メンバーを巻き込んで仕事を終わらせる。
仕事の複雑さを理解し、適材適所で人を巻き込みながら解決する
- メンバーにベネフィットと依頼内容の意義と目的を伝え、相手が納得した上で頼む
- 人を巻き込むためのコミュニケーション能力を磨くことにも時間をかける
    - 人を巻き込むことで、短い時間で大きな課題を成し遂げることができるため
## メモをとる
記憶の定着のため、手を動かす（メモを取る）
## 参考書籍
[AI分析でわかった トップ5%社員の時間術（トップ５%シリーズ）](https://amzn.to/3IJ7wLQ)
Azure VMSS Scale Set Agentのリソースグループを変更する方法

Azure Pipelinesの実行環境として、VMSS Scale Set Agentを選択することができます。
VMSSを使ったPipelinesの構築手順は以前公開しています。
[Azure DevOps Pipelinesを使ってAzure Container Registryにイメージをpushする(Linux VMSS編)
](https://qiita.com/shingo_kawahara/items/4ddd794510caa8fa9ec6)

既にPipelinesを動かした状態で、VMSSの配置先リソースグループを変更する手順を残します。

# VMSSリソースグループ移動
* 稼働しているインスタンスがあると移動できないため削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6a766db3-4b30-8aff-ff3e-4e2503fb6b8b.png)

* 概要から[移動]→[別のリソースグループに移動する]の順に選択し、リソースグループを移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/33a32ef6-3ca0-777b-822e-32a2a41c412d.png)

# Agent pools削除
* Azure DevOpsにアクセスし、[Project Settings]→[Agent pools]の順に選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8116175f-6eac-1dbb-26e6-ad307e177dc0.png)

* 削除する前にAgent Poolsの設定はメモしておきます。

* 対象VMSS Scale Set Agentを使っているAgent Poolsを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/562edfa6-17d6-5f19-1a6e-94ea6d3c6987.png)

# VMSSからタグ削除
* Azure Portalから対象VMSSを選択し、[__AzureDevOpsElasticPool]タグを削除します。削除しないとAgent Pools再作成時に「this virtual machine scale set is already in use by pool xxxx」のエラーメッセージが出て再作成することができません（既に使われているVMSS判定にこのタグを使っている模様）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ad4b9c0c-a2d5-f97b-ab15-1204f0f98fa8.png)

# Agent Pools再作成
* まずは実行中のパイプラインがないことを確認します。あればキャンセルしてください。そうしないとAgent Pool再作成時にTF400898エラーが出ます。

* Agent Poolsを新たに作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/af7caf7f-08cf-986f-12f0-af56d7eccfcc.png)

# Releasesジョブ修正
* Releasesジョブを使っている場合は、Run agent jobのAgent Pool値がNullになっているため再設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7ba25c7d-920b-c910-94ae-6f8cbdd790c0.png)

# パイプライン実行
* ここまで設定したらパイプラインを実行して動作確認をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/49638268-c2e8-30ce-3fe2-545ab41fab2f.png)

* 実行時に上記のようなパイプライン実行権限付与が必要なメッセージが出た場合は設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/75563cb1-6e84-6d21-56f6-3d9e1f3308bf.png)

以上です。
python 仮想環境(pyenv)をオフラインで作成

# 仮想環境をオフラインで作成
作成した仮想環境のライブラリをダウンロードし、他の人が同じ環境を作れるようにする

## ライブラリのダウンロード
 ライブラリのリストを保存するファイル(requirements.txt)を作成し、ダウンロードしたファイルを保存するフォルダ(packages)にライブラリ(wheelファイル)をダウンロード


- **仮想環境をアクティベートする**
```batchfile
.\.venv\Scripts\activate
```

- **インストールされているライブラリをrequirements.txtに出力**
```batchfile
pip freeze > requirements.txt
```

- **requirements.txtを使い、packagesフォルダにライブラリ(wheelファイル)をダウンロードする**
```batchfile
download -r requirements.txt -d packages
```

- **batファイル**
    - ダウンロードしたファイルを保存するフォルダ、ライブラリのリストを保存するファイルは変数として、変更しやすくしておく
    - 同一フォルダ、ファイルが存在していた場合は削除する

```batchfile
@echo off

REM 仮想環境のディレクトリパスを指定
set VENV_DIR=.venv

REM ダウンロードしたファイルを保存するフォルダ名
set PACKAGES_FOLDER=packages

REM ライブラリのリストを保存するファイル名
set REQUIREMENTS_FILE=requirements.txt

REM 既存のフォルダやファイルがあれば削除
if exist %PACKAGES_FOLDER% (
    rmdir /s /q %PACKAGES_FOLDER%
)
if exist %REQUIREMENTS_FILE% (
    del %REQUIREMENTS_FILE%
)

REM 仮想環境をアクティベート
call .\%VENV_DIR%\Scripts\activate

REM インストールされているライブラリを取得し、wheelファイルをダウンロード
call pip freeze > %REQUIREMENTS_FILE%
call pip download -r %REQUIREMENTS_FILE% -d %PACKAGES_FOLDER%

REM 仮想環境をデアクティベート
call %VENV_DIR%\Scripts\deactivate

echo ライブラリのダウンロードが完了しました。
pause
```

## 仮想環境の作成 & ライブラリのインストール
- **仮想環境で使うpythonバージョンを設定**
```batchfile
pyenv local 3.9.13
```

- **仮想環境を作成**
```batchfile
python -m venv .\.venv
```

- **仮想環境をアクティベート**
```batchfile
python -m venv .\.venv
```

- **ライブラリのインストール**
準備したライブラリのリストrequirements.txtと、ライブラリをダウンロードしたpackagesフォルダと、
```batchfile
pip install -r requirements.txt --no-index --find-links=packages
```

- **batファイル**
    - 仮想環境名とpythonバージョンは変数名とする
    - python設定されていた場合は仮想環境にアクティベート
    - 仮想環境がすでにあった場合は削除
    - エラーがあった場合コメントを出す
```batchfile
@echo off

REM Pythonのバージョンと仮想環境名を定義
set virtualenv_name=.venv
set python_version=3.9.13

REM プロジェクトのローカルディレクトリで
REM Pythonのバージョンが既に設定されているかチェック
call pyenv version | findstr /c:"%python_version%" >nul
IF %errorlevel% EQU 0 (
    echo プロジェクトのローカルディレクトリで既に
    echo Pythonのバージョン %python_version% が設定されています。
    goto :CreateVirtualEnv
)

REM 既存の仮想環境が存在する場合は削除
IF EXIST .\%virtualenv_name% (
    rmdir /s /q .\%virtualenv_name%
)

REM pyenvで使用するPythonのバージョンを指定
call pyenv local %python_version%
IF %errorlevel% NEQ 0 (
    echo バージョン %python_version% のPythonがインストールされていません。
    goto :EndScript
)

REM 仮想環境の作成
:CreateVirtualEnv
call python -m venv .\%virtualenv_name%
IF %errorlevel% NEQ 0 (
    echo 仮想環境の作成に失敗しました。
    goto :EndScript
)

REM  仮想環境のアクティベート
call .\%virtualenv_name%\Scripts\activate.bat
IF %errorlevel% NEQ 0 (
    echo 仮想環境のアクティベートに失敗しました。
    goto :EndScript
)

REM ライブラリのインストール
call pip install -r requirements.txt --no-index --find-links=packages

IF %errorlevel% NEQ 0 (
    echo ライブラリのインストールに失敗しました。
    goto :EndScript
)

echo 仮想環境の作成とライブラリのインストールが完了しました。
pause

:EndScript
```
---
chatGPTにも手伝ってもらって作成
GistとDartPadの連携方法

# GistとDartPadの連携方法

コードの断片共有プラットフォームであるGistと、Dartプログラミング言語のオンラインコードエディタであるDartPadの連携方法について学びます。この統合により、DartPadからGistを使用してDartコードの断片を作成、編集、共有することができます。

## 前提条件

始める前に、以下のものを用意しておいてください：

- A Gist account ([https://gist.github.com](https://gist.github.com))
- Dartプログラミング言語の基本知識
- DartPadへのアクセス（[https://dartpad.dev](https://dartpad.dev)）

## 手順

1.  DartPadを開く
   [https://dartpad.dev](https://dartpad.dev)にアクセスして、DartPadを開きます。

2.  Dartコードを書く
   DartPadのエディタ領域に、Dartコードを書いてください。提供されているテンプレートを使用するか、自分でコードを記述することができます。

6.  Gistを公開する
   「Create public gist」ボタンをクリックして、Gistを公開します。または、「Create secret gist」ボタンをクリックしてシークレットGistを作成することもできます。

7.  GistのURLをコピーする
   Gistが作成されたら、ブラウザのアドレスバーからURLをコピーします。このURLを使用して、コード断片をアクセスして共有することができます。

8.  GistのURLを共有する
   他の人とGistのURLを共有することができます。他の人は、DartPadのインターフェースを使用してDartコードを表示および実行できます。

9.  Gistのコードを編集する
   コードを変更する場合は、GistのURLにアクセスし、「Edit」ボタンをクリックして、Gistのエディタを開きます。そこでコードを編集することができます。

9.  Gistを更新する
   変更を加えた後、"Update"ボタンをクリックして、Gistを更新します。





Gistはバージョン管理も提供しているため、必要に応じて以前のバージョンのコードを参照することもできます。
Scalaスケーラブルプログラミング第4版 第05章 基本型と演算子 読書メモ

![基本型と演算子.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27987/c3b16c93-a4e8-424b-76d9-e85e8b0554fb.png)

型自体は基本的に他の一般的な言語と変わらないです。
すべてがオブジェクトなのでJavaのようなプリミティブ型は存在しませんが、実行時にはパフォーマンス目的のためプリミティブ型に内部的に変換、というかコンパイルされるようす。

文字列補間の「補間」という言葉、補完じゃないんかい、と思ったのですが、既知のデータから類推して埋めることを補間というそうです。どちらかというと理数系の用語らしい。なるほど。

```
s"hoge, $moge"
```
のように書けて便利ですね。JavaScriptのテンプレートリテラルみたいな。

演算子も全てメソッド、というのはJavaとの大きな違いでしょうか。
これによってコーディング時にいろいろ書けてしまうとは思うのですが、プロジェクト内で共通化したほうがよさそうだなと思いました。

等価性の判定が==/!=で済むのはJavaユーザーとしてはありがたいですが、Javaに戻った時に忘れちゃいそう。
【情報セキュリティ】冗長性・暗号利用モード

# ０．はじめに											
大学で情報セキュリティの講義を受講している者です。
"広く浅く"情報整理したいため投稿。
内容のレベルは超入門編、個人的な感情も少し入り混じった備忘録。
（齟齬がある場合はご指摘いただけると助かります。）

# １．冗長性とは
(以前よりセキュリティを勉強してて頻繁に出てる「冗長性」というものだが..)
メッセージ以外にも情報ってそもそも何の情報？となったので記述

**平文に余分な情報を加えることが主としている**
**暗号文の誤りを検出したり復号のための情報を提供するもの**

### 1-1.冗長性が無い場合、暗号文のみからの平文復号は不可能
冗長性のある暗号化方式にはエラー訂正符号やフェイルセーフ機能が含まれている
暗号文に誤りがあった場合、正しい平文を復号することができない

### 1-2.エラー訂正符号とは
誤り訂正符号_``ECC(Error-Correcting Code / Error-Correction Code)``とも言われる
データの扱う上で発生する謝りを受け手側で検出し訂正することを促す符号
データはそもそも意図せず欠落や改変が起こる
その問題を阻止するためにある訂正符号

### 1-3.フェイルセーフ機能とは
部品の欠落、操作ミス、誤作動が発生した場合に極力安全な状態に移行させるための仕組み
暗号化装置が故障した場合でも暗号文を復号できるようにするために冗長性を持っている
航空機や宇宙船にも搭載されているらしく、エンジン故障しても無事着陸できる設計にしてあるといった部分がそれ

# ２．暗号利用モード
暗号化する際にどのように定義するか定めている方法
いくつかの構成で成り立つ
- ``ECBモード（Electronic CodeBook mode）``
平文ブロックを単純に暗号化するモード
同じ平文から同じ暗号文が得られる

- ``CBCモード（Cipher Block Chaining mode）``
暗号文ブロックとの排他的論理和を取り暗号化するモード

- ``CFBモード（Cipher Feedback mode）``
暗号化された暗号文ブロックをフィードバックするモード
OFBと違い暗号ブロックをフィードバックして、暗号化した暗号ブロックを利用する

- ``OFBモード（Output Feedback mode）``
暗号化された暗号文ブロックをフィードバックするモード
CFBと違い暗号アルゴリズムで暗号化した初期値を利用して、暗号化したストリームを生成する

- ``CTRモード（Counter mode）``
アルゴリズムを組み合わせて排他的論理和をとって暗号化するモード
PSAppDeployToolkitの使い方 (Function解説その1)

# はじめに

前回に続き、PSAppDeployToolkitの使い方を解説します。
今回は主要Functionを解説してみようと思います。
なお、英語ですが、PSAppDeployToolkit使い方の詳細はPSAppDeployToolkit.pdfの中に詳細に記述されています。

# 利用可能な変数について

上記のPDFの中のToolkit Reference - Variablesに、PSAppDepolyToolkitで利用可能な変数の説明があります。
後々利用しますので、少しだけ紹介しておきます。

## $dirFiles

Filesフォルダのパスです。

## $dirSupportFiles

SupportFilesフォルダのパスです。

# 利用可能なFunctionの一覧

AppDeployToolkitフォルダの中の、AppDeployToolkitHelp.ps1を実行すると英語のヘルプ画面が、一覧表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/697cb869-8c98-1c44-31fd-a115430f7662.png)

PSAppDeployToolkit.pdfの中のToolkit Reference - Functionsのセクションにも同じ記述がありますね。

# 主要Function解説

個人的に、これは面白そうだな、使えそうだなと思ったものを解説してみます。

## Copy-File

ファイルコピーです。一例として以下のような記述がのっています。
SupportFilesの下に保管したファイルをTempディレクトリの下にコピーする例ですね
```
Copy-File -Path "$dirSupportFiles\*.*" -Destination "$envTemp\tempfiles"
```
-Recurseオプションもあるので、再帰的にサブフォルダ下のファイルもコピーできます。

## Execute-MSI

MSI形式のインストーラのインストール、アンインストールなどの行為を実行するものです。

以下のような例がのっています。今はなきFlash PlayerのインストールをTrasnformファイル付きで実行するものです。

```
Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' -
Transform 'Adobe_FlashPlayer_11.2.202.233_x64_EN_01.mst' -Parameters '/QN'
```
アンインストールはMSIのproduct codeを利用して以下のように行います。
```
Execute-MSI -Action 'Uninstall' -Path '{26923b43-4d38-484f-9b9e-de460746276c}'
```

## Execute-Process

主にexeファイル形式のインストーラを実行するためのものです。各種パラメータを指定して起動時の動作を変えます。
こちらの例では、setup.exeを/sをつけて実行、Hidden指定なので非表示で起動されます。

```
Execute-Process -Path "$dirFiles\Bin\setup.exe" -Parameters '/S' -WindowStyle 'Hidden'
```

実行ファイルがFilesフォルダ直下に保管されている場合には、-Pathの次にはファイル名のみでOKのようです。
また、-WorkingDirectoryを利用すると、実行時の作業ディレクトリを指定することもできます。
面白いオプションとして、-SecureParametersをTrueに指定すると、パラメータの情報をログ上に記載しないようにするそうです。センシティブな情報が含まれる場合には便利ですね。
PSAppDeployTooklkitでは、ログに関してもかなり有用な情報が出力されるので、別途説明したいと思います。

## Exit-Script

終了にあたりクリーンアップを行いつつ、終了コードを返すことができます。

```
Exit-Script -ExitCode 1618
```

## Get-FileVersion

指定したファイルのバージョン情報を取得します。
インストールしているアプリのバージョンを知りたい時に簡単にできますね。

```
Get-FileVersion -File "$envProgramFilesX86\Adobe\Reader 11.0\Reader\AcroRd32.exe"
```

## Get-InstalledApplication

これも便利そうですね、インストール済アプリケーションを取得します。
名前、発行元、バージョン、アンインストールストリングなどを取り出すことができます。
指定する名前のところは、ワイルドカード表現も利用できるようなので、こういう感じの名前のアプリケーションを取得して、順番にアンインストールといったようなこともできそうですね。

```
Get-InstalledApplication -Name 'Adobe Flash'
```

## Get-PendingReboot

セキュリティパッチの適用などでWindows自体が再起動待ちになっているかどうかを判定します。
この状態でアプリインストールしようとしてもうまくいかない事ありますね。事前にチェックして、再起動待ちなら、先に再起動して。。というメッセージ表示などが可能になりますね。


結構Functionありますね。続きはその２で。。
【Xcode】新規作成するファイルの先頭（ヘッダー）の内容をカスタマイズする

## やりたいこと
Xcodeで新規作成したSwiftファイルの先頭(ヘッダー)には、以下のようなテンプレート情報が自動挿入されます。
```swift:ContentView.swift
//
//  ContentView.swift
//  project
//
//  Created by ＊＊＊＊ on 2023/05/28.
//
```
＊＊＊＊にはユーザー名が入ってるかと思います。
そこで先頭（ヘッダー）のテンプレート情報を編集したい場合の方法です。

## 環境
Xcode 14.3
MacOS Ventura 13.3.1

## 手順
### 1.Xcodeのユーザーデータを保管する場所に移動
ターミナルでディレクトリを移動します
```zsh
cd ~/Library/Developer/Xcode/UserData/
```
:::note
ここに格納されたテンプレート情報をXcodeは自動で参照します。
:::
### 2.IDETemplateMacros.plistを作成する
ターミナルで以下を入力し、ファイルを作成します。
```zsh
vi IDETemplateMacros.plist
```
:::note
viもしくはvimはvimというターミナルで使えるテキストエディタでファイルを開くコマンドです。
:::

### 3.ヘッダーのテンプレート情報を編集
##### ①`i`を押してエディタをインサートモード(テキストを編集できる状態)にします。
##### ②以下をコピペします。
```vim
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>FILEHEADER</key>
    <string>
//  ___FILENAME___
//  ___TARGETNAME___
//
//  Created by ___FULLUSERNAME___ on ___DATE___.
//</string>
</dict>
</plist>
```
上記はXcodeのデフォルト設定と同じ設定です。
`___FILENAME___`：現在のファイル名
`___TARGETNAME___`：プロジェクト名
`___FULLUSERNAME___`：MacOSにログインしているユーザー名に置換されます。
`___DATE___`：作成日。

`_`３つで囲むと、日付やプロジェクト名などを自動展開してくれます。
必要に応じて内容を変更することで、ヘッダー部分をカスタマイズできます。

※デフォルトで使用できるマクロは以下の種類があります。
[Text macros reference](https://help.apple.com/xcode/mac/9.0/index.html?localePath=en.lproj#/dev7fe737ce0)

任意の値を設定することも出来るので、例えば今回は`New File`というvalueを設定してみます。
```vim
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>FILEHEADER</key>
    <string>New File</string>
</dict>
</plist>
```
##### ③インサートモードを終了するため、`escキー`を押します。
##### ④`:wq`と入力し、Enterキーを押してvimの内容を保存します。

これで次回からXcodeでファイルを新規作成した際、ヘッダーに表示される文字は以下のようになります。
```swift:ContentView.swift
//New File
```
:::note warn
行頭の // は自動挿入されます。
:::
お疲れ様でした。
matplotlibでグラフ生成して損失関数の可視化を目指そう

matplotlibとは
---
こんにちはchihiroです。
ディープラーニングを学習をしていると、ほぼ必ず目につく「損失関数」。
活性化関数はだいたい直線ではなく、数がぐにゃぐにゃと曲がった連続した関数なので、容易に最小値を求めるのは難しいです。
だったらせめて自分で作った損失関数はグラフにしてみれたらいいよねと思い、今回は関数をグラフに出力するmatplotlibを紹介させていただきます。



matplotlibの公式ページです。
簡単な使用方法、APIドキュメントが載っています
https://matplotlib.org/

## 

### 準備

pythonを入れている方ならターミナルでpipを使えばすぐインストールできます。


```terminal
pip install matplotlib          
```
インストールできない場合はpipのバーションが古い可能性があるので、以下のコマンドを入力して最新のバージョンに変えて、先ほどのインストールのコマンドを実行してみてください。

```terminal
python -m pip install --upgrade pip 
```

matplotlibを使用する際は、import文がいるので、ファイルの頭にimport文を入れておきます

```python
import matplotlib.pylab as plt
```

ただvscodeでインポートを書いても下の画像みたいに黄色線が出ますね。。。
もしかしたらmatplotlib自体とpythonのバージョンに問題があるのかもしれません。
今の所matplotlibは問題なく使えています。
<img width="400" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123825/70a49705-3e3b-4524-f9b9-5f1ed9a4f20c.png>


## グラフを書いてみる
基本的にグラフを出力するまでに
- 関数の定義
- 引数の変数を用意して代入
- グラフの縦横のラベルをつける
- matplotlibへプロット
- 出力

の工程があります。簡単なグラフを出力してみましょう。
```python
import numpy as np#NumPyの利用
import matplotlib.pylab as plt

def function_1(x):
    return 0.1*x**2 + x     #f(x) = 0.1x^2 + x

x = np.arange(0.0, 10.0, 0.1) #0から10まで0.1刻み
y = function_1(x)             #代入
plt.xlabel("x")               #xラベル
plt.ylabel("f(x)")            #yラベル
plt.plot(x, y)                #プロット
plt.show()                    #グラフ表示

```

ここでは行列を利用できるNumPyをインポートしています。これはmatplotlibとは別にインストール(ターミナルで pip install numpy)が必要です。

引数が一つの定数だけだと、f(x)の値も一つしか出てこないので、np.arange(0.0, 10,0, 0,1)で引数を100個錬成しています。


出力すると以下のように青色のグラフが出てきます
![スクリーンショット 2023-05-28 16.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123825/2d2c8c89-87d7-e2c4-453d-85bdd72d1297.png)

## まとめ
例が簡単なグラフでしたが、実際にディープラーニングで使う損失関数となると、そもそも最小値がありそうな位置がどこなのか分からんわという関数もあると思うので、教材で出た関数の答え合わせみたいなものに使うのもいいですね。

## 参考文献
https://amzn.asia/d/iuC6sDG
[翻訳] LangChainで使用するコンセプト

[Concepts — 🦜🔗 LangChain 0\.0\.181](https://python.langchain.com/en/latest/getting_started/concepts.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

LLMアプリケーションを構築する際によく使用されるコンセプトと用語があります。それぞれのコンセプトが初めて導入された外部論文やソースへのリファレンスと、それぞれのコンセプトがLangChainで使用されている場所へのリファレンスが含まれています。

# 思考のチェーン

`Chain of Thought (CoT)`は、一連の中間的な理由づけステップを生成するようにモデルに指示を行うために使われるプロンプトテクニックです。これを導き出すやや砕けた方法には、プロンプトにおける「ステップバイステップで考えてみましょう」が含まれます。

- [Chain\-of\-Thought Paper](https://arxiv.org/pdf/2201.11903.pdf)
- [Step\-by\-Step Paper](https://arxiv.org/abs/2112.00114)

# アクションプラン生成

`Action Plan Generation`は、言語モデルに実行すべきアクションを生成させる際に使用するプロンプトテクニックです。後続のアクションを生成するために、これらのアクションの結果をモデルにフィードバックすることもできます。

- [WebGPT Paper](https://arxiv.org/pdf/2112.09332.pdf)
- [SayCan Paper](https://say-can.github.io/assets/palm_saycan.pdf)

# ReAct

`ReAct`はアクションプラン生成とChain-of-Thoughtプロンプトを組み合わせるプロンプトテクニックです。これには、取るべきアクションをモデルに考えさせ、実行させることが含まれます。

- [Paper](https://arxiv.org/pdf/2210.03629.pdf)
- [LangChain Example](https://python.langchain.com/en/latest/modules/agents/agents/examples/react.html)

# Self-ask

`Self-ask`はchain-of-thoughtプロンプトの上に構築されるプロンプト手法です。この手法では、モデルは明示的に自分自身にフォローアップの質問を行います。これは、外部検索エンジンによって回答されます。

- [Paper](https://ofir.io/self-ask.pdf)
- [LangChain Example](https://python.langchain.com/en/latest/modules/agents/agents/examples/self_ask_with_search.html)

# プロンプトのチェーン

`Prompt Chaining`は、複数のLLM呼び出しを組み合わせ、あるステップの出力が次の入力となります。

- [PromptChainer Paper](https://arxiv.org/pdf/2203.06566.pdf)
- [Language Model Cascades](https://arxiv.org/abs/2207.10342)
- [ICE Primer Book](https://primer.ought.org/)
- [Socratic Models](https://socraticmodels.github.io/)

# Memetic Proxy

`Memetic Proxy`は、モデルが理解し、該当するタイプのレスポンスを生成するコンテキストを通じた議論を特定の方法でフレーミングすることで、LLMに反応するように指示をします。例えば、生徒と先生の会話などです。

- [Paper](https://arxiv.org/pdf/2102.07350.pdf)

# 自己一貫性

`Self Consistency`は、広範な理由づけのパスのセットをサンプリングし、最も一貫性のある回答を選択するデコーディング戦略です。Chain-of-thoughtプロンプトと組み合わせると最も効果的です。

- [Paper](https://arxiv.org/pdf/2203.11171.pdf)

# インセプション

`Inception`は`First Person Instruction`とも呼ばれます。プロンプトにモデルのレスポンスの最初を含めることで、モデルに特定の方法で考えるように指示します。

- [Example](https://twitter.com/goodside/status/1583262455207460865?s=20&t=8Hz7XBnK1OF8siQrxxCIGQ)

# MemPrompt

`MemPrompt`は、エラーとユーザーフィードバックのメモリーを維持し、間違いの繰り返しを防ぐためにそれらを活用します。

- [Paper](https://memprompt.com/)
ここはinterfaceだけで良くない？？って思ったけど、genericsも併用して良かった話

## はじめに
なんかすごいタイトル長くなってしまいましたが、タイトルのままの記事です。
「genericsを使ってみたいと思って、いざ使ったらinterfaceだけで解決できそう」と思ったら実はgenericsが有効だったという経験をしたので記事にしてみました。
どんな場面なのかで有効だったのか、サクッとみていこうと思います！

## 結論interfaceのsliceを使った処理に有効
サンプルコードを作ってみたので、少しみていきます！
```go:main.go
package main

import "fmt"

type Product interface {
	GetID() int
}

// ClockはProductを実装
type Clock struct {
	ID int
}

func (c *Clock) GetID() int {
	return c.ID
}

// TableはProductを実装
type Table struct {
	ID int
}

func (t *Table) GetID() int {
	return t.ID
}

// Productの重複判定処理
func isDuplicated[T Product](t []T) bool {
	dupMap := map[int]struct{}{}
	for _, v := range t {
		if _, ok := dupMap[v.GetID()]; ok {
			return true
		}
		dupMap[v.GetID()] = struct{}{}
	}
	return false
}

func main() {
	if isDuplicated(clocks) {
		fmt.Println("clockは重複しています")
	}
	if isDuplicated(tables) {
		fmt.Println("tableは重複しています")
	}
}

var clocks = []*Clock{
	{ID: 1},
	{ID: 1},
	{ID: 3},
}

var tables = []*Table{
	{ID: 1},
	{ID: 2},
	{ID: 3},
}
```

Productが重複しているのか判定することが目的のコードですね。
ClockとTableはどちらもProduct interfaceを実装しているので、最終的にはClockやTableが重複しているかチェックすることを目指しています。

idDuplicated関数について、genericsを用いて引数にはProductのsliceがくるようにしています。
コードは以下の部分ですね。

```go
func isDuplicated[T Product](t []T) bool {
	dupMap := map[int]struct{}{}
	for _, v := range t {
		if _, ok := dupMap[v.GetID()]; ok {
			return true
		}
		dupMap[v.GetID()] = struct{}{}
	}
	return false
}
```

この部分について、
```go
func isDuplicated(t []Product) bool
```
のようにInterfaceのsliceを引数の型にして、実装しても問題ないように思えます。ていうか僕は思っていました。

ただこうしてしまうと以下のようなコンパイルエラーが発生してしまいます　。
```bash
cannot use clocks (variable of type []*Clock) as type []Product in argument to isDuplicated
cannot use tables (variable of type []*Table) as type []Product in argument to isDuplicated
```

`*Clock`や`*Table`はProductを実装しているのに、sliceになると異なる型を判定されてしまいます。
genericsではこの問題を解決することができます。
`func isDuplicated[T Product](t []T) bool`の部分で引数に`clocks`を入れると、[]Tは[]*Clockと判定されてコンパイルしてくれるみたいですね！

**＜補足＞**
以下のようにProductのsliceにClockやTableをappendで入れていく分には問題ありません。
```go
pros := []Product{}
pros = append(pros, &Clock{
    ID: 1,
})
pros = append(pros, &Table{
    ID: 1,
})
```

## おわりに
今回はinterfaceのsliceについて、genericsを使ってうまく処理する方法を見てきました。
もしinterfaceのsliceの扱いに困っていた方がいらっしゃったらぜひこの方法も検討してみてください！
最後まで読んでいただきありがとうございました！
groupingについて

# はじめに
DB操作で有名なgrouping。実は奥が深いかも？って感じたので
まとめてみる。私的なメモな感じです。

# groupingって？
ではそもそもgrouingって何？
グルーピングは、SQLとかDB操作のプログラミングにおけるメソッドのうちの一つ。
簡単に言うと文字から推測できるようにグループにすることを指す。表現を変えると組み分けともいえる。

リンゴ、みかん、ほうれん草、ニンジン、イチゴ　と食べ物があった場合

野菜：ほうれん草、にんじん
果物：りんご、みかん、イチゴ

にわけグループで考えていくことを指している。

# 応用例？
自分なりにこれもグルーピング？の応用で使えるかなぁと思ったことを記載してみる。

例えば、小数点以下を含む数字の場合

```
5.5  5.6  5.9 6.1  7.8
```

と数字があった場合、床関数(Or 天井関数) で処理すると
```
⌊ 5,5 ⌋ = 5　　　　　→ 5 のグループへ寄せらせる   
⌊ 5,6 ⌋ = 5　　　　　→ 5 のグループへ寄せらせる 
⌊ 5,9 ⌋ = 5　　　　　→ 5 のグループへ寄せらせる 
⌊ 6,1 ⌋ = 6　　　　　→ 6 のグループへ寄せらせる 
⌊ 7,8 ⌋ = 7　　　　　→ 7 のグループへ寄せらせる
```
と各数値が各数値のグループへと組み分けされた。ちなみに、四捨五入も丸め誤差も切り捨ても同じ操作になると感じている。整数値からはみ出したものを寄せることで処理できるグルーピング操作の一種の側面を持つ。


また文字列のひらがなから漢字へ変換についても同じような印象を受ける。

```
わたし　は　いぬ　　
　私　　は　犬　　
```


ひらがなの"わたし"は、漢字の"私"へとグループ（まとめられ）に変換され、ひらがなのいぬは漢字での"犬"にグループ（まとめられ）に変換される。

ちょっと遊んで試しに、”試験”を例にとって配列化してみると、

```　　
　　　 　し　     け　     ん
試1　 [0][0]   [0][1]   [0][2]
験1   [1][0]   [1][1]   [1][2]
験2   [2][0]   [2][1]   [2][2]

```
漢字の”験”は、ひらがなの数に合わせるため２個に分解してみた。
ひらがなと漢字両方を使い分ける日本語ならではの世界観かも。

漢字をふりがなに分解することで、集合における全体と要素の関係になる。
（文字列における切り捨てや四捨五入みたいな操作があるとおもろくなるのかも。）

何か応用できたら面白いな。
EC2の管理はこれで決まり！

SSM DHMCについて
---
SSM DHMC(AWS Systems Manager Default Host Management Configuration)
2023年2月にリリースされたサービスですが
今後のEC2管理はこの機能を使っていくことになると筆者は予想しております。

というのも、この機能が実装されたことで
EC2にIAMロール(インスタンスプロフィール)を付与しなくても
デフォルトでSystemsManagerからEC2が管理できるようになるという優れものです。

なんでそれが優れているかって？
EC2に付与できるIAMロール(インスタンスプロフィール)は1つのため
今までは1つのIAMロールに複数のIAMポリシーを付与して運用が煩雑化していました。
- インフラ視点で必要なSystems Manager(SSM)のアクセス
- 業務アプリ視点で必要なS3やEFSへのアクセス

1つのIAMロールに上記のような複数のIAMポリシーをエントリすることで
簡単に権限の変更ができず、各方面への調整等に無駄な労力を使っていました。

ところがDHMCを利用することにより、EC2に付与するIAMロールには
インフラ視点で必要なSSM権限を付与する必要がなくなったのです！

これで業務アプリ要件でのポリシー変更にも柔軟に対応しやすくなったというお話です。

今回はそんなSSM DHMCについてのメリットと設定方法についてご紹介します。

---
メリット
---
- EC2がSystemsManager管理下になるためプライベートサブネットに設置しているEC2に対してフリートマネージャ経由でのアクセスが可能になる
- SSM Agentのバージョンアップが自動化される

などがあげられます。

---
設定方法
---
設定もすごく簡単！以下２点のみ。
１．IAMロール作成
２．デフォルトのホスト管理設定の有効化

では順に説明します。

---
１．IAMロール作成
---

１．IAMロール作成
　　マネジメントコンソールよりIAMを選択し
　　[ロール]画面より「ロールを作成」を押下します。

![ロール作成1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840619/2b0edb6c-d858-0c75-1c54-c9c19e75ddfe.jpeg)

２．信頼されたエンティティを選択
　　ユースケースより「Systems Manager」と入力し
　　出てきた選択肢から「Systems Manager」を選択して「次へ」を押下
![ロール作成2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840619/5d1166c0-7c65-07fe-c0f0-b4aea40fcc9c.jpeg)

３．許可ポリシーの選択
　　DHMC用にAWSが用意してくれている
　「AmazonSSMManagedEC2InstanceDefaultPolicy」を選択して「次へ」を押下
![ロール作成3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840619/0a94bef9-52cf-02f9-ab20-e5411b30704f.jpeg)

４．ロール名入力
　　適当にわかりやすいロール名を付けて「ロールを作成」を押下
![ロール作成4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840619/da0507a9-9b15-9c01-cd95-0ff792b8da21.jpeg)


---
２．デフォルトのホスト管理設定の有効化
---
１．Systems Managerへ遷移
　　マネジメントコンソールより「Systems Manager」を選択し
　　Systems Managerの画面へ遷移

２．フリートマネージャ画面よりデフォルトのホスト管理画面を起動
　　[アカウント管理]を選択し「デフォルトのホスト管理設定の構成」を押下
![フリートマネージャ1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840619/e3daff26-afd6-6fd6-9549-a876b4e4fb56.jpeg)

３．デフォルトのホスト管理設定を有効にする
　　デフォルトのホスト管理設定を有効にするをクリックして
　　バーを右へスライドさせ、IAMロールのプルダウンより先ほど作成した
　　IAMロールを選択して「設定」を押下
![フリートマネージャ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840619/45d3736c-316c-d0a3-c51b-4f3e9e88ec9a.jpeg)


以上でSSM DHMCの設定は完了です。

注意：SSM DHMCの前提条件として
SSM エージェント バージョン 3.2.582.0 以降である必要があります。
上記よりも古いバージョンではご利用できない点に注意が必要です。

その場合は別途SSMエージェントバージョンアップを実施してから
DHMC戦略を利用する必要があります。

コメントやいいねをいただけると励みになりますのでお願いいたします。
YOLOv8のクラス名リスト

# 概要
YOLOv8で物体検出する際に引数のclassesを調べた.

# 環境
Windows 11 Pro
Python 3.10.1
torch 2.0.1+cpu

# 背景
次のようにYOLOv8の既存モデルをCLI上で推論だけすると, デフォルトで様々なクラスラベルにより物体が検出される. 
```python:
yolo predict model=yolov8x.pt source=source
```

対象物体に主にラベリングされたクラスだけを抽出して再度推論させたかったため```classes = []```にクラスに対応する数値を入力する必要があったが, それの対応表がドキュメントのどこにあるか分からなかった！（知ってる方いたら教えてください）

# やったこと&結果
・[YOLOv8で物体検出モデルを試してみた](https://qiita.com/super_toughguy/items/b306d4db8724bb46863d)
を参考に適当にmodelに画像を読み込ませて ```results``` から読み取る.
```python:
from ultralytics import YOLO
model = YOLO("yolov8x.pt")
#bus.jpgをカレントディレクトリに置いたがそうでない場合は適当なpathを指定
path = ""
results = model.predict(source=path+"bus.jpg", save=True)
results[0].names
```
結果は次の通り.
```Python:
{0: 'person',
 1: 'bicycle',
 2: 'car',
 3: 'motorcycle',
 4: 'airplane',
 5: 'bus',
 6: 'train',
 7: 'truck',
 8: 'boat',
 9: 'traffic light',
 10: 'fire hydrant',
 11: 'stop sign',
 12: 'parking meter',
 13: 'bench',
 14: 'bird',
 15: 'cat',
 16: 'dog',
 17: 'horse',
 18: 'sheep',
 19: 'cow',
 20: 'elephant',
 21: 'bear',
 22: 'zebra',
 23: 'giraffe',
 24: 'backpack',
 25: 'umbrella',
 26: 'handbag',
 27: 'tie',
 28: 'suitcase',
 29: 'frisbee',
 30: 'skis',
 31: 'snowboard',
 32: 'sports ball',
 33: 'kite',
 34: 'baseball bat',
 35: 'baseball glove',
 36: 'skateboard',
 37: 'surfboard',
 38: 'tennis racket',
 39: 'bottle',
 40: 'wine glass',
 41: 'cup',
 42: 'fork',
 43: 'knife',
 44: 'spoon',
 45: 'bowl',
 46: 'banana',
 47: 'apple',
 48: 'sandwich',
 49: 'orange',
 50: 'broccoli',
 51: 'carrot',
 52: 'hot dog',
 53: 'pizza',
 54: 'donut',
 55: 'cake',
 56: 'chair',
 57: 'couch',
 58: 'potted plant',
 59: 'bed',
 60: 'dining table',
 61: 'toilet',
 62: 'tv',
 63: 'laptop',
 64: 'mouse',
 65: 'remote',
 66: 'keyboard',
 67: 'cell phone',
 68: 'microwave',
 69: 'oven',
 70: 'toaster',
 71: 'sink',
 72: 'refrigerator',
 73: 'book',
 74: 'clock',
 75: 'vase',
 76: 'scissors',
 77: 'teddy bear',
 78: 'hair drier',
 79: 'toothbrush'}
```
これにより例えばperson, truck, hot dogだけを検出したい場合はCLI上で次のようにすればいい.
```python:
yolo predict model=yolov8x.pt source=source classes=[0, 7, 52]
```
# 余談
```stream=True``` の場合はgeneratorが返ってくるよう. 最初こっちでやっててエラーをChatGPTに投げてnext関数というものを知りました.
```python:
results = model.predict(source=path+"bus.jpg", stream=True)
result = next(results)
result.names
```
PHPにおいて配列の型を明示する簡易的な3つの方法

# PHPにおいて配列の型を明示する簡易的な3つの方法

PHP(8.2)において配列の型が相変わらず明示しづらく使いづらかったので、調べてみました。
https://qiita.com/suin/items/a9ff73591b6e77c133e9
のような記事がありましたが、もっと簡易的な方法で3つ挙げていきます。

1. PHPDoc形式で型を明示する
2. 配列の中身をオブジェクトにする
3. 可変長引数を使う 

## PHPDoc形式で型を明示する

```php
/**
 * @param array<int> $array 整数型の配列
 */
function foo(array $array) {
    // ...
}
```

## 配列の中身をオブジェクトにする

```php
class Foo {
    public int $bar;
}

/**
 * @param Foo[] $array Fooオブジェクトの配列
 */
function foo(array $array) {
    // ...
}
```

## 可変長引数を使う

```php
class Foo {
    public int $bar;
}

/**
 * @param Foo ...$array Foo型の可変長引数
 */
function foo(Foo ...$array) {
    // ...
}
```

## 要約

PHPDocをこねくり回すしかないかと思っていましたが、可変長引数で簡易的に配列の型を指定できます。
便利ですね！



## 参考

- [配列 php.net](https://www.php.net/manual/ja/language.types.array.php)