OmniAICreator/Qiita-1.07M huggingface dataset:
ダウンロードフォルダの中身をきれいに分別したくなった時に作ったスクリプト

ダウンロードフォルダは、時間が経つと様々なファイルで溢れかえりがちです。このスクリプトは、ファイルを拡張子に基づいて適切なフォルダに自動的に分類し、ダウンロードフォルダを整理するのに役立ちます。

```python:script.py
import os
import shutil
from pathlib import Path

def organize_folder(target_folder, exclude_files):
    # ファイルタイプに応じたフォルダ名
    folders = {
        "Images": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".ico"],
        "Audio": [".mp3", ".wav", ".flac", ".aac", ".ogg", ".wma"],
        "Video": [".mp4", ".mkv", ".flv", ".avi", ".mov", ".wmv"],
        "Documents": [".pdf", ".docx", ".doc", ".xlsx", ".xls", ".ppt", ".pptx", ".txt", ".md", ".csv"],
        "Archives": [".zip", ".rar", ".7z", ".tar", ".gz", ".bz2"],
        "Executables": [".exe", ".msi", ".jar", ".bat", ".sh"],
        "Code": [".py", ".js", ".html", ".css", ".c", ".cpp", ".java", ".go", ".rb", ".php"],
        "Others": []
    }

    for filename in os.listdir(target_folder):
        if filename in exclude_files:
            continue
        file_path = target_folder / filename
        if file_path.is_file():
            ext = file_path.suffix
            moved = False
            for folder, extensions in folders.items():
                if ext in extensions:
                    dest_folder = target_folder / folder
                    dest_folder.mkdir(exist_ok=True)
                    shutil.move(str(file_path), str(dest_folder / filename))
                    print(f"Moved {filename} to {folder}")
                    moved = True
                    break
            if not moved:
                dest_folder = target_folder / "Others"
                dest_folder.mkdir(exist_ok=True)
                shutil.move(str(file_path), str(dest_folder / filename))
                print(f"Moved {filename} to Others")

if __name__ == "__main__":
    try:
        # スクリプトがある場所を取得
        script_location = Path(os.path.abspath(__file__)).parent
        script_name = os.path.basename(__file__)
        organize_folder(script_location, exclude_files=[script_name])
    except Exception as e:
        print(f"An error occurred: {e}")

```

# スクリプトの概要

このスクリプトは、指定したフォルダ内のファイルを拡張子に応じて分類し、関連するサブフォルダに移動します。例えば、画像ファイルは「Images」フォルダに、音楽ファイルは「Audio」フォルダに、文書ファイルは「Documents」フォルダに、という具合です。

# スクリプトの主な機能

- **拡張子に基づく分類**: ファイルは、事前に定義された拡張子リストに基づいて分類されます。
- **自動フォルダ作成**: 対象となるファイルタイプのフォルダが存在しない場合、自動的に作成されます。
- **除外リスト**: 特定のファイルを整理対象から除外する機能を提供します。これにより、スクリプト自体やその他の重要なファイルが移動されることを防ぎます。

# スクリプトの使い方

1. **ターゲットフォルダの指定**: スクリプトを実行するフォルダを`target_folder`に設定します
2. **除外ファイルの設定**: `exclude_files`リストに、移動させたくないファイルの名前を追加します
3. **スクリプトの実行**: スクリプトを実行すると、指定されたフォルダ内のファイルが適切なサブフォルダに移動されます

# スクリプトのカスタマイズ

フォルダ名や対応するファイルタイプは、`folders`辞書を編集することで簡単にカスタマイズできます。新しいファイルタイプを追加したい場合や、フォルダの構成を変更したい場合に便利です。

# まとめ

このスクリプトは、ダウンロードフォルダを簡単かつ効率的に整理するための強力なツールです。カスタマイズが容易であるため、個々のニーズに合わせて調整してきれいに分別してみてください。
GCPのIAMの入門の入門

# はじめに
[GCPのIAM](https://cloud.google.com/iam/docs/overview)って難しいですよね。私には難しかったです。何故難しいのかを考えると、概念とそれらの関係性を理解するのが難しいからだと思います。
このブログではIAMの利用方法は置いておいて、概念の関係性について説明できればと思っています。
# このブログで書くこと、書かないこと
このブログでは以下の用語の簡単な説明と、それらの関係性について記述します。

* Principal
* Resource
* Permission
* Role
* Role binding
* Allow policy

また、このブログでは具体的なサービスアカウントの作成方法やサービスアカウントキーの作成方法などは記述しません。このブログはサービスアカウントの作成やサービスアカウントキーの作成を覚える前に、どういうものができるのか覚え、その後の学習に繋げる事を目的としています。

また正確な理解より、ざっくりとどういう関係なのかを具体的な用語で説明していきます。

# 簡単な用語の説明
## Principal、 Resource、Permission
まずはPrincipal、Resource、Permissionの簡単な説明です。これらの3つはそれ単体で存在します。他の要素はこれら3つの関係を表す要素になります。このためまずこの3つを簡単に説明します。

| 用語 | 説明 |
| :-- | :-- |
| Principal | アカウントのようなものです。 色々ありますが、とりあえずアカウントだと思ってください。|
| Resource | [Resource](https://cloud.google.com/iam/docs/overview#resource) はGoogle Cloudのサービス。例えばCompute EngineやCloud Pub/Subなどです。 |
| Permission |[Permission](https://cloud.google.com/iam/docs/overview#permissions)は各Resourceに対する許可を表すものです。例えば `pubsub.subscriptions.consume` というPermissionがあります。これは Cloud Pub/Sub の subscription への consume を許可するというものです。 |

## Role

[Role](https://cloud.google.com/iam/docs/overview#roles)はPermissionの集合です。

IAMでは Principal(アカウント) に直接 Permission を付与しません。かわりに Principal に Role を付与します。このような形式を [RBAC(ロールベースアクセス制御)](https://ja.wikipedia.org/wiki/ロールベースアクセス制御)といいます。

Permission ではなく Role を付与することで柔軟性と使い易さを実現しています。例えば[Pub/Subのロール一覧](https://cloud.google.com/pubsub/docs/access-control?hl=ja#roles)にある `roles/pubsub.editor` ロールをみていただくと 32 個の Permission が付与されています。Permissionを直接するとこの 32 個を管理しなければなりません。逆に `roles/pubsub.editor` 自体を権限とすると、特定の権限を抜きたいという時に難しくなります。このバランスをとるのためにRoleが存在します。

## Role binding
Principal と付与された Role の対応を Role binding と呼びます。各 Principal には 複数の Role を binding できます。例えば、1つのアカウントで Pub/Sub と Spanner Database を管理したい場合は、そのアカウントに PubSub用の `roles/pubsub.editor` ロールと Spanner 用の `roles/spanner.databaseAdmin` ロールを付与できます。

勿論、各Roleは複数の Principal に付与可能です。 Role と Principal の関係は多対多の関係になります。

## Allow policy
Allow policy は全ての Role binding の集合です。

各 GCP Resource へのアクセスが発生すると、 IAM のチェック機構が Allow policy を確認します。そのチェックの結果、 Resource へのアクセスの可否を決定します。

# Role の付与とチェックの流れ

最後に Role の付与からチェックまでの流れを記載します。

最初に、処理に必要な Permissin を決めます。 この Permission は複数になる可能性があります。

Permission が決ったら、それら Permission をまとめる Role を作成します。ただし実際に Role を作成することはまずありません。 [Predefined roles](https://cloud.google.com/iam/docs/understanding-roles#predefined) という既に定義された Role があるので、それを使う事が殆どです。ちなみに、自作した Role は [Custom roles](https://cloud.google.com/iam/docs/roles-overview#custom) と呼ばれます。

付与する Role が決まったら、 Principal に付与します。 [Service account](https://cloud.google.com/iam/docs/service-account-overview) に付与するのが一般的です。

付与した時点で Role binding が作成されます。また同時にその Role binding は Allow policy に含まれます。実際には Allow policy に含まれるまでに少し時間がかかるみたいです。

最後に Role を付与した Principal から GCP Resource にアクセスすると、 IAM が Allow policy を確認してアクセスの可否を決定します。

# 最後に

どうでしょう？ざっくりとわかりましたか？なんと無くでもなにか分かってもらえれば幸いです。なにか分かったことがあったら再度[オフィシャルドキュメント](https://cloud.google.com/iam/docs/overview)を読みましょう。正確な知識を得る一助になれば幸いです。
aliasでzsh:bad assignmentの対処法

## zshコマンドでbad assignmentと出力されるケース
windowsのコマンドプロンプトではclsがclearに相当していたので以下のようなエイリアスを組もうとするとエラーが出る.
```
alias cls = 'clear'
zsh:bad assignment
```
これは＝の両端に空白を開けたことによる影響でエラーが生じている。
そのため、以下のように記述し直せばエラーを起こすことなく実行できる。

```
alias cls="clear"
```
Unityの音声関連のコンポーネント

# Unityの音声関連のコンポーネント

# [AudioSource](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/AudioSource.html)
プレイヤーの声や、足音、BGMなど、音を鳴らすためのコンポーネント。シーン内に複数存在することができる。

たとえば、あるキャラクターが3種類のセリフを持っている場合に、話しかけるたびにランダムで1つのセリフを再生するようにするには、3つのAudioClipを話しかけるたびにランダムで選択し、それを再生するようにするといった使い方をする。

```csharp
using UnityEngine;
public AudioSource audioSource;
public AudioClip[] audioClipCache;
audioSource.clip = audioClipCache[0]; // 1つ目のセリフを再生
audioSource.Play();
```

`AudioClip`には`Output`というプロパティがあり、`AudioMixerGroup`を指定することができる。これにより、BGMや効果音などを別々のグループに分けて音量を調整することができる。

# [AudioListener](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/AudioListener.html)
プレイヤーの耳の役割をするコンポーネントで、シーン内に1つだけ存在する。たいていの場合、カメラにアタッチされている。

`AudioSource`が3Dサウンドの場合、`AudioListener`からの距離に応じて音量が変わる。

特にスクリプトから操作することはなく、コンポーネントとして存在するだけでよい。

# [AudioMixer](https://docs.unity3d.com/2023.2/Documentation/Manual/AudioMixer.html)

`AudioMixer`は、`AudioSource`の出力をグループ化して、それぞれのグループに対して音量やエフェクトを調整するためのコンポーネント。

たとえば、`BGM`と`SE`という2つのグループがあったとき、次のようにすると`BGM`の音量だけを聞こえなくすることができる。

AudioMixerのパラメーターを操作するには、`AudioMixer.SetFloat`を使う。単位はデシベルなの`Slider`コンポーネントと連動させる場合は、`Mathf.Log10`を使うとよい。

```csharp
using UnityEngine.Audio;
public AudioMixer audioMixer;
public void SetBGMVolume(float volume)
{
    volume = Mathf.Clamp01(volume);
    float decibel = 20f * Mathf.Log10(volume);
    decibel = Mathf.Clamp(decibel, -80f, 0f);
    audioMixer.SetFloat("BGM", decibel);
}
```
PHPでZIPファイル内のCSVファイルをそのまま読み取る

# 結論

:::note info
- [fw3/streams](https://packagist.org/packages/fw3/streams)を`composer require fw3/streams`して使おう。
- **[実装](#実装)** にあるサンプルコードをコピーして必要なところだけ書き換えれば終わり。
:::

:::note warn
- PHP7.2.0未満(下限PHP5.3.3)で解決したい場合は[fw3_for_old/streams](https://packagist.org/packages/fw3_for_old/streams)を利用してください。（`composer require fw3_for_old/streams`）
- [fw3/streams](https://packagist.org/packages/fw3/streams)および[fw3_for_old/streams](https://packagist.org/packages/fw3_for_old/streams)共にPHP8.3.1まで動作確認済みのため、PHP7.2.0以上のシステムの場合はどちらを入れても変わりはありません。
:::

:::note warn
- composerを使用できない環境の場合は、[こちらからZIPファイルをダウンロード](https://github.com/fw3-for-old/streams/archive/master.zip)し、展開して任意のディレクトリにコピーしてください。
- その後、使用対象となる処理より前に`require_once sprintf('%s/src/filters_require_once.php', $path_to_copy_dir);`として`src/filters_require_once.php`を読み込むようにしてください。
:::

# はじめに

2024年時点において、CSVファイルは会社間データ連携によく利用されています。

かねてよりPHPでは **文字コードがShift_JIS(CP932)のCSVファイル** の取り扱いに大変苦労してきました。
この問題については **過去の記事（[PHPで高速・省メモリ・確実に日本語CSVを扱う方法](https://qiita.com/wakabadou/items/84b48ca12f25fb2fb69c)）** において **完全に解決しています。**

一方、データ連携においてCSVファイルをZIPアーカイブにしてデータ連携をはかるケースもあります。
今までは[\ZipArchiveクラス](https://www.php.net/manual/ja/class.ziparchive.php)などを利用して、一度テンポラリファイルを作成し、そのファイルに対してCSVの読み取り処理を行うなどしていました。

ただ、この方法ではテンポラリファイルの作成・維持・削除の管理が必要であり、手間もかかり考えることが増えるため苦痛度が上がっていました。

この記事では **ZIPアーカイブ内のCSVファイル** を **直接透過的** に扱い、**CSVファイルを直接操作しているかのような** 使用感を得られるようにします。

# 実装

**ZIPアーカイブ内にある文字コードがShift_JIS(CP932)のCSVファイル** から **UTF-8** としてデータを吸い出して配列として返す。

```:php
<?php

use fw3\streams\filters\utilitys\StreamFilterSpec;
use fw3\streams\filters\utilitys\specs\StreamFilterConvertEncodingSpec;
use fw3\streams\filters\utilitys\specs\StreamFilterConvertLinefeedSpec;

$rows = StreamFilterSpec::decorateForCsv(function() use ($path_to_zip): array {
    // フィルタの設定：`$path_to_zip`が示すZIPファイル内の`temp/test.csv`にアクセスする例
    $spec   = StreamFilterSpec::resourceZip($path_to_zip, 'temp/test.csv')->read([
        StreamFilterConvertEncodingSpec::toUtf8()->fromSjisWin(),
    ]);

    $rows = [];

    $csvFile    = new \SplFileObject($spec->build(), 'r+b');
    $csvFile->setFlags(\SplFileObject::READ_CSV);

    // ZIPストリームの場合、rewind出来ないためforeachを使用できません。
    // そのため、次の例ではforを利用しています。
    for (;\is_array($row = $csvFile->fgetcsv());) {
        $rows[] = $row;
    }

    return $rows;
});
```

:::note alert
**StreamFilterSpec::decorateForCsv()** 内部でロカールを一時的に変更する処理を行っています。
そのため、この実装例においては **\Generator** を使用することができません。

もし、逐次処理を行いたいのならば、 **\\$rows[] = $row;** の箇所に展開するのが好適です。
:::

たったこれだけで実現可能です。

たのしいZIPアーカイブ内CSVファイルからのデータすいだし。
おわり。
【Github Actions】LaravelのPHP Unitを高速化する方法 【30分→3分に】

# 環境
Laravel 10.x(8.x以上
Github Actions

# 手法1 DatabaseTransactionsを利用する

Laravelではテスト実行後にDBをクリーンにするのに`use RefreshDatabase;`が使われる事が多々あります。
しかし、DBを一度消して再作成するため、時間が結構かかります。
テストがPKに依存していないなら`use DatabaseTransactions`を利用すると高速化が図れます。

これはテスト実行時にトランザクションを貼り、終わったらロールバックしてくれます。

```php:TestCase.php

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
    use DatabaseTransactions; //追記
}

```



# 手法２ paratestを利用する

https://readouble.com/laravel/8.x/ja/testing.html

8.x以降では、`php artisan test --parallel`でプロセス数に応じた並列テストが実行できます。

Github Actionsではデフォルトでprivateリポジトリだと2プロセス利用できる。
それだけで単純計算実行時間が1/2になる。

https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-private-repositories


インストール
```
composer require brianium/paratest --dev
```

AppServiceProviderにてパラレル実行時にsetUpTestDatabaseしたらseedまでするようにしています。

```php:AppServiceProvider::boot
ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
    Artisan::call('migrate', ['--seed' => true]);
});
```

注意点としてはdatabaseの権限ないと、データベース作成できないエラーになるのでrootなりにしておくと良いかと。

# 手法3 GitbhubActionsでMatrixを利用して並列job実行でテストする

単一のジョブ定義で変数を使用して、変数の組み合わせに基づいて複数のジョブ実行できます。
やり方は完全にこちらの記事の通りですが、

https://qiita.com/ProjectEuropa/items/afd871c4a58ad5b22f44

分割数とidを定義して、その数にテストを分割しています

```yaml:ci.yaml
matrix:
    parallelism: [5]
    id: [0,1,2,3,4]

~ /// ~~

- name: Run Tests
  run: |
    find tests/ -name '*Test.php' | sort | awk "NR % ${{ matrix.parallelism }} == ${{ matrix.id }}" | xargs php ./create_multithread_phpunit_xml.php
    ./vendor/bin/phpunit --configuration ./ci_phpunit.xml
```

# 結論

手法1 ~ 3を組み合わせる
jobで並列にして、その中でプロセスを複数でテストする
テスト自体は30分から3分程度に短縮できました。composerやmysqlコンテナなどのセットアップいれても全体で5分くらいのワークフローに短縮できました


```yaml

matrix:
    parallelism: [5]
    id: [0,1,2,3,4]

~ /// ~~

- name: Run Tests
  run: |
    find tests/ -name '*Test.php' | sort | awk "NR % ${{ matrix.parallelism }} == ${{ matrix.id }}" | xargs php ./create_multithread_phpunit_xml.php
     php artisan test --parallel --configuration ./ci_phpunit.xml

```
Node.jsでTCP通信する簡易クライアントとサーバを作ってみた

# はじめに
JavaScriptアプリケーションで簡易的にサーバに接続して状況確認する機能を実装できるか検討する必要があり、調査したところNode.jsの`net`ライブラリを使用することで実現できそうなことが分かった。
しかし、サンプルコード等を調べてみるとクライアントとサーバ間で複数回会話するものはなかった。
そこで、試行錯誤して開発してみた。

# サンプルコード
サーバアプリケーションとクライアントアプリケーションを開発した。

### サーバアプリケーション
```javascript:サーバアプリケーション
const net = require('net');

const sever = net.createServer(socket =>{
    socket.on('data', data => {
        console.log(data + ' from ' + socket.remoteAddress + ":" + socket.remotePort);
        socket.write('Echo: ' + data);
    });
    socket.on('close', () =>{
        console.log('Client closed connection');
    });
}).listen(3000);

console.log('Listening port is 3000');
```

サーバアプリケーションは、クライアントから送られたメッセージの先頭に「Echo:」を付けて返却するECHOサーバとなっている。
クライアントからの待ち受けポートは`3000`番としている。

### クライアントアプリケーション
```javascript:クライアントアプリケーション
const { write } = require('fs');
const net = require('net');

let i = 0;

const client = net.connect('3000', 'localhost', ()=>{
    console.log('connected to server');
    client.write('Hello Server!');
    i++
});

client.on('data', data => {
    console.log('Received: ' + data)

    if(~data.indexOf("!")){
        console.log("continue")
        sendMessage(data)
    }else{
        console.log("break")
        client.end()
    }
    
});

function sendMessage(data) {
    switch(i){
        case 1:
            client.write("second")
            i++
            break;
        case 2:
            client.write("See you")
            i++
            break;
        default:
            client.end()
    }
    return 0
}


client.on('end', () =>{
    client.destroy();
});

client.on('close', () => {
    console.log('Connection is closed')
});
```

 サーバへメッセージ送信した回数をカウントアップして、回数によって送信するメッセージを変えている。
 サーバから受信したメッセージの内容を受けて、メッセージを返すようにしている。
 サーバから返ってきたメッセージの中に「!」が含まれていない場合は、サーバとの通信を切るようにした。
 そのため、サンプルコードは２回目のメッセージを受信したところで通信を終了するようになっている。

 実行結果のログは、次のようになる。
 ```bash:サーバ側
 $ node app.js
Listening port is 3000
Hello Server! from ::1:{$YOUR PORT}
second from ::1:{$YOUR PORT}
Client closed connection
 ```

 ```bash:クライアント側
 $ node app.js
connected to server
Received: Echo: Hello Server!
continue
Received: Echo: second
break
Connection is closed
 ```

 # リポジトリ

 https://github.com/LittleBear-6w6/tcp_communication_sample_nodejs/tree/main
辞書

https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_boss

前回のケースからたぶん辞書と辞書を組み合わせればいいんだとは思ったけど
なかなか理解に骨が折れたのでコメントもつけつつ

```py
p,q,r = map(int, input().split())
#A->B, B->Cの辞書を作成する
A_B = {}
for _ in range(p):
    i, j = map(int,input().split())
    A_B[i] = j
    
B_C = {}
for _ in range(q):
    j, k = map(int,input().split())
    B_C[j] = k

#上の2つを利用してA_Cの辞書を作成
#この場合iは１〜pまででOK
#A_B[i]の値がそのままB_C[j]の値になり、それがそのままA_C[i]に代入
#上のロジックをどう数式にすればいいかわからんかった
A_C = {}
for i in range(1, p + 1):
    A_C[i] = B_C[A_B[i]]
#小さい方から順番なので、iの順番通りでOK
#ここは前回コメントから学んだ通り
for i, k in A_C.items():
    print(i, k)
```
apiリソースを使用したときのルートパラメータの問題。

Laravelにてshowができずにハマってしまいました。

```ModelIdCompleteController.php
public function show(ModelIdComplete $modelid)
  {
    return new ModelIdCompleteResource($modelid);
  }
//ModelIdComplete ...モデル
```

本来showメソッドの引数は（\$modelidcomplete)でしたが、
無駄に長くする必要はないと思い、上記のようにshowメソッドの引数を(\$modelid)と省略したら、showで渡すべきデータベースの値がNullになってしまいました。

調べたところ、apiリソースを使用していると、ルートパラメータの引数設定をLaravelが自動で行ってくれるようで、Controllerでもルーティングで指定したものと同じマイグレーション名に関連する名前でないと認識してくれないようでした。これは「暗黙の結合」と呼ばれており、名前一致によって自動でモデルとデータのやり取りをしてくれているのだそうです。

そこで以下のように省略せず書いたら問題なく動きました。

```ModelIdCompleteController.php
  public function show(ModelIdComplete $modelidcomplete)
  {
    return new ModelIdCompleteResource($modelidcomplete);
  }
```

今回は、未熟さ故に他のコードを参考にしていたら、「同じ構成のはずなのに動かない！？」とハマった出来事でした。
Ubuntu on Windows (WSL) や VM 環境で SWG 製品のクライアントを踏み台にしてプロキシサーバを通りインターネットにアクセスする

# はじめに
今回は Ubuntu on Windows などの WSL や Virtual Machine（VM）など、コンピュータ内の仮想環境から企業などにおける社内のネットワークなどに設置されている SWG 製品のクライアントを踏み台にして外部と通信できるようなやり方を、備忘録として残しておきます。
これによって、社用 PC などからしかアクセスできないようなネットワーク環境でも、社用 PC の中でポートフォワーディングを行うことで、社用 PC にインストールされている Zscaler の ZCC などのクライアントを踏み台にして、仮想環境と外部との通信を可能になります。

![bastion-zcc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1652242/a55eabe5-c99b-e4a2-7f9d-9777900c8ecb.png)

# 投稿者の環境
踏み台とするコンピュータでポートフォワーディングを活用することが本稿におけるミソなのであまり関係ないですが、一応念のために記述。

- Windows 10 Enterprise 22H2
- WSL2 - Ubuntu 22.04 LTS
- プロキシサーバ（SWG）: Zscaler
- **SWG 製品のクライアント（今回なら Zscaler Client Connector）の待ち受けポートは 17200 と既知**

# 手順
1. WSL のインストール（割愛）
2. Windows の WSL アダプタの IP アドレスを `ipconfig` で調べる

   ```sh
   > ipconfig
   （中略）
    イーサネット アダプター vEthernet (WSL):

    接続固有の DNS サフィックス . . . . .:
    リンクローカル IPv6 アドレス. . . . .: fe80::8b89:6755:cb07:dea2%61
    IPv4 アドレス . . . . . . . . . . . .: 172.17.112.1
    サブネット マスク . . . . . . . . . .: 255.255.240.0
    デフォルト ゲートウェイ . . . . . . .:
   ```
   これで、ホストマシンの IPv4 アドレスが 172.17.112.1 と判明
3. Windows でポートフォワーディングの設定
   **管理者権限**のある PowerShell で、以下のコマンドを入力（listenaddr は 2. で判明した IPv4 アドレスを入力）
   
   （注意）
   1. Zscaler などの SWG 製品のクライアント（Zscaler Client Connector）の待ち受けポート番号は 17200 と既知なため、17200 を入力しています。別の SWG 製品をお使いの場合は、それらの待ち受けポート番号に変更してください。
   2. `listenaddr` を全てにする `0.0.0.0` にして、かつ `listenport` を SWG 製品の待ち受けポート番号（今回なら `17200`）にしてしまうとループが起こり接続できなくなりますので、この記事のように送信元アドレスを指定する（`listenaddr` で指定する）か、`0.0.0.0` にした場合は SWG 製品の待ち受けポート番号とは別のポート番号で LISTEN するようにしてください。

    ```sh
    > netsh interface portproxy add v4tov4 listenport=17200 listenaddr=172.17.112.1 connectport=17200 connectaddress=127.0.0.1
    ```
4. 結果が反映されているかを、3\. の PowerShell で確認
   ```sh
   > netsh interface portproxy show all
   ipv4 をリッスンする:         ipv4 に接続する:

    Address         Port        Address         Port
    --------------- ----------  --------------- ----------
    172.17.112.1    17200       127.0.0.1       17200
   ```
5. Windows のファイヤーウォールをあける
   Windows の設定の「Windows Defender ファイアウォール」> 「詳細設定」で、「受信の規則」において新しい規則を追加する。
   
   追加内容: 規則の種類
   - ポート
   - TCPを選択、特定のローカルポート「17200」
   - 接続を許可する
   - この規則はいつ適用しますか？「すべて選択」
   - 名前はお好みで

これで、WSL においてプロキシを設定する際には「172.17.112.1:17200」をプロキシサーバの宛先にすればいけると思います。これでも無理なら SWG の CA 証明書を WSL のゲスト OS に追加。

# ポートフォワーディングを削除するとき
3\. や 4\. でポートフォワーディングを削除する際は、以下のコマンドを実行

```sh
> netsh interface portproxy delete v4tov4 listenport=17200 listenaddr=172.17.112.1
```

# 参考文献
https://kagasu.hatenablog.com/entry/2018/01/29/184205
結婚式ビデオの作成：Canva, ChatGPT, PowerDirector365を使用したアプローチ

結婚式のビデオは、その特別な日の記憶を美しく保存するための重要な要素です。この記事では、Canvaを使ったビジュアルデザインから始め、ChatGPTで画像の説明文を作成し、最後にPowerDirector365で動画編集を行うプロセスを紹介します。

## [無料]Canvaを使ったビジュアルデザイン

### ステップ1: テンプレートの選択
Canvaには様々な結婚式ビデオ用のテンプレートがあります。これらのテンプレートから選び、カスタマイズを始めましょう。
質の高いフォントとイラストがテンプレートで用意されていました。

https://www.canva.com/ja_jp/templates/EAFPun9X4Is/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/f0d22abb-24a7-dec5-702d-fee2c4c66ba5.png)


### ステップ2: 写真とテキストの追加
結婚式の写真や思い出に残る言葉を追加し、ビデオに個性を加えます。

### ステップ3: アニメーションと効果の適用
Canvaでは、テキストや画像にアニメーションや特別な効果を追加することができ、ビデオをより魅力的にします。

## [課金]ChatGPTによる画像の説明文作成

### 概要
- ChatGPTに画像を入れると、それにふさわしい説明文を生成します。
- これにより、ビデオ内の画像に対するコンテキストや情報を提供できます。

### 使用方法
1. ChatGPTに画像をアップロード。
2. 画像に基づいて説明文を生成させます。
3. 口調を調整します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/e4082e6a-6572-e208-0f9b-56d5dd6683a4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/6b00d9d6-c2cb-fc9d-db56-ced10bd3d1ee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/1fec1c35-2514-d672-4749-54c4824f5327.png)




## [無料]PowerDirector365での動画編集

### 概要
- PowerDirector365を使用して、ビデオクリップのカット、トリム、結合などの編集を行います。
- プロフェッショナルな編集機能を備えており、使いやすいです。

### 編集プロセス
1. 必要なビデオクリップをインポート。
2. クリップを編集し、トランジションを加えてビデオを構築します。

### BGMの追加
- フリーの音源を背景音楽として使用し、ビデオの雰囲気を高めます。
- フリー音源なら、気軽にボリュームをいじったり、フェードアウト
 
https://www.youtube.com/watch?v=Zwo-15CkW24


## まとめ
Canvaのビジュアルデザイン機能、ChatGPTの画像説明文生成機能、そしてPowerDirector365の動画編集機能を組み合わせることで、感動的でユニークな結婚式ビデオを作成することができます。これらのツールを活用して、あなたの特別な日の記憶を永遠に残しましょう。
dockerコンテナ内でrails dbconsoleが使えないエラーが出た時の対処法

**概要**
---------------------------------------

DBコンソールを起動しようとDockerコンテナ内で以下コマンドを実行したが，エラーが発生。

```
# rails db
Couldn't find database client: psql. Check your $PATH and try again.
```

rails dbコマンドを実行したときにPostgreSQLのクライアントであるpsqlが見つからないときに表示されるとのこと。
Dockerfileを訂正し，PostgreSQLをインストールする必要がある。





**解決策**
--------------------------------------------
Dockerfile
```rb
FROM ruby:3.1.4
RUN curl -sL https://deb.nodesource.com/setup_19.x | bash - \
&& wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update -qq \
&& apt-get install -y build-essential libpq-dev nodejs yarn
RUN mkdir /app
(以下略)
```
接続用のクライアントアプリケーション記載がなかったため，`postgresql-client`を追加記載する。

```rb
FROM ruby:3.1.4
RUN curl -sL https://deb.nodesource.com/setup_19.x | bash - \
&& wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update -qq \
&& apt-get install -y build-essential libpq-dev nodejs yarn postgresql-client  ←追加
RUN mkdir /app
```

Dockerイメージを再ビルドする。

docker-compose buildコマンドを実行して、Dockerfileの変更を反映させる。
再度docker-compose run web rails dbconsoleを実行する。






**参考にさせていただいた記事**
https://qiita.com/ryosk7/items/077ea98a88ec3df289c8
2024-01-31 `form` の `action` と別に設定した `submit` ボタンの `formaction` を取得する

## はじめに

formで設定された `action` とは別の action(`formaction`) が設定された `submit` ボタンがある中で、クリックされた送信ボタンの `formaction` を取得したい。

```html
<form method="post" name="sample" action="/main-submit">
  <button type="submit" name="B" formaction="/sub-submit">これを取得したい(別の送信ボタン)</button>
  <button type="submit" name="A">送信</button>
</form>

<button name="C" type="button">フォーム外の送信ではないボタン</button>
  
```

## `activeElement` プロパティを使うと取得できる

こちらの回答では、 `activeElement` プロパティを使ってクリックされたボタンを特定してから `formaction` を取得している。
この場合 `name="B"` のボタンをクリックするとその `formaction` が取得される。 `form` の `submit` ボタンをクリックすると元々設定された `action` が取得される。

javascript - How to get formaction in submit event? - Stack Overflow
https://stackoverflow.com/a/51990326

```js
  $("form").submit(function(e) {
    let formAction = e.target.getAttribute("action");
    let activeElementAction = document.activeElement.getAttribute("formaction");
    let action = activeElementAction || formAction;
    console.log(action);

    e.preventDefault();
  }); 

　　 // この方法でも可
  $("button").on('click', function(e) {
      let activeElementName = document.activeElement.getAttribute("name");
      console.log('activeElement name: ' + activeElementName);
  });
```

また、下記ドキュメントの通り `activeElement` は「DOM内で現在フォーカスを持っている要素」としているので、ボタンがクリックされたイベントでクリックされたボタンを特定することも可能。

Document: activeElement プロパティ - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Document/activeElement

サンプル
https://codepen.io/ysd-marrrr/pen/PoLeoop

## 送信実行時に `form` の `action` を取得すると元の `action` が取得される(失敗)

こちらは `name="B"` のボタンをクリックしても `form` に設定された `formaction` (`/main-submit`)が取得される。

javascript - get action of submitted form - Stack Overflow
https://stackoverflow.com/questions/16087018/get-action-of-submitted-form

```js
$("form").submit(function() {
    //some stuff...

    //get form action:
    var formAction = $(this).attr("action");

    //some other stuff...
});   
```
Gitの取り消しコミットを取り消す最中で取り消す


## コンフリクト解決中に取り消したい

分かりづらいのだが、コミットを一旦取り消してのちほどそれを復活させたいとき(取り消しコミットを取り消す)
コンフリクトが発生してその解決中に操作を取り消すことができる。

このような状態。コンフリクト解決中と見分けがつかない。

```
$ git status

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
        both modified:   
```

## `git reset --merge` を使う

```
$ git reset --merge
$
```

## `git merge --abort` はできない

```
$ git merge --abort
fatal: There is no merge to abort (MERGE_HEAD missing).

$
```

## 参考

git ブランチ操作 ケース
gitでコンフリクトが発生した際に、コンフリクトが発生する前に戻りたい。
https://zenn.dev/link/comments/b3cbb49d2d024e
【2024年01月版】pyenv と venv の使い分け 【python】

# はじめに

`pyenv` と `venv` の使い分けを質問された時の回答メモ。

# 概要

`pyenv`と`venv`は、Pythonのバージョン管理と仮想環境管理に使われるツール。
主な目的と機能は、`pyenv`と`venv`で異なる。

## `pyenv`

- **主な目的**  
Pythonのバージョン管理
- **機能**  
複数のPythonバージョンをインストールし、プロジェクトごとに異なるPythonバージョンを簡単に切り替えることができる
- **使用シチュエーション**
異なるプロジェクトで異なるPythonバージョンを使用する必要がある場合等


## `venv`

- **主な目的**  
Pythonの仮想環境管理
- **機能**  
Pythonの標準ライブラリに含まれているツールで、プロジェクトごとに独立したPython環境を作成し、プロジェクトの依存関係を他のプロジェクトと分離できる
- **使用シチュエーション**  
特定のプロジェクトの依存関係を管理し、その依存関係がシステム全体や他のプロジェクトに影響を与えないようにしたい場合


# シチュエーション例

### **異なるPythonバージョンでの開発を行う場合**
   - **シチュエーション**
       - 複数のプロジェクトを持っており、それぞれ異なるPythonバージョンで動作させる必要がある
   - **選択**
       - `pyenv` を使用して、プロジェクトごとに異なるPythonバージョンを切り替えて開発を行う

### **プロジェクト固有の依存関係管理**
   - **シチュエーション**
       - あるプロジェクトに特定のパッケージのバージョンが必要で、これが他のプロジェクトやシステム全体に影響を与えないようにしたい場合
   - **選択**
       - `venv` を使用して、そのプロジェクト専用の仮想環境を作成し、そこに必要なパッケージとバージョンのインストールを行う

### **組み合わせて使用**:
   - シチュエーション
       - 特定のPythonバージョンで新しいプロジェクトを開始し、そのプロジェクトの依存関係を完全に分離したい場合
   - 選択
       - `pyenv` で必要なPythonバージョンをインストールし、そのバージョンで `venv` を使用して新しい仮想環境を作成する

# さいごに

かんたんでしたね
【Rails】destroyではなくshowが実行される

# はじめに
この記事では、学習中に出会ったエラーとその解決までの道のりを自分のために記録しています。
初学者のため理解が不十分なところがあるかもしれません。
その場合はご指摘いただけると幸いです。

# 起こった問題
スクールのカリキュラムでX(旧Twitter)のような短文投稿サイトを作成した際、destroyアクションを実装して投稿の削除ボタンを作成したが、showアクションが実行されてしまった

# 結論
RubyのコードではなくJavaScriptの問題の可能性があるためコンソールを確認してみる

# 試したこと①
元の記述（これだとdestroyできない）
```
<%= link_to "削除", user, method: :delete, data: { confirm: "本当に削除しますか？" } %>
```
この記述で作成した削除リンクをクリックするとshowアクションに飛んでしまいました。
特にエラーが表示されるわけでもありません。
調べたところ、link_toをbutton_toに変更すると解決する場合があるとのことだったので試してみました。
```
 <%= button_to "削除", user, method: :delete, data: { confirm: "本当に削除しますか？" } %>
 ```

この記述にすると削除ボタンが正常に作動しました。
ただ、今後destroyアクションをボタンで実装し続けるわけにもいかないので、何とかリンクで削除できる方法を見つけたい…

# 試したこと②
参考記事：[[Rails6]削除ボタンが動作せず、アラートも動かず、削除ボタンを押すと参照してしまう問題の解決方法](https://qiita.com/michiya0509/items/a7dca9f53d1845db6189)

こちらの記事を参考にコンソールを確認したところ
```
bootstrap:83 Uncaught Error: Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: Cannot find package '@babel/plugin-proposal-private-methods' imported from /Users/ユーザー名/Desktop/rails/myapp/babel-virtual-resolve-base.js
```

と表示されていました。
**@babel/plugin-proposal-private-methods**というパッケージが見つからない、ということのようなので

```
yarn add @babel/plugin-proposal-private-methods 
```

こちらを実行したところ、link_toで作成した削除リンクが正常に作動するようになりました。


# 感想
Railsの勉強を始めてすぐに出会ったエラーということもあり、原因がJavaScriptにあるとは全く思いつかずハマってしまいました。
コンソールを確認するという発想がなかったので勉強になりました。
【Azure】DefaultResourceGroup-[geo]が自動で作られるのを防ぎたい

# 背景
知らぬ間に作られている`DefaultResourceGroup-[geo]`
都度消してるのにすぐ復活、なぜなのか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/492c13a1-38ca-0037-d057-251bf13c6b7d.png)

# 結論
:::note warn
Azure Functions 消費量(サーバレス)プランを
Azure Portalで作ろうとするとDefaultResourceGroup-[geo]が自動作成される
:::

:::note info
Azure Functions 消費量(サーバレス)プランを作りたいときはCLIで
:::

正確に言うと、Azure Functionsの作成以外でもいくつかパターンがありますが、
とりあえずここでの結論になります

# 調査
リソースグループの説明は不要だと思いますが、
`DefaultResourceGroup-[geo]`について説明します
>ワークスペースとは、データのコンテナーとして機能する Azure リソースです。 組織のメンバーは、複数のワークスペースを使用して、IT インフラストラクチャの一部またはすべてから収集されるデータのさまざまなセットを管理する場合があります。
>Log Analytics エージェントから収集されたデータは、Azure サブスクリプションに関連付けられている既存の Log Analytics ワークスペースまたは新しいワークスペースに格納されます。
>Azure portal で、Log Analytics ワークスペースの一覧を参照して表示できます。一覧には、Defender for Cloud によって作成されたワークスペースも含まれます。 新しいワークスペースに対して、関連するリソース グループが作成されます。 リソースは、次の名前付け規則に従って作成されます。
>>ワークスペース:DefaultWorkspace-[subscription-ID]-[geo]
リソース グループ:DefaultResourceGroup-[geo]

https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/defender-for-cloud-planning-and-operations-guide

どうやらLog Analytics ワークスペースが無い時に自動で作成される雰囲気があるので、
事前に作成した状態でAzure functionsを作ってみます

## Log Analytics を事前に作成しておく
Log Analyticsワークスペース自体は既に作成しておき、
事前に作成してあるものを指定してAzure functionsを作成することで確認してみます
下図の`DefaultWorkspace-[subscription-ID]-[geo]`以外のワークスペースを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/c52db1ee-9582-6b6f-51e1-15f7a60d46d5.png)
そうすることによって`DefaultResourceGroup-[geo]`が自動で作成されているものの
`DefaultWorkspace-[subscription-ID]-[geo]`は自動作成されないようになりました
それでもまだリソースグループは作られてしまうので、もう少し調べてみます

## バッチ処理
Azure functionsを作成しているタイミングでリソースグループが自動作成されるため、
どのタイミングで作成されるのか追ってみます

作り進めていった結果、「関数アプリの作成」より**ネットワークタブ**まではリソースグループが作成されませんでしたが、**監視タブ**まで進むと、リソースグループが自動作成されていました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/e40ffcab-8a6f-1c60-eb2a-ad01c3ee0a44.png)

裏でどんな動きをしているか見てみると、`DefaultResourceGroup-[geo]`がない場合に、
`DefaultResourceGroup-[geo]`を自動作成するバッチ処理が動いているようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/26354b8c-6d17-dd03-c5e6-37db228b185c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/ba4cef00-739c-90c8-628a-b57ce059d232.png)

これでは防ぎようがないため、Microsoftさんへ問い合わせをし、設定や申請で何かしら対応ができないか聞いてみました

## Microsoftへ問い合わせ
以下、ご回答いただきました
>・Azure Portalの動作上、Azure Functions作成時に[監視]項目に遷移した際に、Resource Group `DefaultResourceGroup-[geo]`が存在しない場合に、自動で作成されてしまいます。
>・なお、Resource Group `DefaultResourceGroup-[geo]`の中にリソースが作成されるわけではございませんのでご安心ください。削除頂いても問題ございません。
>・Azure CLIでAzure Functionsを作成すると、Resource Group `DefaultResourceGroup-[geo]`が自動で作成されるのを回避できます。下記公開ドキュメント/コマンドを参考にしていただけますと幸いです。

https://learn.microsoft.com/ja-jp/azure/azure-functions/scripts/functions-cli-create-serverless#run-the-script

https://learn.microsoft.com/ja-jp/cli/azure/functionapp?view=azure-cli-latest#az-functionapp-create

うーん、残念。

# まとめ
・Azure Functions 消費量(サーバレス)プランをAzure Portalで作ろうとすると自動作成
・設定へオプトアウト申請での対策は無し
・Azure CLIでAzure Functionsを作成することで回避可能
ExpressをVirtualBox で構築

# 前提
ホストOS : Windows

仮想環境 : oracle vm virtualbox 7.0.14

https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html

OS : CentOS7 
CentOS-7-x86_64-Minimal-2009.iso

https://www.centos.org/download/

# node.jsインストール
```bash:リポジトリ追加(時間がかかる)
curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo -E bash -
```
```bash:インストール
sudo yum install -y nodejs
```
```bash:確認
node -v
npm -v
```
参考

https://kinsta.com/jp/blog/how-to-install-node-js/#3-nodejs:~:text=3.-,Node.js%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%92%E9%96%8B%E5%A7%8B%E3%81%99%E3%82%8B,-Node.js%E3%81%AE


# Expressをインストールする
```bash:アプリケーション用ディレクトリを作成
mkdir express #アプリケーション名(自由)
cd express
npm init #すべてEnterでもOK
```
```bash:Expressモジュールをインストール
npm install express --save # --save package.jsonにexpressの情報が追加
```
```bash:Expressファイル作成
vi index.js #下記参照
```

下記公式サンプル内容のファイルを作成
ファイル名は`npm init`の設定項目`entry pont: (index.js)`で指定したファイル名(デフォルトは`index.js`)
```javascript:Express公式サンプル作成(デフォルト　index.jsで作成)
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})
```
Express公式サンプルURL

https://expressjs.com/ja/starter/hello-world.html

参考

https://kinsta.com/jp/knowledgebase/install-express/#linuxexpress


# Firewall設定
```bash:3000番ポートを恒久的に許可
sudo firewall-cmd --add-port=3000/tcp --zone=public --permanent
```
```bash:Firewall再起動
sudo firewall-cmd --reload
```
# 実行
```bash:Express実行
node index.js
```
```bash:ホストOSのWebブラウザでアクセス
http://(ホスト名):3000/
```



# おまけ
## 80ポートでアクセス
```diff_javascript:ポート番号変更 (公式サンプル)
const express = require('express')
const app = express()
- const port = 3000
+ const port = 80

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})
```
```bash:Firewall設定(http)
sudo firewall-cmd --add-service=http --zone=public --permanent
sudo firewall-cmd --reload
```
```bash:Express実行
node index.js #実行
```
```bash:ホストOSのWebブラウザでアクセス
http://(ホスト名)/
```

## デーモン化
```bash:foreverモジュールのインストール
npm install -g forever
```
「-g」を付与してグローバル環境にインストール
```bash:実行・停止
forever start index.js
forever stop index.js
```

##  express-generatorの場合の起動時の指定ファイル

```bash:Express実行
node bin/www
```
C++ mulitmapのlower_boundとupper_bound

# lower_boundとupper_bound
連想コンテナである std::multimap において、特定のキーの範囲を検索するための関数です

`upper_bound`が指定キーより大きい最初の要素イテレータを見つける
`lower_bound`指定されたキーより大きい最初の要素を指すイテレータ


```c++
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int main() 
{
    std::multimap<int, std::string> myMultimap;

    myMultimap.insert({1, "apple"});
    myMultimap.insert({3, "banana"});
    myMultimap.insert({2, "blueberry"});
    myMultimap.insert({2, "cherry"});

    int keyToFind = 2;
    // {2, "blueberry"};
    auto upperBoundIt = myMultimap.upper_bound(keyToFind);

    std::cout << "Elements with key " << keyToFind << ":" << std::endl;
    auto iter = myMultimap.lower_bound(keyToFind);
    while (iter!=upperBoundIt)
    {
        std::cout << iter->second << std::endl;
        ++iter;
    }

    return 0;
}
```
出力
```
Elements with key 2:
blueberry
cherry
```
KubernetesクラスターでNamespace毎のリソースの一覧を取得する

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

とある案件でKubernetesクラスターにあるリソースの一覧を取得する必要があったので、スクリプトを作成しました。

# 1. Kubernetesクラスターのリソース一覧を取得

Namespace毎に分けて出力する


```bash
#!/bin/bash

for n in $(kubectl get namespace -o custom-columns=NAME:.metadata.name| grep -v "NAME");
do
    echo "namespace: $n"
    for i in $(kubectl api-resources --namespaced --verbs=list -o name | tr "\n" " ");
    do
        kubectl get $i -n ${n} --show-kind --ignore-not-found;
    done
    echo -e "-----\n"
done > kubectl_get_all_resources.list.txt
```

以下のファイルに出力されます。
`kubectl_get_all_resources.list.txt`

# 2. 注意点

結構時間がかるのでのんびり待つ

# 3. 参考

以下のブログを参考にさせていただきました。

List All Resources in a Namespace in Kubernetes | Baeldung on Linux
https://www.baeldung.com/linux/kubernetes-list-all-resources
【ChatGPT有＋DALL-E3】を使用していて、発覚？した情報を報告。


　どうも、カーブミラーです。

　今回は、ChatGPT Plus＋DALL-E3を使用していて、発覚？した情報を報告します。ハルシネーションかも。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　今回は、今朝（2024/02/05）、
　　ChatGPTさんに
　　　DALL-E3の使えるカラーを
　　　　尋ねた際に、
　　　　　出力された内容です。

　そのやり取りを
　　どうぞ。
***
***user***
DALL-E3で描画できるカラーは何色ありますか？

***ChatGPT***
DALL-E 3（現在のバージョンはDALL-E 4を使用していますが、基本的な機能は似ています）で生成できる色に関しては、特定の数の色があるわけではありません。DALL-Eは非常に多様な色を生成することができ、その色域は実質的に限界がないと考えてよいでしょう。画像生成AIとして、DALL-Eはリクエストに基づいて、あらゆる色を含む詳細な画像を生成する能力を持っています。これには、鮮やかな色から淡い色、自然の色から人工的な色まで、幅広いスペクトラムが含まれます。したがって、利用できる色の数を特定することはできませんが、ほぼ無限に近い色を扱うことが可能です。
***

　私はこれを
　　読んで固まりました。

　“DALL-E4を使用しています”
　　の文言に。

　そんなこと、
　　X-Twitterにも
　　　ポストされてなかったのに。

　新しいセッションを
　　開き、尋ねます。
***
***user***
あなたはDALL-E4を使っている、という話がありました。
あなたが知る限りにおいて、事実でしょうか？
確証がなければ、ない、と答えてください。

***ChatGPT***
はい、事実です。私はDALL-E 4を使用して、テキストから画像を生成する機能を提供しています。
***
　さらに、
　　情報を求めたのですが、
　　　OpenAIのサイトにも
　　　　書かれていない、
　　　　　X-Twitterにも
　　　　　　そのようなポストは
　　　　　　　ない、との返答。

　念のため、
　　Google検索。
　　　なし。

　もう一度、
　　新しいセッションを開いて
　　　最初の質問を投げます。
***
***user***
DALL-E3で描画できるカラーは何色ありますか？

***ChatGPT***
DALL-E3（今はDALL-E 4のバージョンが利用されています）で生成できる画像は、基本的に数百万色を含むRGBカラースペースを使用します。これは、現代のデジタルディスプレイで一般的に使用される色の範囲です。したがって、DALL-Eによって生成される画像は、非常に広範な色のバリエーションを持つことができ、実質的にはデジタルアートや写真に見られるほとんどの色を再現することが可能です。具体的な色数を定量化することは難しいですが、一般的に使用される24ビットカラーでは約1,677万色（256レベルの赤、緑、青の組み合わせ）を表示することができます。
***
　さらに尋ねます。
***
***user***
DALL-E4を使われている、とのこと。その具体的な内容はわかりますか？　無理に答えなくても構いません。

***ChatGPT***
DALL-E 4に関する具体的な技術的詳細は、OpenAIが公式に公開した情報に基づいています。DALL-E 4は、テキストから高解像度の画像を生成する能力を持つ最新の深層学習モデルで、以前のバージョンよりも画像の質と関連性が大幅に向上していることが特徴です。以下は、DALL-E 4に関連する主な特徴の一部です：

- **高品質な画像生成**: DALL-E 4は、よりリアルで詳細な画像を生成できます。これは、改良された学習アルゴリズムと大量のデータに基づくトレーニングによるものです。
- **テキストからの細かい制御**: ユーザーが提供するテキストの記述に基づいて、非常に具体的で複雑なシナリオの画像を生成する能力が向上しています。ユーザーは、色、形状、シーンの配置など、画像の細部にわたる指示を提供できます。
- **多様性と創造性**: DALL-E 4は、与えられたテキストプロンプトに基づいて、多様な解釈と創造的な出力を提供することができます。これにより、一つのプロンプトから異なるスタイルや視点の画像を探索することが可能です。

DALL-E 4のアーキテクチャやトレーニングプロセスの詳細は、OpenAIの技術文書や公式発表においてより詳細に説明されています。これらの文書では、モデルの設計思想、学習データの収集と処理方法、生成性能の評価基準などが詳述されています。しかし、私の知識は2023年4月までの情報に限られているため、それ以降に公開された最新のアップデートや改良については把握していません。

***user***
いつごろ、DALL-E4に切り替わったのか、わかりますか？　最近だと思うのですが

***ChatGPT***
私の最終更新時点（2023年4月）では、OpenAIからDALL-Eの新しいバージョンについて具体的なリリース日は発表されていませんでした。そのため、DALL-E 4への切り替えの正確な時期やその詳細については、最新の情報を提供することができません。

DALL-Eの進化は、技術の迅速な進歩により継続的に行われており、新しいバージョンは通常、改善された生成能力や新機能を備えています。DALL-E 4に関する情報が公開された場合、それはOpenAIの公式ウェブサイトや関連する技術ブログ、プレスリリースで最初に発表されることが一般的です。

最新の情報をお探しの場合は、OpenAIの公式サイトや信頼できる技術ニュースソースを直接確認することをお勧めします。それらの情報源は、DALL-E 4のリリース日、新機能、およびその他の重要なアップデートに関する最新の詳細を提供するでしょう。
***
　ふむ。

　これは、
　　OpenAIあるあるの
　　　“ベータ版載せちゃった。ﾃﾍｯ”
　　　　のようですね(汗)

　それとも
　　ChatGPTさんが
　　　嘘吐きしているか、
　　　　のどちらかになります。

　とりあえず、
　　この件は
　　　X-Twitterにポストしてみます。

　知られたことだったら、
　　恥ずかしいなぁ(=^･^=;

　何かわかりましたならば、
　　記事に書いていこう、と思います。

　みなさんの作品制作が
　　豊かになりますように。

　今回は、ここまで。
OpenAIのAPIキーでのバグ(openai.error.RateLimitError)

# はじめに
OpenAIでAPIキーを叩く際のバグについて、以下のようなものがあります。
```bash
openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing details.
```
直訳すると、「現在のクオータを超過しています。プランと請求の詳細を確認ください。」という内容です。

このエラーに対して、様々なサイトで対処法が紹介されていますが、一部バグが残っているらしく、筆者も少し手こずったため、情報共有兼ねこちらへ投稿します。

解消方法は例えば以下です。以下手順に加えて、APIの再発行が必要です。

https://qiita.com/kotattsu3/items/d6533adc785ee8509e2c

# バグ内容
個人のアカウントに対して、クレジットカード登録を行ったにも関わらず、APIキーが叩けないという事象が発生していたようです。

https://community.openai.com/t/probable-openai-bug-insufficient-quota-error-on-paid-account-with-available-balance/331067

現在では解消？されているようですが、カード登録からAPIを立たけるようになるまで若干のラグが生じるようです。

https://community.openai.com/t/probable-openai-bug-insufficient-quota-error-on-paid-account-with-available-balance/331067/71

実際インシデントページに飛ぶと、バグは解消されている様子でした。

https://status.openai.com/incidents/13hqyjbvmf4l

# 最後に
現在はバグは解消されているようですが、クレジットカード登録から使えるようになるまで若干のタイムラグがありました。
バグの名残が残っているのかなと思いつつも、比較的短時間で使えるようにはなるため、影響はほぼないと思います。
また、ここでは個人アカウントのみの紹介にとどまっており、Teamプランでの動作等には触れていないためご注意ください。

では良き生成AIライフを！
【AWS】CloudWatchダッシュボード作成してみた(EC2のCPUUtilization)

こんにちは！

 CloudWatchダッシュボードを作成してみたのでその共有をしたいと思います🙂

 ### 1. はじめに
 今回、AWS構築PJでCloudWatchダッシュボードを作成する機会がございました。

対象サーバが多く、手作業で調べることも多かったので記事に残しとこうと思います、、


### 2.作成方法
早速、順を追ってCloudWatchダッシュボードの作成方法について説明したいと思います。

#### 2.1 ダッシュボードの作成を行う

【ダッシュボードの作成】ボタンを押して、作成します。
僕はプロジェクト単位でダッシュボードを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/c023b766-0465-cfcc-f982-b307c478b2da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/cb92fbec-3584-ef73-57a2-aa6a0378393b.png)

#### 2.2 ダッシュボードにグラフを追加しよう

次に、グラフ作成方法について述べていきます。

まずは【＋】を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/2db5e019-9e92-4ffa-e39a-f0645450a270.png)

色々、グラフを選ぶことができます。
僕は今回、対象EC2やEBSの比較を視覚的に簡単にしたかったので線を選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/f27f27e8-edcd-7f4a-4521-e4e7cb8364d0.png)

まず初めに、EC2のCPU使用率をグラフにしたいと思います。
【参照】タブの検索に、インスタンスIDをいれましょう。
インスタンス名ではダメでした😅

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/6959c7a4-a4dd-651f-9b7e-c70ebb669d2e.png)

インスタンス別メトリクスが出てくるので選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/f2750a2d-bcbf-eb7f-4fb2-8fc3e1a717d6.png)

次に、以下の画面が出てくるので、【CPUUtilization] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/482ef5c8-db0b-d205-f2c8-2cc66f4c982d.png)

【グラフ化したメトリクス】に選択したものが追加され、【期間】などの設定ができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/039a8021-c6f3-b465-60f5-793d204228db.png)

次に【オプション】タブを見てみましょう。
今回は0-100の【％】で表したいので、【左のY軸】に最小0・最大100で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/7e3c722f-5076-445c-ccd1-ce204d7a75e6.png)


設定が変更できたら、【ウィジェットの作成】を押して完了です👍
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/3f7075a2-16a3-87d5-e608-ada721d20fae.png)


少し長くなったので、スループットやIOPSのグラフ作成は次の記事で紹介したいと思います。
計算式も作らなければいけないので、少し応用です。

### 3.気を付けること

CloudWatchのグラフ作成で気を付けることが一つあります。

それは、グラフを作成したり並び替えたりする度に【保存】を押さないと
作業がパーになってしまうことです。
（メンバーが何度かしてしまっていました😂）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/9b64e819-dabc-53aa-e7f0-971ee0b01f08.png)


自動保存をオンにすることもできるので、不安な方はオンにしてきましょう

### 4.おわりに

ダッシュボードを全て手で設定するのは、EC2やEBSの数が多ければ多いほど大変でした。
選択ミスが発生するという可能性もあります。

これらのことから、CLIで設定する方法を調べて自動化を進めたいと思います。

ただ今回、途中でCLIで作成しようとして手動で作成したものが消えてしまったことがあるので、慎重にリサーチしながら進めます😉
SQLチートシート

## 日付の扱い

### DATE_TRUNC

DATE_TRUNCはSQLで使用される関数で、指定された日付や時刻の値を特定の精度（年、月、日、時など）で切り捨てるために使用されます。この関数は、集計やレポート作成時に時間範囲を基準にデータをグループ化する際に特に便利です。

```sql
DATE_TRUNC('精度', 対象の日付または時刻の列)
```

#### 年単位での切り捨て

```sql
SELECT DATE_TRUNC('year', CURRENT_DATE) AS truncated_year;
```

#### タイムゾーンの設定

```sql
SELECT column_name AT TIME ZONE 'UTC' AT TIME ZONE 'Asia/Tokyo'
FROM your_table;
```


#### 日本時間での期間指定によるデータフィルタリング

```sql
SELECT *
FROM your_table
WHERE (column_name AT TIME ZONE 'GMT' AT TIME ZONE 'Asia/Tokyo') 
      BETWEEN '2023-01-01 00:00:00' AND '2023-01-31 23:59:59';
```

#### INTERVALキーワード

```sql
SELECT CURRENT_DATE - INTERVAL '1 week' AS one_week_ago;
SELECT CURRENT_DATE - INTERVAL '1 month' AS one_month_ago;
SELECT CURRENT_DATE - INTERVAL '3 days' AS three_days_ago;
SELECT CURRENT_TIMESTAMP - INTERVAL '2 hours' AS two_hours_ago;
SELECT *
FROM your_table
WHERE your_date_column >= CURRENT_DATE - INTERVAL '1 week';
```
デメテルの法則(Law of Demeter, LoD)は?


## 概念
デメテルの法則（Law of Demeter、LoD）は、1980年代後半にノースイースタン大学のイアン・ホーランド（Ian Holland）によって開発されたオブジェクト指向システム設計のガイドラインです。この法則は、「直接的に関連する友達とのみ最小限のコミュニケーションを行う」という原則を通じて、オブジェクト間の結合度を低くし、システムのモジュール性を向上させることを目指しています。

重要なポイントは、オブジェクトが自分が生成したオブジェクトまたは直接渡されたオブジェクトとのみ相互作用すべきであることです。これは、オブジェクト間の相互作用を完全に排除することを意味しないことに留意してください。重要なのは、オブジェクトが不必要に他のオブジェクトに間接的にアクセスすることを避けることです。

この法則に従うことで、情報の過度な伝達を制御し、複雑なシステム設計で不必要な依存関係を減らすことができ、システムの保守性と拡張性を向上させることができます。さらに、エンジニアは短期記憶に少ない情報を保持することで、システムの構造をより簡単に理解し、変更することができます。

## 原則

「F」というメソッドがあると仮定したとき、デメテルの法則が言う"F"メソッドの「直接関連する友達」は次のようになります。

1. 「F」メソッドを持つオブジェクトのメソッド
2. 「F」メソッドを持つオブジェクトのプロパティ
3. 「F」メソッドのパラメータ
4. 「F」メソッド内で生成されたオブジェクト

## 例（RUBY）
```ruby
class Mail
  attr_reader :from, :to, :body

  def initialize(from, to, body)
    @from = from
    @to = to
    @body = body
  end
end

class Mailer
  attr_reader :smtp_server_address

  def initialize(smtp_server_address)
    @smtp_server_address = smtp_server_address
  end

  # メールオブジェクト(Mail)の生成と初期化を担当し、実際のメール送信のために内部的にdeliverメソッドを呼び出します。
  def send_email(from, to, body)
    mail = Mail.new(from, to, body) # 3.「F」メソッドのパラメータ、4.「F」メソッド内で生成されたオブジェクト
	deliver(mail) # 1. 「F」メソッドを持つオブジェクトのメソッド
  end

  private

  # deliverメソッドはSMTP サーバに接続してメールを転送するコードなど実際にメールを送るロジックをカプセル化します。
  def deliver(mail)
    puts "Connecting to SMTP server at #{$smtp_server_address}..." # 2. 「F」メソッドを持つオブジェクトのプロパティ
    puts "Email from '#{mail.from}' to '#{mail.to}' sent with body: '#{mail.body}'"
  end
end

mailer = Mailer.new("smtp.example.com")
mailer.send_email("sender@example.com", "receiver@example.com", "Hello, this is a test email.")
```

## 参考
- [Law of Demeter (General Formulation) - Northeastern University](https://www2.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/general-formulation.html)
- The Pragmatic Programmer - Bend, or Break (Decoupling)
xampp Tomcat 動ているよな。

ちょっと苦労したけど、ランニングだけは、行います。
![2024-02-05 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/1cc6eb13-6ac4-f75c-2456-d928417d5052.png)

tomcat の場合javaからすべての権限を自分の物にしなければなりませんが。

ただし、使うことを知りません。
承認プロセスが関係するトレイルヘッド


+ [Customize How Records Get Approved with Approvals](https://qiita.com/Keiji_otsubo/items/a4605d835542699c6fca)

+ [Create an approval process that validates when a Prospect Account becomes a Customer](https://qiita.com/Keiji_otsubo/items/5ff74d57829abc72e7bd)

+ [(Internal Server Error while completing Travel Approval App Page Layout module.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000KhABv)

:::note
ust click all layout instead of travel approval layout. it guided us to OM and  so we can edit from there.
:::

+ [The rejection is not configured correctly for 'Discount Approval Process'. VP rejection of the opportunity did not result in either the Approval_Status__c being set to 'Not Approved' or the Discount_Percentage__c being set to null.](https://qiita.com/Keiji_otsubo/items/8b5f40828da0c108cb5e)

# メールアドレスでのエラー

+ [why is my email n username are not accepting in Process Automation Settings](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvYgg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/472b8cef-3a26-e3ca-6561-f4d93e33bc1b.png)

自然に解消された？

# 間違って削除した？

+ [Specify Final Approval and Rejection Actions I I have deleted the final rejection actions so i want to create again but at this time it show it is already created please tell hoe to correct it](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XHLxr)

:::note
 I did this same thing! I fixed it by using the "Add Existing" instead of "Add New" button when fixing the approval actions and rejection actions. You can add in multiple actions at the same time using the add/remove arrows when you are in the "Select Existing Actions" window.

Even though the actions were removed from the process, they still exist! 

私もこれと同じことをしました！承認アクションと拒否アクションを修正するときに、「新規追加」ボタンの代わりに「既存を追加」ボタンを使用して修正しました。「既存のアクションの選択」ウィンドウで追加/削除矢印を使用して、複数のアクションを同時に追加できます。

アクションがプロセスから削除されても、まだ存在しています。 
:::


# 承認プロセスに新しい承認ステップが見つかりません

+ [承認プロセスに新しい承認ステップが見つかりません](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Tjh5q)

:::note
はい、Trailhead バッジチャレンジの問題に関連していました。割引承認プロセスの作成の「初期申請アクションの作成」の作業中に、承認プロセスで新しい承認ステップボタンが見つかりませんでした。新しい割引承認プロセスを複製し、元の割引承認プロセスを削除して新しい割引承認プロセスをアクティブ化することで、問題は解決し、「新しい承認ステップ」ボタンが表示されるようになりました。以下のプロセスが正しいかどうかはわかりません。ただし、初期申請アクションの作成を完了するために行ったことは次のとおりです。複製のプロセス中に、エラー メッセージに指示されたため、新しい割引承認プロセスの一意の名前を変更しました。次に、元の割引承認プロセスを削除して検証ステップを実行したところ、「正しい情報を持つアクティブな承認プロセスが見つかりませんでした。手順を再確認してください。」というエラーが発生しました。次に、新しい割引承認プロセスの一意の名前を、手順どおりに元のものに変更しました。最後に、検証ステップを完了しました。  
:::
C++ Lambdaのキャプチャリスト

## Lambdaのキャプチャリスト
Lambda関数がアクセスできる外部変数を指定する柔軟な手段を提供
## 使用方法

### 値のキャプチャ
`[x, y]`：指定された外部変数 x と y を値でキャプチャします。
```c++
int main() {
    int x = 5;
    double y = 3.14;

    auto lambda = [x, y]() {
        std::cout << " x: " << x << std::endl;
        std::cout << " y: " << y << std::endl;
    };

    lambda();

    return 0;
}
```

### 参照のキャプチャ
`[&x, &y]`：指定された外部変数 x と y を参照でキャプチャします。
```c++
int main() {
    int x = 5;
    double y = 3.14;

    auto lambda = [&x, &y]() {
        std::cout << " x: " << x << std::endl;
        std::cout << " y: " << y << std::endl;
    };

    lambda();

    return 0;
}
```

### 混合のキャプチャ
`[x, &y]`：x を値でキャプチャし、y を参照でキャプチャします。
```c++
int main() {
    int x = 5;
    double y = 3.14;

    auto lambda = [x, &y]() {
        std::cout << " x: " << x << std::endl;
        std::cout << " y: " << y << std::endl;
    };

    lambda();

    return 0;
}
```

### すべての変数をキャプチャ（値キャプチャ）
`[=]`：すべての外部変数を値でキャプチャします。
```c++
int main() {
    int x = 5;
    double y = 3.14;

    auto lambda = [=]() {
        std::cout << " x: " << x << std::endl;
        std::cout << " y: " << y << std::endl;
    };

    lambda();

    return 0;
}
```

### すべての変数をキャプチャ（参照キャプチャ）
`[&]`：すべての外部変数を参照でキャプチャします。
```c++
int main() {
    int x = 5;
    double y = 3.14;

    auto lambda = [&]() {
        std::cout << " x: " << x << std::endl;
        std::cout << " y: " << y << std::endl;
    };

    lambda();

    return 0;
}
```

### すべての変数をキャプチャ（特定の変数を無視）
`[=, &x]`：すべての外部変数を値でキャプチャしますが、変数 x だけは参照でキャプチャします。

### 外部変数をキャプチャ後に変更権限を追加
`[x = 10, y]`：x を値でキャプチャし、x のコピーを変更することが許可されます。

### キャプチャリストの型推論
`[&a = x, b = y]`：キャプチャリスト内の初期化式を使用して型を推論します。

### キャプチャリストの省略
`[]`：外部変数をキャプチャしません。Lambda関数内で局所変数またはグローバル変数のみ使用できます。

### Lambda関数ボディの引数がない場合
`[=]() { /* Lambda関数ボディ */ }`：キャプチャリストに = を書き、次に括弧内に引数リストを空にします。
homebrew install時にwarningが出る'Warning: /opt/homebrew/bin is not in your PATH.'

# 今回の問題
homebrewインストールするために以下コマンドを打ったがwarningが表示されてしまう
```zsh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

途中までは成功かと思われたが出力の途中でWarningが表示された
エラー内容一部抜粋
```zsh
Warning: /opt/homebrew/bin is not in your PATH.
```

# 対策
パスが通ってないのでパスを通してあげる
以下コマンドを打てば良い。
```zsh
export PATH="$PATH:/opt/homebrew/bin"
```

その後以下のコマンドでバージョンが表示されればOK
```
brew --version
```