OmniAICreator/Qiita-1.07M huggingface dataset:
CSVをJSONに変換するPythonプログラムを作った

## 背景

業務の中でCSVファイルをJSONに変換したいなーというタイミングがありました。
ググったところ、そのニーズを満たしてくれるサイトはいくつか見つかりましたが、社内で扱うデータを外部のウェブサイトに入力するのは、セキュリティの観点から少し不安を感じていました。
（さらに調べてみると、Visual Studio Codeの拡張機能を使えば簡単に変換できる方法もあることが分かりました。ただ今回の題材はそんなに難しくないんではないかと思ったので、自分自身で作ってみました。）

## Pythonを使って実装

以下に、CSVファイルをJSONファイルに変換するためのPythonプログラムを紹介します。
このプログラムはコマンドライン引数からCSVファイルのパスとJSONファイルのパスを受け取り、CSVファイルの内容を読み取りJSONファイルに変換します。

```python
import csv
import json
import argparse

# コマンドライン引数の解析
parser = argparse.ArgumentParser(description='Convert CSV to JSON.')
parser.add_argument('csv_file', type=str, help='Path to the CSV file')
parser.add_argument('json_file', type=str, help='Path to the output JSON file')
args = parser.parse_args()

csv_file = args.csv_file
json_file = args.json_file

# CSVファイルを読み込む
with open(csv_file, mode='r', encoding='utf-8') as file:
    csv_reader = csv.DictReader(file)
    data = [row for row in csv_reader]

# JSONファイルに書き込む
with open(json_file, mode='w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

print(f"CSVファイル '{csv_file}' を JSONファイル '{json_file}' に変換しました。")
```

### プログラムの説明

1. **argparseモジュール**を使用して、コマンドライン引数を解析します
2. **csvモジュール**を使用して、CSVファイルを読み込みます。`csv.DictReader`を使うことで、ヘッダー行を自動的に辞書のキーとして扱うことができます
3. 取得したデータをリストに変換し、**jsonモジュール**を使用してJSONファイルに書き込みます
4. 最後に、変換が完了したことを知らせるメッセージをコンソールに出力します

## 実行方法

このプログラムを実行するためのコマンドは以下の通りです。

```shell
python convert.py input.csv output.json
```

input.csvは変換元のCSVファイルのパス、output.jsonは変換先のJSONファイルのパスです。
実行に成功すると、以下のメッセージが表示され、指定されたパスに変換されたJSONファイルが存在します。

```
CSVファイル 'input.csv' を JSONファイル 'output.json' に変換しました。
```

## 実行環境

このプログラムを実行した環境は以下のとおりです：

- **Python：** Python 3.9.19
- **WSL2（Windows Subsystem for Linux）：** 2.3.24.0

## 感想

pythonはサクっと書けてサクっと実行できていいですね。
（GitHub Copilotに誘導されながらだと特に詰まるところもありませんでした）

もし同じようなニーズがある方は、このプログラムを参考にしてみてください。
思いのほかシンプルに作ることができるので、ぜひ挑戦してみてください。

## 参考文献

- https://docs.python.org/ja/3/library/csv.html
- https://docs.python.org/ja/3/library/json.html
- https://docs.python.org/ja/3/library/argparse.html
高性能シリアルモニタリングプログラムのご紹介

現在、適当なシリアルモニタリングプログラムをお使いでない場合、私が紹介する完全無料でVisual Studio風のダークテーマを持つドッキングベースのシリアルモニタリングプログラムを試してみてください。

ダウンロードも非常に簡単です。 Windows 10以上をお使いの場合、Microsoft Storeで「CRMT」を検索してください。 または、以下のURLからダウンロードすることもできます。

https://apps.microsoft.com/detail/9nf2h969r452?rtc=1&hl=ja-JP&gl=ja

完璧ではありませんが、90%以上の日本語をサポートしており、無料で韓国でも業務で多く使用されているシリアルモニタリングプログラムです。

ありがとうございます。
VS CodeにPlantUMLを導入する（Windows）

## 環境
* Windows11 64bit
* VS Code（Version: 1.94.2）
* PlantUML 拡張（Version: 2.18.1）

### 前提条件
* VS Codeをインストールしていること
* Javaの実行環境があること
  * :warning: この記事では、VS Codeインストール手順とJavaの実行環境構築についてを書いてません！（各々で調べてください…）
  * [VS Code公式サイト](https://code.visualstudio.com/)
  * [64bit Javaダウンロードページ(Windows)](https://www.java.com/en/download/)


## PlantUML のインストール
Visual Studio MarketplaceからPlantUMLをインストールする

1. VS Codeで、ctrl + Pを実行してQuick Openを開く
1. Quick Open に「ext install plantuml」と入力する
1. 「PlantUML」を選択してインストールする
※ 検索結果に「PlantUML Syntax」とかでてくるけど、これらは無視。シンプルに「PlantUML」を選ぶ

### しなくてよいこと
他の記事では、Graphviz (dot.exe)を別途用意するようなことが書かれているが、
VS CodeのPlantUML 拡張パッケージが勝手にいろいろやってくれるらしい。

※ [Graphvizの公式サイト](https://plantuml.com/en/graphviz-dot)にも書かれている
> If you use a recent version (that is at least version 1.2020.21), you don't need to manually install GraphViz anymore !

## 動作確認
### プレビュー表示
1. VS Codeで、新規に.puファイルを作成する（File -> New File -> "test.pu"を作成）
1. 以下のシーケンス図の構文を入力する
1. コマンドパレット(CTRL + SHIFT + P)から、<b>[PlantUML: Preview Current Diagram]</b> を選択すると、プレビューが表示される

```
@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response

Alice -> Bob: Another authentication Request
Alice <-- Bob: Another authentication Response
@enduml
```

### 画像で出力する
1. 任意のpuファイルを開く
1. コマンドパレット(CTRL + SHIFT + P)から、<b>[PlantUML: Export Current Diagram]</b> を選択する
1. 保存したい拡張子を選択する


## 参考サイト
* [PlantUML](https://plantuml.com/ja/)
  * :warning: 公式サイトなのに、たくさん広告が出てうざったいです！
* [Visual Studio MarketplaceのPlantUMLのページ](https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml)
オフライン環境のeclipseにプラグインを導入する方法

# はじめに
オフライン環境でeclipseを使わなければならない機会があったので、備忘録としてまとめました。
# 環境
- Windows 11
- eclipse(plaiades all in one) 2022
- 導入するプラグインとして、Emmetを例とします
- 別途webにつながっているPC
# 手順
### アップデートアドレスの確認
Marketplaceのダウンロードしたいプラグインのページのダウンロードアイコンや、公式ホームページからアップデートアドレスを確認する。次の項で実行するコマンド中にダウンロード元として指定するものである。
```text:Emmetの場合
http://download.emmet.io/eclipse/updates/
```
### プラグインのダウンロード
webに繋がっているPCにおいて、プラグインをダウンロードする。
あらかじめダウンロード先のフォルダを作成しておく。
まず、コマンドプロンプトを開き、eclipse.exeのあるフォルダへ移動する。
その後、次のコマンドを実行する。
```text
eclipse.exe -verbose -application org.eclipse.equinox.p2.artifact.repository.mirrorApplication -source http://download.emmet.io/eclipse/updates/ -destination ダウンロード先フォルダのパス
$eclipse_home/eclipse -application org.eclipse.equinox.p2.metadata.repository.mirrorApplication -source http://download.emmet.io/eclipse/updates/ -destination ダウンロード先フォルダのパス
```
### オフラインPCへのファイル移動
ダウンロードしてきたファイルおよびフォルダをオフラインPCへUSBメモリなどを用いてコピーする。
### プラグインのインストール
オフラインPC上のeclipseを開き、ヘルプ＞新規ソフトウェアのインストール　をクリックし、開いたウインドウで「追加」ボタンをクリック。「ローカル」ボタンをクリックし、コピーしたファイルおよびフォルダを保存しているフォルダを選択する。そして「追加」をクリック（「名前」は特に入力しなくてよい。）。
すると、対象のプラグインが選択項目に現れるので、チェックをしてウィザードに従いインストールすれば完了。
### エラー
私が試したとき、次のようなエラーが出ました。
```text
インストールする項目の収集中にエラーが発生しました
セッション・コンテキスト:(プロファイル=epp.package.java、フェーズ=org.eclipse.equinox.internal.p2.engine.phases.Collect、オペランド=、アクション=)。
```
対処法は、eclipseにおいて、ヘルプ＞新規ソフトウェアのインストール＞管理　をクリックして、登録されているアドレスを全消去したあとに、再度プラグインのインストールをすることです。
アドレスはエクスポートすることが可能なので、バックアップを取っておきたい場合はエクスポートしておきます。

# 補足
eclipseマーケットプレイスの検索に引っかかるものなら、もっと簡単にインストールできます。
webブラウザでマーケットプレイスにアクセスして対象のプラグインを検索・表示し、ホーム（家の形のアイコン）へアクセス。多くはGitHubやsourceforgeに繋がるので、そこからプラグインのzipをダウンロード。eclipseのヘルプ＞新規ソフトウェアのインストール＞追加＞アーカイブと進み、対象のzipファイルを選択してインストールできる。
Tips #010 リストの選択肢フィールドをフォームに配置したが反映ない話

https://qiita.com/Novskiiiiiiiiii/items/0e2c8405fedd4fcb2088

リストで選択肢フィールドを以下のように設定した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/28b85391-c1e9-c2ec-3d58-ff53092375a9.png)

このフィールドをフォームに追加したのにフォーム上だと選択肢が表示されないという悲しい事件が発生。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/87a36207-7b27-9052-a37a-949f0a6d29e9.png)

カードの設定は以下の通り

    Choices([@test_concur_request].支払方法)

よくよく考えると、ここでフォームで設定しているのは、
あくまでリストに登録されたアイテムを表示するという事なので、
本来やりたいこと（選択肢を表示する）とは違うという事がわかった。

なので、フォームでもリストと同様に選択肢を設定する必要がある。
と解釈した。

    Choices([@test_concur_request].支払方法)

なので対象のカードの詳細設定を以下のように設定

    Items:["振込","小切手","臨時"]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/c4cafd36-cca5-76db-a4d5-738dc08a2e82.png)

Choices～でリストのアイテムが表示されないのは釈然としないが、
ひとまずやりたい事は実現できたのでよし！

以上

https://qiita.com/Novskiiiiiiiiii/items/34d70fb094e7f5cc3fe7
GraalVMにおけるJVM言語、Truffle言語、Polyglotの関係

GraalVMは、異なるプログラミング言語を同じランタイム環境で動作させ、相互運用性を提供する強力なランタイムです。この投稿では、GraalVMの中でのJVM言語とTruffle言語の違い、そしてそれらを統合するPolyglot APIについて簡潔に説明します。

## 1. JVM言語とは？
JVM言語は、Java仮想マシン（JVM）上で動作するプログラミング言語の総称です。代表的なものには以下の言語があります：

- Java
- Kotlin
- Scala
- Groovy

これらの言語はすべてバイトコードにコンパイルされ、JVM上で実行されます。

## 2. Truffle言語とは？
Truffle言語は、GraalVMのTruffleフレームワークを使って実装された言語です。GraalVM環境では、Truffle言語もJVM言語と同様に、他の言語と統合して使用することができます。代表的なTruffle言語は以下の通りです：

- Python
- JavaScript
- Ruby
GraalVM上でのPython実装はGraalPyと呼ばれ、Truffleフレームワークを使って実装されています。

## 3. Polyglot APIとは？
Polyglot APIは、異なる言語同士の連携を可能にするGraalVMの中核機能です。これを利用することで、JVM言語とTruffle言語が同じアプリケーション内でシームレスにやり取りできるようになります。

### Polyglot APIの例
以下は、JavaからPythonコードを呼び出す例です：

```
import org.graalvm.polyglot.*;

public class Main {
    public static void main(String[] args) {
        // GraalVMコンテキストの作成
        try (Context context = Context.create()) {
            // Pythonコードを実行
            context.eval("python", "print('Hello from Python')");
        }
    }
}

```

![スクリーンショット 2024-10-22 151254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796362/bd63188e-3d18-6de2-bb7b-fcdd51b81a2e.png)
C#でExcelをXMLに、またはXMLをExcelに変換する

XMLは、異なるプラットフォームやアプリケーション間でデータを転送するための一般的なデータ交換フォーマットです。ExcelのデータをXMLに変換することで、異なるシステム間でのデータ共有が容易になります。また、Excelが提供する強力なデータ分析ツールを活用するために、XMLファイルをExcelに変換する必要がある場合もあります。今回は、 **C#を使ってExcelとXMLの形式を変換する** 方法を紹介します。
* [C#でExcelをXMLに変換する](#cでexcelをxmlに変換する)
* [C#でXMLをExcelに変換する](#cでxmlをexcelに変換する)

## 無料の.NET ExcelコンバータAPI
Excel形式とXML形式の変換は[**Free Spire.XLS for .NET**](https://www.e-iceblue.com/Introduce/free-xls-component.html)ライブラリで行うことができます。NETアプリケーションでExcelファイルを処理するために、開発者は完全に無料です（ただし、一定のページ数制限があります）。

[**Nuget**](http://www.nuget.org/packages/FreeSpire.XLS/)経由で直接インストールするか、製品パッケージをダウンロードして手動でdllをインポートしてください。

https://www.e-iceblue.com/Download/download-excel-for-net-free.html

## C#でExcelをXMLに変換する
無料のExcel APIには、ExcelファイルをXML形式で保存する **`Workbook.SaveAsXml()`** メソッドがあります。以下はそのサンプルコードです：
```csharp
using Spire.Xls;

namespace ConvertExcelToXML
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Load an Excel file
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("Sample.xlsx");

            //Save the Excel file in XML file format
            workbook.SaveAsXml("ExcelToXML.xml");
        }
    }
}
```

## C#でXMLをExcelに変換する
XML を Excel に変換するには、まず **`LoadFromXml()`** メソッドを使用して Xml ファイルをロードし、次に **`SaveToFile()`** メソッドを使用して .xls または .xlsx ファイルに変換します。以下はそのサンプルコードです：
```csharp
using Spire.Xls;

namespace ConvertXMLToExcel
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Load an XML file
            Workbook workbook = new Workbook();
            workbook.LoadFromXml("ExcelToXML.xml");

            //Save the XML file to an Excel XLSX file
            workbook.SaveToFile("XMLToExcel.xlsx", ExcelVersion.Version2016);
        }
    }
}
```

変換されたXMLファイルとExcelファイル:
![Excel-XML.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/c9beabc4-c44d-31ad-f3e1-d3b3be8472b9.png)
[Laravel] グループ化したURLでバリデーションが通らなかった

# なぜ？
これだと通らなかった
```php
Route::group(['prefix' => '{id}']function() {
    Route::get('/', [TestController::class, 'index'])->name('index');
    Route::get('/detail', [TestController::class, 'details'])->name('detail');
})->whereNumber('id');
```

こいつはいけたけど、いちいち`->whereNumber('id')`をつけるんか？って話
```php
Route::group(['prefix' => '{id}']function() {
    Route::get('/', [TestController::class, 'index'])->name('index')->whereNumber('id');
    Route::get('/detail', [TestController::class, 'detail'])->name('detail')->whereNumber('id');
});
```

# 解決策
これでいけた
```php
Route::prefix('{id}')->whereNumber('id')->group(function() {
    Route::get('/', [TestController::class, 'index'])->name('index');
    Route::get('/detail', [TestController::class, 'detail'])->name('detail');
});
```

# 感想
インターン中にLaravelを触ってたら起こりました。
Laravel初めて触りました意外とおもろいか？
誰かなんでこれがいけるのか教えてくれると嬉しいです。
ゲームプログラマのための設計：RVOでサイズの大きいインスタンスを返す

[ゲームプログラマのための設計シリーズ](https://qiita.com/kobitnex/items/93397d985682c806884c) ：実装詳細編の記事です。

# 概要
* RVO(Return Value Optimization)で、戻り値の一時オブジェクトの生成が抑制される
* 純粋関数を活用するのにRVOが役立つ
* 一方NRVOはオススメしない

# 本文
## RVOはオススメ
以下の記事にて、「純粋関数」を積極的に利用しようと紹介しました。
https://qiita.com/kobitnex/items/b7093143d06029021b93
純粋関数とは、
```cpp
int PureFunc(int)
{
	// グローバル変数を読み書きしない
	// 引数に可変参照をとらない
	// 非メンバ関数である

	return ...;
}
```
このようなものでした。

ここで気になるのが帰り値でサイズの大きなクラスを返す際のコピーコストですが、これを削除してくれるのが[RVO(Return Value Optimization)](https://cpprefjp.github.io/lang/cpp17/guaranteed_copy_elision.html)です。
```cpp
BigData PureFunc(int)
{
	return BigData{}; // この関数の戻り値で変数を初期化するとき、コピーが発生しないようにしてくれる
}
```
RVOの何よりうれしいところは、
* C++17より規格に取り込まれているのでコンパイラやオプションによらず確実に行われる
* コピー/ムーブが実際に行われないだけでなく、そもそもコピー・ムーブコンストラクタがないクラスでも返せる

点にあります。
```cpp 
// コピー・ムーブ不可のクラスでもOK
class BigData 
{
public:
	explicit BigData() = default;
	BigData(const BigData&) = delete;
	BigData(BigData&&) = delete;
};
```

実行速度パフォーマンスを落とさず良い設計を保てるオススメの機能です。

## NRVOはオススメではない
類似の最適化として、NRVO(Named Return Value Optimization)というものがあります。その名の通り、名前がついている（左辺値）変数を返した場合にも同様の最適化を施すというものです。
こちらは規格では保証されていないので、必ず実行されるとは限らない、コピー不可のオブジェクトは返せないというデメリットがあります。
```cpp
BigData PureFunc(int)
{
	BigData data{};
	return data; // BigDataがコピー不可だとコンパイルエラー
}
```
このスタイルを利用するということは事実上帰り値がconst変数ではないということになるので、その点でもあまりお勧めしません。
秀和システム「Python x API で動かして学ぶ AI活用プログラミング」1章

秀和システム「Python x API で動かして学ぶ AI活用プログラミング」
1章をやってみた。
ここでは記事の内容ではなく、自環境での動作結果だけを記録のために記載しています。

## 環境
OS：Windows 11 Home 64 ビット オペレーティング システム
CPU：11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz   3.00 GHz
RAM：32.0 GB

## ソース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/d2750610-1589-660e-2c7f-880d19e3bf94.png)
(中略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/6667b0e5-a740-25bf-d91b-a01d0573795d.png)


```1_ObjectDetection_app.py
import streamlit as st
import cv2
import numpy as np
from ultralytics import YOLO

# モデルの読み込み
model = YOLO('yolov8n.pt') 

# Input
camera_img = st.camera_input(label='インカメラ画像')

# Process
if camera_img is not None:

    bytes_data = camera_img.getvalue()
    cv2_img = cv2.imdecode(np.frombuffer(bytes_data, np.uint8), 
                            cv2.IMREAD_COLOR)
    results = model(cv2_img,conf=0.5)
    output_img = results[0].plot(labels=True,conf=True)
    output_img = cv2.cvtColor(output_img, cv2.COLOR_BGR2RGB)
# Output
    st.image(output_img, caption='出力画像')
```

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/e33d2f78-729c-8674-0aaf-417650355186.png)
[tips][cpp] copy

# copy

- 代入　`配列１= 配列２`
- std::copy
- move

の三つがあります。
`vector<int>`型などで、新しい配列を用意して、元の配列の値を変更したくない時には`配列１= 配列２`を使用するのが良さそうです。

代入動作は、コピー元の配列と同じストレージを持つ配列を用意し、そこに基本型を割り当てていく動作のようです。

```cpp
vector<int> a = {1, 2, 3};
vector<int> b(3) = a;
```

実際の内部動作
```cpp
b[0] = a[0] ;
b[1] = a[1] ;
b[2] = a[2] ;
```

この動作のため、コピー先配列`b`の要素を変更してもコピー元配列`a`には反映されません。
```cpp
b[0] = 999;
cout << "a[0]:" << a[0] << endl;
cout << "b[0]:" << b[0] << endl;
```

output
```cpp
a[0]:1
b[0]:999
```

※参考　https://ezoeryou.github.io/cpp-intro/#vector%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC

<details><summary>作成中</summary>

```cpp
#include <iostream>
#include <vector>
using namespace std;

int main(){
    vector<int> a = {1, 2, 3};
    cout << &a[0] << endl;

    vector<int> b = a;
    cout << &b[0] << endl;

    // shallow copy
    vector<int> c(a.size());
    copy(a.begin(), a.end(), c.begin());
    cout << &c[0] << endl;
}
```

`copy()`関数によるコピーと`=`演算子によるコピー。

output
```cpp
0x14a606bc0
0x14a606bd0
0x14a606be0
```
</details>




## 参考
https://rinatz.github.io/cpp-book/ch06-04-move-semantics/

https://qiita.com/yokoto/items/5672ff20b63815728d90

[cpp-book](https://rinatz.github.io/cpp-book/ch06-03-deep-and-shallow-copy/)

https://www.javadrive.jp/start/array/index10.html#google_vignette

https://zenn.dev/mafafa/articles/cba24383d46900
rex0220 項目検証プラグイン テーブル行追加・削除ボタンの非表示制御

項目検証プラグインで、テーブル行追加・削除ボタンの非表示を行ってみます。
テーブル行数の制限や必要データの削除防止ができます。

# 概要

[項目検証プラグイン](https://qiita.com/rex0220/items/be20fd879f5e1bc9e035)は、入力項目必須チェック、バリデーションチェック、入力抑止、表示制御の処理条件を計算式で指定するプラグインです。

Ver.55 以降で、テーブル行追加・削除ボタンの非表示制御を行うことが出来るようになりました。

- テーブル行追加ボタンの非表示によって、テーブル行数を制限
- テーブル行削除ボタンの非表示によって、必要データの削除を防止

# 行追加・削除ボタンの非表示の例

テーブル５行以上は、追加ボタンを非表示。
型番設定時に、削除ボタンを非表示。

![2024-10-22_14h18_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7d71329b-2eef-a970-8306-8f7bcb059320.png)

# 操作例

![2024-10-22_14h39_19.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/44c788d8-aca3-fb66-45e4-dada3724dfa0.gif)

# 項目検証プラグイン設定

![2024-10-22_14h31_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/38a1049a-0c43-4091-ad9a-bc394e4a7153.png)

行追加ボタンは、(\\$ADD)。行削除ボタンは(\$DEL)で、表示されます。
非表示の計算式に、非表示にする条件式を指定します。

- 行追加ボタン ($ADD)： COUNTROW(見積明細)>=5
    - 見積明細のテーブル行が5以上の場合に、行追加ボタンを非表示
- 行削除ボタン ($DEL)： 型番
    - 型番が設定済みの場合、行削除ボタンを非表示
ESXiでドメインへの参加の解除に失敗する場合

ADドメインに参加しているESXiサーバで、ドメインへの参加の解除に失敗する問題について説明します。
以下のエラーメッセージが表示された場合の対応になります。
`ドメイン  EXAMPLE.COM への参加の解除に失敗しました: 「EXAMPLE\esx^admins」という名前のユーザーまたはグループは存在しません。`
`EXAMPLE.COM`, `EXAMPLE`は実際のドメイン名に置き換えてください。
このメッセージは、ユーザーまたはグループが ESXi ホストから削除されましたが、関連するパーミッションが正しく削除されなかったことを示しています。
# 対処方法
1. ESXiホストにSSH接続します。
2. "esx^admins"のための一時的なアカウントを追加します。
```sh:
/usr/lib/vmware/busybox/bin/busybox addgroup EXAMPLE\\esx^admins
```
3.管理GUIよりドメインへの参加の解除を実施します。
4.esx^admins "の臨時アカウントを削除します。
```
/usr/lib/vmware/busybox/bin/busybox delgroup EXAMPLE\\esx^admins
```
デザインパターンを教える前に

### はじめに

チームに配属された新人にGoFのデザインパターンを教えているときに気づいたことを書きます。

### 設計してもらってみると

1つのパターンを教えるときに以下の順番で進めています。
1. パターンを解説する
1. パターンが利用できそうな事例を考える
1. その事例を設計してみる
1. 設計したものを実装する

初めの解説以外はまず、新人に一度考えてみてもらってから、その考えをもとに教えていきます。

そして、新人の考えた事例をもとに設計をしてもらってみるといくつか気づいたことがありました。
* 設計時に配置したクラスの名前が抽象的（例.Sortといった対象が分からない名前)だったため、どんな役割のクラスか確認すると、答えられなかった
* クラスに複数の役割を持たせようとする(例.人をソートするクラスを作った時、比較まで同じクラスの役割にする)

### 設計について現状を確認する

上記のことがあったため、設計に関してどこまで教えてもらっているか確認すると、以下の通りでした。
* オブジェクト指向の概要は学習済み
* オブジェクト指向の設計原則(SOLID、GRASP)については知らない

### 対策

まず、聞き取った新人にはすぐにSOLIDやGRASPといった設計原則の概要を説明しました。
また、次の年から、デザインパターンを教える前に、新人にSOLIDやGRASPについて説明するようにしました。

### 対策の効果

1つのクラスに複数の役割を持たせること、抽象的な名前を付けることが減りました。
また、何がいけないかの指摘に関しても共通の認識を得、スムーズに説明できるようになりました。

### おわりに

今回のことから、原則を知っていることで、初歩的な間違いを防ぐことができることが割りました。
また、デザインパターンを学ぶ際に設計原則のどこを満たすかを示すことで、理解が深まるようになったため、今後とも原則とデザインパターンの関連を意識しながら教育を進めようと思います。
Tips #009 ラジオボタンの選択によってカードの表示をコントロールしたい話

https://qiita.com/Novskiiiiiiiiii/items/8eb71b5f0ea91c649002

ラジオボタンで「支払」を選択した場合のみ支払日のカードを表示させるように設定したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/0767ab2f-5d23-e3f2-57ea-7d308f1c9bc6.png)

このような場合は「支払日」カードの詳細設定プロパティのVisibleでコントロールする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/c68dd19b-298e-2326-7489-8e51f180fcc6.png)

初期値は
    Visible = true

設定した値は以下のような感じ。

    Visible = Switch(
        Radio1.Selected.Value,
        "支払", true,
        "請求", false
    )

ラジオボタンで選択した値が"支払"の場合はVisible = true
"請求"の場合はVisible = falseになる。

IF文でも出来そうだけど個人的にはSwitchの方が好み。

ちなみにIF文の場合はこんな感じで動いた。

    If(Radio1.Selected.Value="支払",true,false)

この場合は２択だったので"支払"じゃない場合はElseでFalseに出来るけど、
複数選択肢がある場合は、IFを入れ子にする必要があるのかなと。
興味がある方はやってみてください。

あ、肝心の動作結果貼り忘れた。

支払の場合は支払日が表示されて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/de30039e-9e32-d18c-4154-01fbe9e84e70.png)

請求の場合は支払日が表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/bd713595-e075-cd2f-c6dd-fb5e176f0944.png)

フォームの内容をリストに登録する際、ユーザーの入力項目によって
必須項目が可変になる場合に、このやり方を使うと不要な項目をユーザーに意識させる事がないので便利。

以上

https://qiita.com/Novskiiiiiiiiii/items/29575a556a6cf385fcb1
Laravelのコマンド一覧

# はじめに
以下はLaravelで使用できるコマンドの備忘録です

随時更新します

## プロジェクトを新規作成する
Laravelの新規プロジェクトを作成するコマンドですが、コマンドの実行には`composer`のインストールが必要です

`project-name` は、作成するプロジェクトの名前に置き換えてください

例：customer-management , user_profile_app など
```
composer create-project --prefer-dist laravel/laravel project-name
```

## Laravelサーバーを起動する
```
php artisan serve
```

## コントローラーを作成する
Laravelでコントローラーを作成するArtisanコマンドです
`ControllerName` は作成したいコントローラーの名前に置き換えます

例：CustomerController　など
```
php artisan make:controller ControllerName
```
### 追加オプションについて
リソースコントローラーを作成する場合は`--resource オプション`を追加します。
CRUD操作に必要なメソッド（index, create, store, show, edit, update, destroy）が自動的に生成されます。
```
php artisan make:controller ControllerName --resource
```
### マイグレーションを実行する
テーブルを実装するマイグレーションを実行できます

Laravelとデータベースの接続確認にも利用できます
```
php artisan migrate
```
supercellモデルをvscode copilotで作れる？

vscode copilot chatでCuのスラブモデル作ってみました。
なんか半分は教えたってる、という気分。

まあしかし、枠組みを作ってくれるので、ありがたいのはありがたい。
マニュアルを読む時代ではなくなってきたのかもしれないな。
あと５年もたてばかなりできるようになるんとちゃうかな。

```python
# 必要なライブラリをインポート
from pymatgen.core import Structure, Lattice
from pymatgen.io.vasp import Poscar
import plotly.graph_objects as go
import numpy as np

# Cuのfcc構造を取得
lattice = Lattice.cubic(3.615)  # Cuの格子定数
cu_structure = Structure(lattice, ["Cu", "Cu", "Cu", "Cu"], 
                         [[0, 0, 0], [0.5, 0.5, 0], [0.5, 0, 0.5], [0, 0.5, 0.5]])

# スラブの厚みを2倍にし、スラブとスラブの距離をスラブの厚みの2倍に設定
slab_thickness = 2 * lattice.c
vacuum_thickness = 2 * slab_thickness

# 100方向のスラブを生成
slab_sites = []
for z in np.arange(0, slab_thickness, lattice.c / 2):
    for x in np.arange(0, lattice.a, lattice.a / 2):
        for y in np.arange(0, lattice.b, lattice.b / 2):
            if (x + y + z) % lattice.a == 0:
                slab_sites.append([x, y, z])

# スラブ構造を作成
slab_lattice = Lattice.from_parameters(a=lattice.a, b=lattice.b, c=slab_thickness + vacuum_thickness, alpha=90, beta=90, gamma=90)
slab_structure = Structure(slab_lattice, ["Cu"] * len(slab_sites), slab_sites, coords_are_cartesian=True)

# POSCARファイルを書き出し
poscar = Poscar(slab_structure)
poscar.write_file("POSCAR")

# プロットの初期化
fig = go.Figure()

# スラブをx, y, z方向に周期的に描画
nx, ny, nz = 2, 2, 3  # x, y, z方向の周期数
for i in range(nx):
    for j in range(ny):
        for k in range(nz):
            for site in slab_structure:
                fig.add_trace(go.Scatter3d(
                    x=[site.coords[0] + i * slab_structure.lattice.a],
                    y=[site.coords[1] + j * slab_structure.lattice.b],
                    z=[site.coords[2] + k * slab_structure.lattice.c],
                    mode='markers',
                    marker=dict(size=5, color='green'),
                    name='Cu Atoms'
                ))

# レイアウトを設定
fig.update_layout(
    scene=dict(
        xaxis_title='X',
        yaxis_title='Y',
        zaxis_title='Z',
        aspectmode='data',  # アスペクト比をデータに基づいて設定
        camera=dict(
            projection=dict(
                type='orthographic'  # 遠近法を使わない
            )
        )
    ),
    title='3D View of Cu Slab Model with Periodicity'
)
fig.update_layout(width=800, height=800)
#fig.update_layout(scene_aspectmode='cube')

# プロットを表示
fig.show()
```
Tips #008 DataCardの高さを変更するのに苦戦した話

https://qiita.com/Novskiiiiiiiiii/items/c2adbb5b37b0a339505d

一番左のタイトルのカード、こんなに高さいらないな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/4f1d1cee-ce81-5440-0a09-9436d4a95254.png)

ということでフォーム内に配置されたカードの高さを任意のサイズに変えたいなと思い、

    ディスプレイ > サイズ > Y=269
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/e4811025-4ede-6398-b706-54f60a312f63.png)

の数値を変えたり、

    詳細設定 > Height = 101
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/c7767bfe-8a36-8c6b-d26d-a2ce0e6e4e51.png)

の数値を変えたりしてみたけど、どうにも上手くいかない。

調べると公式にこのようなくだりがあった。

    Height プロパティは各カードの高さを制御します。
    カードは Height の WidthFit に相当するものがあり、それは常に true に設定されています。 
    この動作をオフにすることはできないので、カードの高さを変更することは困難になる場合があります。
    1 行内のすべてのカードが、最も高さのあるカードと同じ高さで表示されます。

なるほどフォーム内にカードが複数列並んでいる場合は、一番高さのあるカードに自動的に調整されるのか。

なので一番高さを取っていた添付ファイルのサイズを調整してみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/dc47d195-a352-6821-ad7c-d003ac0a2ac7.png)

おお、タイトルの高さも変わったではないか！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/19031639-5df4-ca87-30b3-1e4a2138de68.png)

理屈はなるほど理解できたけど、やや柔軟性に欠ける印象。
まあクリティカルな話でもないし、与えられた手札で戦っていくしかない。

小さなモヤモヤがまたひとつ解消されましたとさ。

https://qiita.com/Novskiiiiiiiiii/items/0e2c8405fedd4fcb2088
Laravelのルーティング基本知識

# はじめに
この記事はルーティングについての備忘録になります

誤りや加筆が必要な場合は随時更新します

## コントローラーへのルーティングについて
作成したコントローラーにルートを設定します。indexメソッドを実行したい場合は以下のようにルーティングを追加します。
```web.php
use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
```

## ルーティングファイルについて
Laravelのルーティングは`routes/web.php` または `routes/api.php`で定義します。

```web.php
use Illuminate\Support\Facades\Route;

Route::get('/welcome', function () {
    return 'Welcome to Laravel!';
});
```
このルートは、/welcomeにGETリクエストを送ると、「Welcome to Laravel!」というメッセージを表示します

## apiのルーティングについて
apiへのルーティングは`api.php`に記述されておりましたが、Laravel11ではapi.phpが削除されているため、APIへのルーティングも`web.php`に書くことができます

しかし、`構造の明確化`やURLに`api/`を含みたい場合などは、以下のコマンドでapi.phpを追加することができます
```
php artisan install:api
```

https://qiita.com/EasyCoder/items/161f7d7049914d964551

## ルートパラメータについて
ルートパラメータを使うことで動的な値をURLに含めることができます
```web.php
Route::get('/user/{id}', function ($id) {
    return "User ID: " . $id;
});
```

## 名前付きルートについて
名前付きルートを使うと、特定のルートに名前を付け、その名前でアクセスすることができます
```web.php
Route::get('/about', function () {
    return 'About Us';
})->name('about');

// 名前付きルートを使ってリンクを生成する
// <a href="{{ route('about') }}">About Us</a>
```

## グループルーティング
複数のルートに共通の設定を適用するために、グループルーティングを使います
```web.php
Route::prefix('admin')->group(function () {
    Route::get('/dashboard', function () {
        return 'Admin Dashboard';
    });

    Route::get('/settings', function () {
        return 'Admin Settings';
    });
});
```
この設定では、/admin/dashboardや/admin/settingsのように、すべてのルートがadminプレフィックスを持ちます

## ミドルウェアの使用
特定のルートに対して、リクエスト処理の前後に何らかの処理を行いたい場合に、ミドルウェアを使用します

```web.php
Route::middleware(['auth'])->group(function () {
    Route::get('/profile', function () {
        return 'User Profile';
    });
});
```
ここでは、authというミドルウェアが適用され、認証されたユーザーのみが/profileへアクセスできるようになります

認証されていないユーザーはauthによって設定されたルートにリダイレクトされます
Tips #007 ラジオボタン内の項目名を変更したい話

https://qiita.com/Novskiiiiiiiiii/items/b7de5ad78d840cd27dec

フォームに配置したラジオボタンの項目名を変えたくなった。
というより初期値のまま使う人は少数派だろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/71f46c08-9288-a862-ba30-8bfcfdb02552.png)

調べるとここで設定するらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/2b54c0c0-4aa4-6db1-9415-563a409dc5aa.png)

今回は固定値で2択にしたかったので

    RadioSample

から

    ["選択肢1", "選択肢2"]

というように変更したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/52025f69-52ea-aca1-45e6-7d07e69da75a.png)

ラジオボタン内の名称も正常に変更された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/44f49096-86d4-0a0b-1539-57febfe7f48d.png)

他にも、動的にアイテムを変更する事も出来るらしい。
コレクションを使ったり、データソースから選択肢を取得する事も可能だと。

必要であればやってみようと思う。

以上

https://qiita.com/Novskiiiiiiiiii/items/8eb71b5f0ea91c649002
CSSでタグを選択する5つの方法

### CSSでタグを選択する5つの方法

CSSでは、さまざまなセレクタを使用して特定のタグを選択できます。以下は、`<img>` タグを選択するための5つの一般的な方法です。

#### 1. タグによる選択

すべての `<img>` タグを選択したい場合は、シンプルなタグセレクタを使用します：

```css
img {
    /* ここにスタイルを追加 */
    width: 50px;
    height: 50px;
}
```

#### 2. クラスによる選択

`<img>` タグに特定のクラスがある場合、クラスセレクタを使用できます：

```html
<img class="emoji" src="emoji.png" alt="絵文字">
```

```css
.emoji {
    /* ここにスタイルを追加 */
    width: 50px;
    height: 50px;
}
```

#### 3. IDによる選択

`<img>` タグに特定のIDがある場合、IDセレクタを使用できます：

```html
<img id="smiley" src="smiley.png" alt="スマイリー">
```

```css
#smiley {
    /* ここにスタイルを追加 */
    width: 50px;
    height: 50px;
}
```

#### 4. 属性による選択

`<img>` タグの特定の属性に基づいて選択することもできます。たとえば、`src` 属性に基づいて選択できます：

```css
img[src="emoji.png"] {
    /* ここにスタイルを追加 */
    width: 50px;
    height: 50px;
}
```

#### 5. 擬似クラスによる選択

特定の位置にある `<img>` タグ（たとえば、最初または最後）を選択したい場合、擬似クラスセレクタを使用できます：

```css
img:nth-child(1 of img) {
    /* 親要素の最初の img を選択 */
    border: 2px solid red;
}

img:nth-last-of-type(1) {
    /* 親要素の最後の img を選択 */
    border: 2px solid green;
}
```

### まとめ

選択方法は、選択したい具体的な状況によって異なります。タグ、クラス、ID、属性、または位置に基づいて、これらのセレクタを柔軟に使用してスタイルを制御できます。
リピーターハブ

>リピータ ハブは、`送られてきたデータをすべての端末にいったん送信`します（送信先以外の端末では送られたデータは無視されます）。端末Aから端末Bにデータを送信している間は、ほかの端末同士が通信を行うことはできません。

http://buffalo.jp/qa/lan/make/b2b00040/#:~:text=%E3%83%AA%E3%83%94%E3%83%BC%E3%82%BF%20%E3%83%8F%E3%83%96%E3%81%AF%E3%80%81%E9%80%81%E3%82%89%E3%82%8C%E3%81%A6%E3%81%8D%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E7%AB%AF%E6%9C%AB%E3%81%AB%E3%81%84%E3%81%A3%E3%81%9F%E3%82%93%E9%80%81%E4%BF%A1%E3%81%97%E3%81%BE%E3%81%99%EF%BC%88%E9%80%81%E4%BF%A1%E5%85%88%E4%BB%A5%E5%A4%96%E3%81%AE%E7%AB%AF%E6%9C%AB%E3%81%A7%E3%81%AF%E9%80%81%E3%82%89%E3%82%8C%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E7%84%A1%E8%A6%96%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%EF%BC%89%E3%80%82%E7%AB%AF%E6%9C%ABA%E3%81%8B%E3%82%89%E7%AB%AF%E6%9C%ABB%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E9%80%81%E4%BF%A1%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E9%96%93%E3%81%AF%E3%80%81%E3%81%BB%E3%81%8B%E3%81%AE%E7%AB%AF%E6%9C%AB%E5%90%8C%E5%A3%AB%E3%81%8C%E9%80%9A%E4%BF%A1%E3%82%92%E8%A1%8C%E3%81%86%E3%81%93%E3%81%A8%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

>リピーターハブのリピーターとは、ケーブルでデータを伝送する際に中継機器の役割を果たすものです。さらにリピーターには、`受信した信号を増幅・整形したうえで送出する`機能もあります。ハブにも同様に中継機器の側面もありますが、どちらかといえば複数のケーブルを接続して、ネットワークにつながるデバイスの数を増やす機器と考えられています。つまりリピーターハブとは、複数のデバイスをネットワークに接続するための中継機器です。
>
>ハブにはリピーターハブのほかにもスイッチングハブがあります。リピーターハブでは、ネットワークに接続されたデバイスAからの要求を受信すると、デバイスAを含むデバイスB、Cなどのすべてのデバイスに応答（電気信号を中継）します。これに対してスイッチングハブの場合は、デバイスAに対してのみ応答し、ほかのデバイスBやCには応答しません。以前はリピーターハブも使われていましたが、最近ではハブといえば、ほとんどの場合、スイッチングハブを指しています。

https://www.ntt.com/business/services/rink/knowledge/archive_05.html#:~:text=%E3%83%AA%E3%83%94%E3%83%BC%E3%82%BF%E3%83%BC%EF%BC%88%E3%83%AA,%E6%8C%87%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82
Tips #006 ラジオボタンの配置を横並びにしたい話

https://qiita.com/Novskiiiiiiiiii/items/d08ce54f098fccd04225

フォームにラジオボタンを配置したら縦に並んでた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/71611bfe-2876-e858-9278-ad8a009f970e.png)

横にしたいと思って調べた結果、変更すべき箇所がわかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/bcd00ac2-2c3a-d95d-d053-552f21f91a23.png)

ここを

    Layout.Vertical

から

    Layout.Horizontal

に変更すればよいらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/a2d9b443-7843-7311-5d09-878096224658.png)

以上

https://qiita.com/Novskiiiiiiiiii/items/c2adbb5b37b0a339505d
Tips #005 そのオブジェクト、消すべからず

https://qiita.com/Novskiiiiiiiiii/items/f4c45b0b20d0f1bb71e6

フォームいじってて謎のオブジェクトがあったので、
片っ端から削除してたんだけど、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/a78f3bab-81ff-4258-6338-1498d6c498d1.png)

ErrorMessageという極めて重要なオブジェクトだったので、
よほど理由がない限りは削除しない事をおすすめしたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/6a420ae2-652a-2d28-ad21-6c0a0e3ee3a8.png)

僕はそれで作り直すハメになりました。

涙。

https://qiita.com/Novskiiiiiiiiii/items/b7de5ad78d840cd27dec
【Atcoder解法検討】ABC301 A~D Python

## A - Overall Winner
#### 問題ページ : [A - Overall Winner](https://atcoder.jp/contests/abc301/tasks/abc301_a)
### 考察 
文字列S中の"A"及び"T"の数をかぞえ、異なるなら大きい方、同じであるなら最後の勝者でない方、を出力。
### コード
```python
N = int(input())
S = input()

A, T = 0, 0
for i in range(N):
    if S[i] == "A":
        A += 1
    else:
        T += 1

if A > T:
    print("A")
elif A < T:
    print("T")
elif A == T and S[-1] == "T":
    print("A")
elif A == T and S[-1] == "A":
    print("T")
```

## B - Fill the Gaps
#### 問題ページ : [B - Fill the Gaps](https://atcoder.jp/contests/abc301/tasks/abc301_b)
### 考察 
愚直実装で計算量的にはOK。ただし、操作毎に数列$A$を処理すると$index$の扱い等処理が面倒なので、$A[i]$と$A[i+1]$の間に挿入する数列を$B[i]$（空集合の場合もある）として求め最後にマージします。
### コード
```python
N = int(input())
A = list(map(int, input().split()))

B = [ [] for _ in range(N-1)]
for i in range(N-1):
    if A[i] < A[i+1]:
        B[i] = list(range(A[i]+1,A[i+1]))
    elif A[i] > A[i+1]:
        B[i] = reversed(list(range(A[i+1]+1,A[i])))

ans = []
for i in range(N-1):
    ans += [A[i]]
    ans += B[i]
ans += [A[N-1]]

print(*ans)
```

## C - AtCoder Cards
#### 問題ページ : [C - AtCoder Cards](https://atcoder.jp/contests/abc301/tasks/abc301_c)
### 考察 
並び変えて一致するか否かを判定するのに、分布（各文字が何文字あるか）だけみれば良いのは鉄則です。
"atcoder"以外の文字はSとTで各文字数が一致している必要があります。
"atcoer"に含まれる文字は各文字数の違いが"@"の数で吸収できるかで判定します。
### コード
```python
S = input()
T = input()

L =list("atcoder")
LL = list("abcdefghijklmnopqrstuvwxyz")
scnt = [0] * 26
tcnt = [0] * 26
sat = 0
tat = 0

for s in S:
    if s == "@":
        sat += 1
    else:
        scnt[ord(s)-97] += 1

for t in T:
    if t == "@":
        tat += 1
    else:
        tcnt[ord(t)-97] += 1

flag = True
for l in LL:
    if l not in L and scnt[ord(l)-97] != tcnt[ord(l)-97]:
        flag = False
    elif l in L and scnt[ord(l)-97] > tcnt[ord(l)-97]:
        tat -= scnt[ord(l)-97] - tcnt[ord(l)-97]
    elif l in L and tcnt[ord(l)-97] > scnt[ord(l)-97]:
        sat -= tcnt[ord(l)-97] - scnt[ord(l)-97]

if sat <0  or tat <0 or sat != tat:
    flag = False

if flag:
    print("Yes")
else:
    print("No")
```

## D - Bitmask
#### 問題ページ : [D - Bitmask](https://atcoder.jp/contests/abc301/tasks/abc301_d)
### 考察 
「N以下」という大小判定が必要な問題は最上位の桁(bit)から処理していきます。着目している"?"を1にして、それ以外の未決定の"?"を0にしたものがN以下か判定します。N以下であれば1を入れていき、そうでなければ0を入れていきます。0を入れてもN以下にならないケースもあるのですがこれは最後に判定すれば十分です。
### コード
```python
S = list(input())
N = int(input())
num = len(S)
pos = []

for i in range(num):
    if S[i] == "?":
        pos.append(i)
        S[i] = "0"

for p in pos:
    T = S.copy()
    T[p] = "1"
    if int("".join(T), 2) <= N:
        S[p] = "1"

ans = int("".join(S),2)
if ans <= N:
    print(ans)
else:
    print(-1)
```


青色diff以上は後日挑戦
WordPressのビジュアルエディター（TinyMCE）にスタイルセレクトボックスを追加・カスタマイズする方法

WordPressのビジュアルエディターは、記事やページの編集をWYSIWYG（What You See Is What You Get）形式で行えるため、多くのユーザーに愛用されています。しかし、デフォルトの状態では利用できる書式設定が限られているため、より高度なスタイリングを行いたい場合には機能が不足していると感じることがあります。

今回は、WordPressのビジュアルエディター（TinyMCE）にスタイルセレクトボックスを追加し、カスタマイズする方法について詳しく解説します。

**tinymce-custom.php**
[https://gist.github.com/sarap422/1d0e7d153c732b02801c686b2906878a](https://gist.github.com/sarap422/1d0e7d153c732b02801c686b2906878a)

## スタイルセレクトボックスとは

スタイルセレクトボックスとは、ビジュアルエディターのツールバーに追加される書式設定メニューです。このメニューを使用することで、テキストやブロック要素に対して、あらかじめ定義されたスタイルを簡単に適用することができます。

## カスタマイズのメリット

1. **作業効率の向上**
   - よく使用するスタイルをワンクリックで適用可能
   - HTMLやCSSの知識がなくても、一貫性のあるデザインを実現
   - コピー＆ペーストの手間を削減

2. **デザインの一貫性確保**
   - サイト全体で統一されたスタイルを維持
   - 誤ったクラスの適用を防止
   - ブランドガイドラインに沿ったデザインの実装が容易

3. **保守性の向上**
   - スタイルの一元管理が可能
   - CSSの変更だけで全体のデザインを更新可能
   - 複数の編集者がいても統一されたスタイルを維持

## 実装方法

### 1. 基本的な実装

まず、`functions.php`またはカスタムプラグインに以下のコードを追加します：

```php
// TinyMCEにスタイルセレクトボックスを追加
function add_styles_to_tinymce_buttons($buttons) {
  // スタイルセレクトボックスが既に存在する場合は削除
  $buttons = array_diff($buttons, array('styleselect'));
  
  // スタイルセレクトボックスを先頭に追加
  array_unshift($buttons, 'styleselect');
  
  return $buttons;
}
add_filter('mce_buttons', 'add_styles_to_tinymce_buttons');
```

### 2. スタイルの定義

次に、スタイルセレクトボックスに表示するスタイルを定義します：

```php
if (!function_exists('initialize_tinymce_styles')) :
  function initialize_tinymce_styles($init_array) {
    $style_formats = array(
      // フォントファミリー
      array(
        'title' => 'フォントファミリー',
        'items' => array(
          array('title' => 'ゴシック体', 'selector' => '*', 'attributes' => array('lang' => 'ja-GP')),
          array('title' => '明朝体', 'selector' => '*', 'attributes' => array('lang' => 'ja-MP')),
        ),
      ),
      
      // ボタンスタイル
      array(
        'title' => 'ボタン',
        'items' => array(
          array('title' => 'プライマリーボタン', 'inline' => 'a', 'classes' => 'button is-primary'),
          array('title' => 'セカンダリーボタン', 'inline' => 'a', 'classes' => 'button is-secondary'),
        ),
      ),
      
      // その他のスタイル定義...
    );
    
    $init_array['style_formats'] = json_encode($style_formats);
    return $init_array;
  }
endif;
add_filter('tiny_mce_before_init', 'initialize_tinymce_styles', 10000);
```

## カスタマイズ可能な主な要素

1. **インライン要素**
   - テキストの装飾（太字、斜体、下線など）
   - フォントサイズ
   - テキストカラー

2. **ブロック要素**
   - 見出し（h1〜h6）
   - 段落スタイル
   - マージン・パディング

3. **特殊要素**
   - ボタン
   - アラート
   - 引用
   - カスタムブロック

## 実装時の注意点

1. **優先順位の設定**
   - フィルターのプライオリティ値（上記例では10000）を適切に設定
   - 他のプラグインとの競合を避ける

2. **パフォーマンスへの配慮**
   - 必要最小限のスタイルのみを定義
   - 複雑すぎる条件分岐を避ける

3. **メンテナンス性**
   - コメントを適切に記述
   - 命名規則の統一
   - モジュール化を心がける

## まとめ

WordPressのビジュアルエディターをカスタマイズすることで、コンテンツ作成の効率を大幅に向上させることができます。特に、複数の編集者が存在する環境や、デザインの一貫性が重要なプロジェクトでは、スタイルセレクトボックスの活用が有効です。

ただし、カスタマイズを行う際は、ユーザビリティとメンテナンス性のバランスを考慮することが重要です。必要以上に複雑なカスタマイズは避け、実際のユーザーのニーズに基づいた実装を心がけましょう。

## 参考リンク

- [WordPress Codex - TinyMCE](https://codex.wordpress.org/TinyMCE)
- [TinyMCE Documentation](https://www.tiny.cloud/docs/)
- [WordPress Developer Resources](https://developer.wordpress.org/)
【機械学習初心者向け】標準化・正規化・正則化など

# 初めに
機械学習を学ぶ上で、いくつかデータを整備する手法がありますので
簡単にみてきましょう。はじめにまず、「特徴量」というものは何かとおさらいしていきましょう。
特徴量とは、分析対象データの中の、予測の手掛かりとなる変数のことで、気温だったり購入数であったり、様々な統計量を指します。

## 標準化
　特徴量の平均を0、分散が1になるように変換することです。特徴量は標準正規分布に従うようになります。

## 正規化
　データを利用しやすくするために、ルールに基づき、データを変形させることを言います。例えば、各特徴量を最大値で割って、各特徴量が0〜1の値になるように変形させる方法などがあります。
　データベースでもテーブルの正規化という考え方がありますね。テーブルの不要な行を削除したり、重複行を削除したりしますが、機械学習においても同じようにデータを扱いやすいように変形させることが「正規化」です。 

## 正則化とは
　過学習を防ぐための手法の1つで、パラメータ（重み）に制限をかけることで、複雑になりすぎたモデルをシンプルなモデルにしていくことです。

## 白色化
　各特徴量を無相関化し、平均が0、分散が1になるように変換すること（標準化）です。
Tips #004 フィールドが横長なので狭くして複数列表示させたい話

https://qiita.com/Novskiiiiiiiiii/items/3265450763614154d284

タイトルも日付もそんなに長くなくていいし！
と思ってテキスト入力フィールドの長さを短くしようと思った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/94f1e784-8dfe-a898-f2be-783c6b08d144.png)

ここをグイーとやって調整してもよかったけどそういうの嫌いなのでサイズで変更しようと試みた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/793d2f26-51e9-30c9-1f24-2a2869addcb0.png)

ところがどっこい変更した項目に「fx」とあるじゃないか。なんじゃこりゃ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/4a253782-179d-3690-9b7a-4a1171048e25.png)

関数を見るとどうやら「親 -60」という風に可変になっているようだ。
なるほどフォームの大きさを変えても柔軟に対応できるというわけだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/fc979fcf-89ed-2fd1-7a94-8bbe75db8d44.png)

ということで項目を２列にしたいと思ったので、

    Parent.Width -60

を

    Parent.Width / 2

にしてみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/31771e18-12a6-e097-6b92-b5d8ec143d72.png)

おお…！

が、そういうことじゃないんだよな、と思って調べてみたら、ありました。
列数の指定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/9715e50a-143f-c17f-e0eb-e916a929c84b.png)

ここを思い切って4列にしてみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/05956bed-32a5-341f-0410-d1fde026dfe3.png)

いいんじゃないかな！

今回は以上。

https://qiita.com/Novskiiiiiiiiii/items/d08ce54f098fccd04225
【初学者】AWS Lambdaについて

Lambdaについて全く知らなかったので、学んだことの概要をアウトプットしたく記事にしました。

## AWS Lambdaとは？
Lambdaは、「サーバーレスコンピューティングサービス」です。
サーバーレスとは、ユーザーがサーバーの管理や運用を意識せずに運用することができるサービスで、Lambdaの実行環境はAWSが提供してくれます。

### どんなときに使う？

Lambdaは、次のような状況で便利です。

1. **アクセスが予測できない時**：Lambdaはイベント駆動型なので、特定のイベント（トリガー）が発生したときに自動的にコードを実行します。そのため、EC2のように1日中仮想サーバーのインスタンスを立ち上げて置く必要がなく、アクセスした回数分だけのコストで済みます。
2. **短時間で完了するバックエンド処理**：Webサービスのバックエンドとして使用できます。Lambdaは必要なときにコードを実行し、リクエスト数に応じて自動でスケールするので、インフラ管理を気にせずアプリケーションロジックに集中できます。

### メリットとデメリット

- **メリット**
  - **スケーラブル**：Lambdaは自動でスケールするため、急にアクセスが増えた場合でも自動で対応可能。
  - **コスト効率**：使った時間分だけ料金が発生するため、長時間動作しないアプリケーションに適している。
  - **インフラ管理不要**：サーバーの設定やメンテナンスを気にすることなく、コードに集中できる。

- **デメリット**
  - **実行時間の制限**：Lambdaは実行時間に制限があるため、長時間の処理には向いていない（最大15分）。
  - **エラーの解析が難しい**：内部で行われる処理の大部分は隠されているため、Lambdaはモニタリングやエラー解析が難しいといわれている。
##

まだまだ勉強中で拙い部分もあるかと思いますが、自分の理解を深めるために書きました。読んでいただきありがとうございました！
### 参考記事
https://zenn.dev/y_yuita/articles/1953af7bf29d24

https://magazine.techacademy.jp/magazine/22675


https://aws.amazon.com/jp/lambda/features/?pg=ln&sec=hs
【ChatGPT＋DALL-E3】日本語がわからないDALL-E3？


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

　今回は、“DALL-E3は日本語がわからない”がテーマです。

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

　サム・アルトマンが
　　X-Twitterにポストしました。
　　　[サム・アルトマンのポスト](https://x.com/sama/status/1848486309376991316?t=YgwILuG-1p53VeyRZ6d4cw&s=19)
```Text:DeepL翻訳
おっ、ChatGPTの2歳の誕生日は来月だ！
誕生日プレゼントに何を贈ろうか...。
```

　2022年11月30日に
　　ChatGPTが、お披露目され、
　　　私たちに生成AIという世界が
　　　　あることを教えてくれました。

　サムのプレゼントは
　　なんでしょうね😸
***
　さて、本題に入ります。

　今回は、
　　「DALL-E3は日本語がわからない」
　　　という内容を書きます。

　みなさんは、
　　“DALL-E3は日本語がわかる”と
　　　思っていませんか？

　日本語で指示できるので
　　そう思いがちです。

　実際には、
　　ChatGPTが仲介して
　　　英訳してから
　　　　不足している要素を追加
　　　　　しています。

　このことは、今年の6月の記事で
　　ChatGPTに尋ねた
　　　DALL-E3までの工程が
　　　　あります。
[【ChatGPT＋DALL-E3】Promptの流れ。](https://qiita.com/kabumira/items/d3b2f38b92cfb567b464)
***

　ここで少し趣旨が
　　違うかもしれませんが、
　　　Promptを変えないようにも
　　　　指示ができます。

　例をお見せしましょうか。
　　まずはふつうに。
***
***●user***
クルマのボンネットに横たわる女性。アスペクト比は1:1で描画

***ChatGPT***
（指定どおり）

***●user***
英語プロンプト出力。略さずに和訳。

***ChatGPT***
### 英語プロンプト:
"A scene showing a woman lying gracefully on the hood of a car. The car is sleek and modern with smooth curves, and the woman is elegantly posed, wearing a flowing dress that drapes over the side of the vehicle. The background is simple, perhaps a twilight sky, emphasizing the scene with a touch of cinematic elegance. The lighting casts soft shadows, highlighting the contours of both the car and the woman."

### 和訳:
「女性が車のボンネットに優雅に横たわっているシーン。車はなめらかでモダンな曲線を持ち、女性はエレガントなポーズを取り、流れるようなドレスを着ており、車の側面に垂れ下がっている。背景はシンプルで、たぶん黄昏の空が広がり、映画のような優雅さがシーンを強調している。照明は柔らかい影を投げかけ、車と女性の輪郭を引き立てている。」
***
　このとおり、
　　最初の一文以外は
　　　すべてChatGPTが
　　　　盛っています。

　次に
　　“Promptを変更するな”という感じで
　　　指示します。

　英訳を指示していますが、
　　日本語のまま、DALL-E3に渡すと
　　　関係ない画像が生成されます😅
　　　　日本語をわかっていないのが
　　　　　わかりますね。
***
***●user***
“クルマのボンネットに横たわる女性。アスペクト比は1:1で描画”
このPromptを変えずに英訳してDALL-E3に渡して描画してください。

***ChatGPT***
（詳細はDALL-E3が補完）

***●user***
英語プロンプト出力。略さずに和訳。

***ChatGPT***
### 英語プロンプト:
"A woman lying on the hood of a car. The aspect ratio is 1:1."

### 和訳:
「クルマのボンネットに横たわる女性。アスペクト比は1:1。」
***
　となります。

　これは
　　“そのままならば、どうなるか”を
　　　示しているに過ぎません。

　普段使うようなものでは
　　ありませんので、
　　　参考にする程度でしょう。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Pythonのデバッグ時とexe化後で異なるモジュールインポート問題の解決法

## はじめに

myproject/の`main.py`で

```py
from myproject.core import some_function
```
と
```py
from core import some_function
```
のデバッグ時とexe化後の状態でインポートの挙動の違いとその対処法についてのメモ

## 概要
Pythonのコーディングで、デバッグ時には問題なく動作していたインポートが、exe化した後に失敗することがありました。
今回は、自分が遭遇した `ModuleNotFoundError` について、その原因と解決方法を共有します。

## プロジェクト構成

その時のフォルダ構成です。
`main.py`が、同じディレクトリの「core」フォルダ内の`util.py`をインポートして使おうとしていました。

```bash
MyProject/
│
├── myproject/
│   ├── main.py
│   └── core/
│       ├── __init__.py
│       └─── util.py 
│ 
└── README.md
```

### `main.py`のコード例

```py
import os
import sys

from myproject.core.util import some_function

def main():
    some_function()

if __name__ == "__main__":
    main()
```

このコードはexe化したときには正しくインポート出来ていましたが、デバッグ時には次のようなエラーが発生しました。

```py
ModuleNotFoundError: No module named 'myproject'
```

※逆に、以下のコードだとデバッグ時ではインポート出来ましたが、exe化するとインポートに失敗しました。

```py
from util import some_function
```

## 原因

以下のことが関係しているのかと思いました。

- exe化のプロセス（`PyInstaller`などを使う場合）では、Pythonのファイルシステムのパスに関する設定が異なるため、手動でパスを調整する必要がある
- exe化すると、プロジェクトがバンドルされ、ディレクトリ構造が変わるため、相対パスでのインポートは注意が必要


## 解決方法

この問題に対処法として、Pythonがモジュールを探すパスを明示的に設定する必要があり、`sys.path`を使って、モジュールを含むディレクトリを手動で追加しました。

### 修正後の`main.py`のコード

```py
import os
import sys

# フォルダの親ディレクトリをパスに追加する
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from myproject.core.util import some_function

def main():
    some_function()

if __name__ == "__main__":
    main()
```

## まとめ

- デバッグ時とexe化後のモジュールインポートエラーは、`sys.path`の違いによって引き起こされることがあるので、問題が起こるようならば`sys.path.append()`で明示的にパスを追加することで解決できた
    - デバッグ時とexe化後で同じ挙動をするのを確認できた
- exeとして動いているのか、.pyとして動いているのか、で「自分の位置」の情報が変わるらしいということを知れた
ブリッジとは

https://www.panduit.co.jp/wp-content/uploads/2024/01/4-1.jpg

↑こんな感じのものかな、見つからなかった。

> `ブリッジはデータリンク層に位置`し、`宛先MACアドレスによって通信を制御する装置`です。`通信のたびに、あるMACアドレスをもつノードがどのポートに接続されているか学習し、MACアドレステーブルに記録`します。これにより、次回に通信があったとき、必要なポートにだけ通信を中継できるので、無駄なトラフィックは発生させず、`ネットワーク利用率を低下`できます。またブリッジは、コリジョンドメイン（コリジョンが検出できる範囲）を分割するため、`正確にコリジョンを検出`します。

https://gihyo.jp/book/2023/978-4-297-13865-3

>ブリッジとは、パケットを調べて`宛先が同じセグメント内にあるか別のセグメント内にあるかを判別`するものです。
>
>　●`宛先が同じセグメント内の場合は、その宛先にパケットを送信`する。
>
>　●宛先が相互接続した`別のセグメントにあることが分かった場合は、対象のセグメントにパケットを転送`する。
>
>ブリッジは`全てのクライアントに対して、パケットを送信`して`目的のクライアントだけがパケットを受け取り`ます。
>
>仮にホストがブリッジで接続されたネットワーク上にある、別のホストに向けてIPデータグラムを送ったとします。
>
>そのホストがブリッジの存在を意識することなく、相手に向けて送出すればそのデータグラムはブリッジをまたいで相手に転送される仕組みです。

https://www.panduit.co.jp/column/naruhodo/16258/#:~:text=%E3%83%96%E3%83%AA%E3%83%83%E3%82%B8%E3%81%A8%E3%81%AF%E3%80%81%E3%83%91%E3%82%B1%E3%83%83%E3%83%88,%E3%81%95%E3%82%8C%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A7%E3%81%99%E3%80%82

### MACアドレステーブルとは？
> 学習したMacアドレスとポートの対応を記録しておく表。ノードの電源断や構成変更に対応するため、学習内容には生存期間が設定されている。

* 宛先MACアドレスによって通信を制御する装置とは？
### ブリッジの動作とは？
> 1.宛先Macアドレスを基にMacアドレステーブルを参照する
    2.宛先MACアドレスの接続ポートが、フレームを受信したポートと別ポートであれば、そのポートにフレームを送信し、同一ポートであればフレームを破棄する
    3.宛先Macアドレスが記憶されていない場合やブロードキャストアドレス(FF-FF-FF-FF-FF-FF-FF)の場合は、受信ポート以外のすべてのポートにフレームを送信する。

https://gihyo.jp/book/2023/978-4-297-13865-3

接続ポートと接続されているMacアドレスを記憶して別のセグメントであればそこに送り、同じであれば破棄する。知らないMacアドレスは受信ポート以外全てに流す。

### ポートとは
https://qiita.com/masatom86650860/items/bceb04183ad64632aaf2#lan%E3%83%9D%E3%83%BC%E3%83%88lan%E3%82%AB%E3%83%BC%E3%83%89

### コリジョンとは？
>コリジョン（Collision）は、衝突や激突といった意味の英単語です。イーサネットや無線LANの同一伝送路を共有する複数の端末が、`同時に信号を発信した際にデータが衝突`することを表します。コリジョンが発生するとデータの送信が正しくできず、`実効伝送速度の低下`などの現象が起こります。 

コリジョンが起きると伝送速度の低下が起きるのか。コリジョンドメインを把握することでコリジョンを再び起きることを防ぐのか。

# 感想
スイッチのある意味がわからない
Go言語 初心者用 コードの書き方まとめ

# はじめに
Go（Golang）は、シンプルで効率的な開発を可能にするプログラミング言語！らしい、、、
本記事ではGo初心者の方に向けて、Goで開発を行う際に知っておくべき基礎的なコードの書き方について解説します:koala:

# 基本的なコードの書き方
1. パッケージ宣言とインポート
Goのファイルはパッケージ宣言から始まります。必要な外部パッケージはimport文を使ってインポートします。
    ```go
    package main
    
    import (
        "fmt"
    )
    ```
    <br>
2. エントリーポイント
Goプログラムは、mainパッケージのmain関数から実行されます。
    ```go
    func main() {
        fmt.Println("Hello, World!")
    }
    ```  
    <br>
3. 変数と定数の宣言
変数と定数はvarおよびconstキーワードを使って宣言します。
    ```go
    var x int = 10
    const pi = 3.14
    ```
    <br>
4. 関数
関数はfuncキーワードを使って定義します。
    ```go
    func add(a int, b int) int {
        return a + b
    }
    ```
    <br>
5. 構造体
構造体はデータをカプセル化するために使います。
    ```go
    type Person struct {
        Name string
        Age  int
    }
    ```
    <br>
6. メソッド
構造体にメソッドを追加できます。
    ```go
    func (p Person) Greet() {
        fmt.Println("Hello, my name is", p.Name)
    }
    ```
    <br>
7. エラーハンドリング
Goではエラーハンドリングが重要です。複数の戻り値を利用してエラーを処理します。
    ```go
    func divide(a, b float64) (float64, error) {
        if b == 0 {
            return 0, fmt.Errorf("division by zero")
        }
        return a / b, nil
    }
    
    result, err := divide(4, 2)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
    ```
    <br>
8. パッケージの使い方
標準ライブラリや外部パッケージを活用することができます。  
    ```go
    import (
        "math/rand"
        "time"
    )
    
    func main() {
        rand.Seed(time.Now().UnixNano())
        fmt.Println("Random number:", rand.Intn(100))
    }
    ```
    <br>
9. Go Modules
Go Modulesを使うことで依存関係を管理できます。
    ```shell
    $ go mod init myapp
    ```
    
# まとめ
本記事で紹介した基礎的なコードが、Go初心者の方の手助けになれたら幸いです。
自分もまだまだGo初心者なので間違っていることがあれば指摘いただければと思います。
Lambda（Node.js）のDockerイメージをデプロイしてみた。（その１，EC2、Docker環境構築編）

# はじめに
LambdaをDockerイメージでデプロイする方法を、調査する機会があったので自分の備忘用にメモ書きを残します。

# EC2に環境セットアップ

Amazon Linux：Amazon Linux 2023 AMI
インスタンスタイプ：t2.micro
のクリーンな環境のセットアップしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/c0b63fde-d25e-692e-2b37-0fdd7b6c97cd.png)

鳥のアスキーアート？ですかね。

+ yumの最新化
+ dockerのインストール
+ 自動起動の有効化
+ 権限回りの設定

```shell
sudo yum update -y
sudo yum install -y docker
sudo systemctl start docker
systemctl status docker
sudo systemctl enable docker
systemctl is-enabled docker
grep docker /etc/group
sudo usermod -a -G docker ec2-user
sudo mkdir -p /usr/local/lib/docker/cli-plugins
```

ここまでやったら、docker-composeのインストールするバージョンを確認するために

https://github.com/docker/compose/releases/

のGithubのdocker-composeのリリースのページでバージョンを確認します。
記事作成時点では、「v2.29.7」ですね。

ダウンロードするバージョンを指定して、展開後に権限付与とシンボリックリンクを作って、コマンドの有効性確認をする。

```shell
VER=2.29.7

sudo curl \
  -L https://github.com/docker/compose/releases/download/v${VER}/docker-compose-$(uname -s)-$(uname -m) \
  -o /usr/local/lib/docker/cli-plugins/docker-compose
  
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose

docker-compose --version
```

コマンドの実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/703694c8-5238-52a6-c861-b41fc93009ac.png)

# まとめ
今回は、クリーンなEC2上にDocker環境を用意するまで。としておきます。
次回は、Docker上にデプロイできるNode.js（ライブラリ混み）の環境を構築する所までを書きます。

今回の自分へのメモ書きとしては、
docker-compose
はGithubにいくことと、リリースのページで「docker-compose」のバージョンを確認するのを忘れない事！がメモ書きで大事な事になります。

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。
AWSのLambda開発関連で、ライトな開発や、ちょっと、こんな事を自動化したい！等も、お気軽に問い合わせください。

https://www.cs-cloud-aid.com/