OmniAICreator/Qiita-1.07M huggingface dataset:
レンタルサーバー(Xserver)でFastAPIを動かす

# はじめに
今までWordpressを使うことが多く
そうなるとサーバーに関してもクラウドではなく
レンタルサーバーを利用してきました。
今回のそのいつも使っているレンタルサーバーで
FastAPIを使って作ってみたいアプリがあり
とりあえず動くところまでできたのでその備忘録です。

## Xserverに関して
XserverではWSGIは使用することができず
CGIもしくはFaskCGIでPythonのWebアプリを動作させることができます。
ただ、Xserverに導入されているPythonは追加でモジュールをインストールできない
(pipが使えない)ため、ssh接続を行いminiconda等を用いて
仮想環境の作成が必要です。
その辺りはいくつも分かりやすい記事があったので
そちらで確認できます。
例として以下の記事はすごく分かりやすくてよかったです

https://codeaid.jp/webapp-xserver/

## アプリを作成したいディレクトリに移動
Xserverではssh接続をしたとき
ルートディレクトリにいるのでそこから公開できる
ディレクトに移動する必要があります。

```
(例)
$ cd ~/<ドメイン>/public_html/
```
public_htmlに移動できたら
今回アプリを作成するディレクトリを作成して移動します。
```
(例)
$ mkdir fastapi
$ cd fastapi
```
## モジュールインストール
このままpipでモジュールをインストールしても良いのですが
今回はお試しでやってみたかったので
作成したディレクトリの中にpipパッケージをインストールしました
```
(例)
$ pip install fastapi -t .
```
-tをつけることでインストールするディレクトリを指定できます。
今回はカレントディレクトリに入れたかったので「.」としました。

## ファイルの作成
ファイル構成は以下のようになります。
```
.
├── .htaccess
├── main.py
└── index.fcgi
```

## .htaccess(パーミッション：644)
```
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /fastapi/index.fcgi/$1 [L]
</IfModule>
```
パーミッションの設定も変更しないと動かないので注意が必要です。
また常にSSLを使用するためコードを追加してます。
「/fastapi/index.fcgi/$1」の「fastapi」の部分は
今回作成したディレクトリの名前なので別名で作成した場合は
その名前に書き換えて下さい。

## main.py(パーミッション：600)
```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}
```
今回はお試しなので何でも良いから文字を表示させるための
仮のコードです。ここも指定はありません。

## index.fcgi(パーミッション：755)
FastCGIでFastAPIを動作させるのに必要な
「flup」モジュールと「a2wsgi」モジュールをインストールします。
```
$ pip install a2wsgi flup -t .
```
インストールできたらファイルを編集します。
```
#! ../../../miniconda3/envs/py312/bin/python
import os
import a2wsgi
from flup.server.fcgi import WSGIServer
from main import app

if __name__ == '__main__':
  os.environ.setdefault("PATH_INFO", "")

  wsgi_app = a2wsgi.ASGIMiddleware(app)
  WSGIServer(wsgi_app).run()
```
Pythonのパスに関しては
```
$ which python
```
で調べることができるので環境に合わせて
「#! ../../../miniconda3/envs/py312/bin/python」
を変更して下さい。
※今回のパスにある「py312」はminicondaの環境名です

## 実行
3つのファイルが用意できたら、ブラウザで「https://<ドメイン>/fastapi/」
にアクセスして今回設定した文字が表示されるか確認します。
「https://<ドメイン>/fastapi/docs」も確認することができます。

## まとめ
クラウドサービスが流行っているなのかで
あまり使う事はないかもしれませんが
レンタルサーバーでもFastAPIが動かせるので
少しお試ししたい方は是非やってみて下さい！
[RHEL9] PuTTY形式のSSH鍵を使用してSFTP接続を行う

# 概要
PuTTY形式の秘密鍵（pkk）をRHELのOpenSSHで使うためのメモ

## 手順

### PuTTY形式の鍵をOpenSSH形式に変換する

`PuTTYgen`をインストールし、鍵を変換します。

### PuTTYgenのインストール

`epel-release`リポジトリを有効化し、`PuTTYgen`をインストールします。

```bash
dnf install epel-release
dnf install putty
```

### 鍵をOpenSSH形式に変換
`PuTTYgen`を使って、.ppkファイルをOpenSSH形式に変換します。

```bash
puttygen private-key.pkk -O private-openssh -o .ssh/id_rsa
```

### 秘密鍵ファイルのパーミッションを設定
鍵ファイルのパーミッションを正しく設定します。

```
chmod 600 .ssh/id_rsa
```

### SFTPで接続する

作成したOpenSSH用の秘密鍵を使ってSFTP接続を実施します。

```
sftp user@hostname
sftp>
```
※ 適宜オプションは設定（ポートとか）
(小ネタ) CSSに画像を埋め込む

# 概要

ウェブサイトの制作や運営をしていると、画像ファイルの管理が面倒になることがあります。

そこで、CSSに画像を埋め込んで、HTML側でクラス指定をすることで、画像の管理を簡略化する方法を紹介します

この方法を使えば、画像ファイルを外部に保存する必要がなく、CSSファイル内に直接画像データを埋め込むことができます

# 手順

## ⓪ 事前準備

CSSには基本的にsvg形式の画像しか埋め込めないで他形式の画像は
[Image Magic](https://imagemagick.org/index.php)で、svg形式に変換しておきます。

以下のコマンドでPNGファイルをSVGに変換します。

```sh
convert input.png output.svg
```

https://imagemagick.org/script/download.php


## ① svg画像をcss形式に置き換え

下記サイトにsvgのコードを貼って、css形式に変換します。

https://yoksel.github.io/url-encoder/

![スクリーンショット 2024-10-17 22.14.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/fcd0b816-37d6-a016-0a0b-73a078802b1f.png)

## ② cssにsvg画像のクラスを作成する。

cssのクラスに先ほどコピーしたcssを貼り付けます。

```css
.svg-search-icon {
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='100px' viewBox='0 -960 960 960' width='100px' fill='%23000000'%3E%3Cpath d='M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z' /%3E%3C/svg%3E");
  width: 100px;
  height: 100px;
  background-size: cover;
}
```

- `background-size: cover`を設定しておくと、svg画像が要素全体に表示されます
- `background`または`background-image`どっちを使っても良いです

#### htmlで読み込むとこんな感じ

```html
<div class="svg-search-icon"></div>
```

![スクリーンショット 2024-10-17 22.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/30258d5d-caa2-20d2-452a-b419bcfba4f2.png)

# サンプルコード

以下にサンプルのhtmlとcssを置いておきます。

https://github.com/ebi-yu/playground/tree/main/qiita/css-svg

# 追記 : 2024-10-17

`background`を使ってsvg画像を読み込むと、svg画像の色の変更ができません。
`mask`を使うと`、background-color`を用いて画像の色を変更できるようになります。

```css
.svg-search-icon {
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='100px' viewBox='0 -960 960 960' width='100px' fill='%23000000'%3E%3Cpath d='M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z' /%3E%3C/svg%3E");
  width: 100px;
  height: 100px;
  background-size: cover;
}
```

#### htmlで読み込むとこんな感じ

```html
<!-- 後から画像の色を指定 -->
<div style="background-color: red;" class="svg-search-icon-mask"></div>
```

![スクリーンショット 2024-10-17 22.26.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/4f268450-fd30-9f23-0a46-4b3da42df770.png)
StreamlitでOpenAI APIキーを安全に設定する方法

## はじめに
Streamlitは、インタラクティブなウェブアプリケーションを簡単に作成できる便利なフレームワークです。APIを使ったプロジェクトでシークレットキー（APIキーなど）を使用することが多いですが、GitHubにコードを公開する際、シークレットキーを誤ってハードコーディングしてしまうと非常に危険です。
この記事では、**OpenAIのAPIキーをStreamlitで設定し、GitHubのパブリックリポジトリでも安全にプロジェクトを管理する方法**を解説します。

## Step 1: OpenAIのAPIキーを取得
まず、OpenAIのサイトからAPIキーを取得します。OpenAIのAPIを利用するにはアカウントを作成し、APIキーを生成する必要があります。

1. OpenAIにサインアップまたはログイン
1. [APIキーのページ](https://platform.openai.com/api-keys)にアクセスし、新しいキーを生成
1. 生成されたAPIキーをコピー

## Step 2: `.streamlit/secrets.toml` ファイルでAPIキーを管理
Streamlitでは、`.streamlit/secrets.toml` というファイルを使用して、シークレットキーを管理することが推奨されています。このファイルはGitHubに公開せず、ローカル環境やデプロイ環境でのみ利用します。
### .streamlit/secrets.toml ファイルの作成
プロジェクトのルートディレクトリに `.streamlit` フォルダを作成し、その中に `secrets.toml` ファイルを作成します。
```bash
mkdir .streamlit
touch .streamlit/secrets.toml
```
次に、このファイルにOpenAIのAPIキーを設定します。
```toml:.streamlit/secrets.toml
[openai]
api_key = "your-openai-api-key-here"
```
この `secrets.toml`ファイルには他のシークレット情報も管理できます。

## Step 3: `st.secrets` を使ってAPIキーを取得
Streamlitでは、`st.secrets` オブジェクトを使って `.toml` ファイルからシークレットキーを読み込むことができます。
例えば、以下のようにOpenAI APIキーを安全に読み込むことが可能です。
```python
import openai
import streamlit as st

# secrets.tomlファイルからAPIキーを取得
api_key = st.secrets["openai"]["api_key"]

# OpenAI APIに接続
openai.api_key = api_key

st.title("OpenAI APIを使ったStreamlitアプリ")
prompt = st.text_input("ChatGPTに質問を入力してください:")

if prompt:
    response = openai.Completion.create(
      engine="text-davinci-003",
      prompt=prompt,
      max_tokens=50
    )
    st.write(response.choices[0].text.strip())
```
このようにすることで、APIキーがコード中にハードコーディングされることなく、安全に利用できます。


## Step 4: `.gitignore` で `secrets.toml` をGitHubに公開しないように設定
次に、`.streamlit/secrets.toml` ファイルが誤ってGitHubにアップロードされないように、`.gitignore` ファイルで除外します。

`.gitignore` ファイルに以下の行を追加します。

```bash:.gitignore
.streamlit/secrets.toml
```
この設定により、Gitに`.streamlit/secrets.toml` が追加されるのを防ぎます。

## Step 5: Streamlit Cloudにデプロイする際のシークレットキー設定
Streamlit Cloud（または他のクラウドサービス）にアプリをデプロイする際、`.streamlit/secrets.toml` はアップロードされませんが、クラウド環境でシークレットを安全に設定する方法があります。
#### Streamlit Cloudでのシークレット設定方法
1. Streamlit Cloudのダッシュボードにアクセス
1. デプロイしたアプリの「Secrets」セクションに移動
1. secrets.toml の内容と同様に、シークレットキーを設定します。

例えば、以下のようにOpenAIのAPIキーを登録します。
```toml
[openai]
api_key = "your-openai-api-key-here"
```
これで、デプロイ環境でもローカル環境と同様に `st.secrets["openai"]["api_key"] `を使ってAPIキーを取得できます。
## まとめ

GitHubのパブリックリポジトリでプロジェクトを公開しつつ、シークレットキーを安全に管理するためには、`secrets.toml` ファイルや環境変数を活用することが重要です。

1. `.streamlit/secrets.toml`ファイルでシークレットキーを管理
1. `.gitignore` に `.streamlit/secrets.toml` を追加し、公開しないように設定
1. Streamlit Cloudなどにデプロイする際は、クラウドのシークレット管理機能を使用

これにより、シークレットキーを安全に管理しながら、StreamlitアプリでAPIを活用できます。
neovim prisma補完

完全な個人的メモです。


## プラグインを入れる
こちらのプラグインを入れる
https://github.com/neoclide/coc.nvim


## コマンド実行
```
:CocInstall coc-prisma
```

## please install dependencies and compile coc〜みたいなエラー発生

## コマンド実行
```
: call coc#util#install()
```

参考▼
https://qiita.com/Taichi-yzrh/items/5868e618c82e328c89f6

## エラー解消

## schema.prismaファイルを開いてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/71157046-2aa6-288c-ecd0-971678802ae7.png)



補完でてきた🤩


## 操作
Ctrl-p , Ctrl-n　にて選択、Ctrl-yで補完

## その他参照
https://scrapbox.io/jiro4989/Vim%E3%81%AE%E8%A3%9C%E5%AE%8C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3coc.nvim%E3%82%92%E5%B0%8E%E5%85%A5
New Relicのユーザー管理の基本を理解しよう！

New Relicを**組織的に使っていく場合、ユーザーを管理する必要があります**。
こちらの記事では、**New Relicにおけるユーザー管理の基本**についてご紹介します。
まずは下記の2点をおさえるようにしてみてください。

+ **グループがどんなロールでどのアカウントを使えるか？**
+ **グループにはどのユーザーが所属するか？**


カスタムロールやグループの作り方、認証ドメインやSSOの設定、Grop adminについては別の記事でご紹介したいと思います。

**詳細は下記の公式ガイドを参照ください。**

**↓↓↓ 公式ガイドはこちら**

https://docs.newrelic.com/docs/accounts/accounts-billing/new-relic-one-user-management/user-management-concepts/


# ユーザー管理の概要
下記の記事でご紹介したように、New Relicでは1つの組織に対して複数アカウントを作成することができますが、**ユーザー管理**では**各アカウント**を**誰**が**どんな権限**で使うことができるかを**管理すること**になります。

https://qiita.com/T_OMORI/items/508777b51d1ba36e6d41


下図はユーザー管理に関連する要素を表したものになります。
組織(Organization)の中には、下記の要素があります。

- 認証ドメイン(Authentication Domain)
- グループ(Group)
- ユーザー(User)
- ロール(Role)
- アカウント(Account)

**グループとユーザーは認証ドメインに含まれています**が、**ロールやアカウントは認証ドメインには含まれず組織に含まれています**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/84781659-ab54-3185-f2c3-36f871555214.png)


# グループがどんなロールでどのアカウントを使えるか？

組織に複数存在する**アカウント**を**誰**が**どんな権限**で使うことができるかということに関しては、直接ユーザーにロールを設定はせずに、**グループに対してどんな権限で、どのアカウントを使用できるか下記のように設定します**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/72df3a79-38c3-4dcd-9458-bd03369da0b3.png)

各グループに対して**複数のロールとアカウントの設定が可能**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/4ae0c9ac-5167-e701-643c-c45d61e5ce4f.png)


# グループにはどのユーザーが所属するか？

これで各グループがどのアカウントをどの権限で利用するか設定できたので、あとは**各グループにユーザーを追加**していきます。
こちらの例では、Group1にUser1を、Group2にUser1とUser2を追加しています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/e539c44f-dcaa-35da-5b7e-88a381cc0d04.png">

このように**各ユーザーは自分が所属するグループに紐づいているロールとアカウントの組み合わせで権限が付与**されることになります。

**実際のユーザー追加については別記事で画面を添えてご紹介します。**

# その他

New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
作成記事一覧

今回、生成AIによるFFRPGプログラムのコーディングに挑戦しました。
以下が今回作成した記事一覧になっております。
フリーの開発環境であるPUB400の環境構築に関しても記載しているため、RPGでのコーディング学習等のご参考になれば幸いです。

## 生成AIでFFRPGプログラムは生成できるのか？
①はじめに
https://qiita.com/2024_Rising_team_D/items/dbb174db8a455fb77aa2

②簡単なプログラムを作成してみる
https://qiita.com/2024_Rising_team_D/items/1cf09a411a734302622e

③社員マスター照会・入力プログラムを作ろう！
https://qiita.com/2024_Rising_team_D/items/b4a2b8e6ef849bf05b28

④プログラムで使用する外部ファイルのソース作成
https://qiita.com/2024_Rising_team_D/items/948c0584123764192743

⑤照会・入力プログラムのソース作成
https://qiita.com/2024_Rising_team_D/items/225703ad18c18ad0030d

⑥生成AIを使用するにあたって
https://qiita.com/2024_Rising_team_D/items/c78e1cf1f69725c3c60f

## PUB400での環境構築
オープン系開発者がIBM iの環境構築から始めてみた①
https://qiita.com/2024_Rising_team_D/items/8c55e190d5e2fb677b37

オープン系開発者がIBM iの環境構築から始めてみた②
https://qiita.com/2024_Rising_team_D/items/23ba4d707f4747ae2c58
MQL4のWebRequest()関数の5200エラーの解決法

ローカル環境でMetaTrader 4とFlaskアプリケーションを起動し、MetaTrader 4側からMQL4のWebRequest()関数を利用してFlaskアプリケーションにリクエストを送る際に、5200エラーが発生した。

エラーの内容を調べたところ「ERR_WEBREQUEST_INVALID_ADDRESS」ということで、URLが不正であるというのが原因。

その際に指定していたURLは、以下の通り。
```
Http://127.0.0.1:5000/endpoint/
```
Flaskアプリケーションはポート番号を指定でき、通常通り5000に設定しており、MQL4側からも、URLにポート番号を指定する形にしたのだが、MQLでは、このやり方のポート番号の指定ができず、不正なURLということでエラーが発生してしまっていたという事らしい。

さらに調べると、通常URLをhttpで送信すると、自動的にポート番号80番が指定され、httpsを指定すると443が指定されるという仕様になっているらしい。そのため、自身でURLのポート番号を指定すると衝突してしまうということなのだと推測。

解決策としては、Flaskアプリケーションの起動ポート番号を80番にして、MQL4側のエンドポイントを以下のようにした。これで接続はできた。
```
Http://127.0.0.1/endpoint/
```
ただ、解決できたものの、これは少し不便。アプリケーションを複数起動したい時もあり（FlaskとFastAPIの同時起動など）、ポート番号は分けたい。また80番のような汎用の番号を使ってしまうと、ローカルの環境内で他のポートと衝突しないのかが心配。
そこでMQL4において、エンドポイントのポート番号を指定する方法がないのか、ChatGPTに聞いてみたところ、コードの方法が必要ということで諦めた。

仕方がないので、ポート番号ではなく、エンドポイントのディレクトリ名を分ける形で区別するという運用に。

以下は、参考にさせてもらったサイト。
今回の事象に限らず、教科書的にいつも参考にさせてもらっている。

▼参考サイト  
https://naruhodo-mt4.com/p_error-warning-code/ 
このサイト、充実度がすごくて、本当に助かってる。どんな人が作っているのか。
Cython（Cpythnon）で出力されるライブラリ(ファイル)を1つにする

# 経緯

pythonの自作SDKを配布する必要があり、出来るだけ配布物をシンプルにする必要があった。  
普通にCythonでコンパイルすると、作成したファイル１つずつバイナリが吐き出されてしまい配布しづらかった。  

＃ どうやったか

下記setup.pyを使ってコンパイル実行
※Mac用なのでWinでコンパイルする場合はWin用のsetup.pyが必要になります。必要ならLLMに聞いてください。

```
from setuptools import setup, Extension
from Cython.Build import cythonize

ext_modules = [
    Extension(
        "hogehoge",  # モジュール名
        [ # 対象ファイル群
            "lib/hogehoge.pyx",
            "lib/piyopiyo.pyx",
            "lib/piyopiyo_data.pyx",
            "lib/fugafuga.pyx",
            "lib/fugafuga_data.pyx"
        ],
        extra_compile_args=["-O3", "-Wall"], # コンパイルオプション
    )
]

setup(
    name='hogehoge_module',
    ext_modules=cythonize(
        ext_modules,
        compiler_directives={
            'language_level': "3",
            'binding': True,
        },
    ),
    # 出力先を指定
    script_args=["build_ext", "--inplace"],
    zip_safe=False,
)
```

ディレクトリ構造

```
├── lib
│   ├── __init__.py
│   ├── fugafuga.pyx
│   ├── fugafuga_data.pyx
│   ├── piyopiyo.pyx
│   ├── piyopiyo_data.pyx
│   └── hogehoge.pyx
├── main.py #lib以下のライブラリ動作確認用(呼び出し元)
└── setup.py
```

コンパイルコマンド(-jは2並列?利いてるか良く分からない)

```
python3 setup.py build_ext --inplace -j 2
```
自作サンプルソースリスト

# これは自作したサンプルソースのメモです

## TypeScript
- [TypeScriptLeaning](https://github.com/ochtum/TypeScriptLeaning)
TypeScriptの挙動を勉強するためのサンプルソース。JSとの違いやReactを導入したときの違いなどを調査するために作ったもの

## CSharp
- [DaprMultiContainer](https://github.com/ochtum/DaprMultiContainer)
DaprとZipkinの導入検証で作ったサンプルソースです。ZipkinへのTrace出力にはZipkin4netを使っています。EnvoyとNginxの導入もしています。

## Google Apps Script
- [LinkToAllEmployeeList](https://github.com/ochtum/LinkToAllEmployeeList)
Microsoft365のListsで作成した[従業員リスト]のデータを元にGoogleWorkSpaceのGoogleDrive(共有ドライブ)に処理を反映させるサンプルソース。
- [GoogleDriveAddPermission](https://github.com/ochtum/GoogleDriveAddPermission)
GoogleDriveアクセス権の一括付与のサンプルソース。
OpenVINO™ ツールキット AI プログラミング・ウェビナー オンデマンド公開中

現在インテルでは、AI エキスパートによるオンデマンド形式のウェビナーを公開中です。
https://software.seek.intel.com/openvino-devcon-2024-jp-reg

![{a8838c9a-1604-4070-94f2-6734c4586d05}_devcon-jp-ws-webinar-kv-1200x1200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/d8efd64a-05b7-5c21-d0ff-9b0f4fc2d4c1.png)

本ウェビナーでは、生成 AI の未来とロードマップについて、インテルの AI エキスパートによる最新情報を交えつつ、実際のデモを通じて高速かつスマートに LLM の推論をローカル実行する手法や、OpenVINO™ ツールキットを使用して今すぐご自身のマシンで AI 開発を実行する方法を動画で学習できます。

３つのセミナーに分かれており下記内容となっています。

１：エッジ LLM で高速でスマートな推論を実現: 5 行のコードで LLM AI を作成 (約 45 分)

このセッションでは、「大規模言語モデル (LLM) は小型なフォームファクターのマシンにも収まるか？」「小規模 LM と LLM どちらにするべきか？」「推論をローカル実行する場合のスイートスポットはどこか？」といった、生成 AI の領域で見られるようになった新たなチャレンジを取り上げて解説します。また、INT8、INT4、1 ビット LLM モデルなど LLM 圧縮の時代において、複雑なディープラーニング・モデルとビッグデータ処理に GPU、NPU、CPU を効果的に使用する方法を探っていきます。

＜セッションの内容＞
•　OpenVINO™ ツールキットを使用して AI PC やエッジデバイス上で生成 AI を高速かつ正確に展開する方法の実演
•　OpenVINO™ ツールキットの最新版リリースで今すぐ試すことができる新しい開発手法
•　広範な LLM モデルとエキスパート・アーキテクチャーの組み合わせ
•　モデル圧縮とメモリー最適化の新たな手法
•　インテルのハードウェア上に実装できるモデルの拡張
•　OpenVINO™ モデル・サーバーを使用した AI モデルの展開
•　新しい生成 AI ワークロード

２：AI PC の新時代: NPU による高速かつ低消費電力の AI 推論の実現 (約 28 分)
このセッションでは、CPU、GPU、NPU を横断した固有の AI アクセラレーション機能による新時代の AI PC について深く掘り下げます。AI 推論タスクに NPU を活用し、OpenVINO™ ツールキットを使用して AI アプリケーションの実装と展開を最適化する方法について、AI PC 上で動く AI アプリケーションのパフォーマンスと電力効率のデモと合わせて包括的に紹介します。OpenVINO™ ツールキットを使用し、AI 推論におけるハードウェア使用率を最適化する方法を習得して、AI プロジェクトの効率化とイノベーションの推進にお役立てください。

＜セッションの内容＞
•　AI PC とは？ CPU、GPU、NPU を横断する AI アクセラレーション機能
•　従来型の AI と生成 AI の両方にわたる幅広い AI ユースケースと、AI PC で運用する実際のアプリケーション
•　OpenVINO™ ツールキットを使用して NPU 上に実装する AI アプリケーションを最適化し、電力効率とパフォーマンスを最大化する方法
•　OpenVINO™ ツールキットを使用して AI アプリケーションをシームレスに NPU へ移植する方法をデモにて紹介
•　開発者が AI PC 上で OpenVINO™ ツールキットを活用し、AI プロジェクトを推進する方法

３：コンピューター・ビジョン・ソリューション (約 25 分)
このセッションでは、AI 推論ソリューションのためのコンピューター・ビジョンや異常検出アプリケーションの構築方法として、オープンソースの Anomalib ライブラリーを使用して、不均衡なデータセットによる教師なし学習を実行し、発生頻度の低い欠陥をリアルタイムに検出する、製造業、医療、農業などの分野で品質管理の精度向上に応用できる手法を解説します。

＜セッションの内容＞
•　異常検出の分野に適用する OpenVINO™ ツールキットのコンポーネント、OpenVINO™ ランタイム、ニューラル・ネットワーク圧縮フレームワーク (NNCF) の基礎
•　Anomalib 1.0 を使用し、多様な最先端の異常検出アルゴリズムを統合する方法
•　量子化や OpenVINO™ ツールキットなどのテクノロジーを通じて、エッジデバイスに実装する AI モデルの学習処理と最適化を行い、リソース制限のある環境でも効率的なパフォーマンスを確保
•　モデルの最適化とエッジデバイスへの実装を実践で体験
•　異常検出の領域で今後この業界が直面することになる課題の紹介

各セッションの視聴は無料です。
是非この機会にOpenVINO™ ツールキットに触れてみてください！
https://software.seek.intel.com/openvino-devcon-2024-jp-reg

＜OpenVINO™ ツールキットとは＞
AI を加速する無償のツールである OpenVINO™ ツールキットは、インテルが無償で提供しているインテル製の CPU や GPU、VPU、FPGA などのパフォーマンスを最大限に活用して、コンピューター・ビジョン、画像関係をはじめ、自然言語処理や音声処理など、幅広いディープラーニング・モデルで推論を最適化し高速化する推論エンジン / ツールスイートです。

OpenVINO™ ツールキット・ページでは、ツールの概要、利用方法、導入事例、トレーニング、ツール・ダウンロードまでさまざまな情報を提供しています。ぜひ特設サイトにアクセスしてみてください。
https://www.intel.co.jp/content/www/jp/ja/internet-of-things/openvino-toolkit.html

◆法務上の注意書き

性能は、使用状況、構成、その他の要因によって異なります。詳細は、パフォーマンス・インデックス・サイトを参照してください。

性能の測定結果はシステム構成の日付時点のテストに基づいています。また、現在公開中のすべてのセキュリティー・アップデートが適用されているとは限りません。構成の詳細は、補足資料を参照してください。絶対的なセキュリティーを提供できる製品またはコンポーネントはありません。実際の費用と結果は異なる場合があります。インテルのテクノロジーを使用するには、対応したハードウェア、ソフトウェア、またはサービスの有効化が必要となる場合があります。

© Intel Corporation. Intel、インテル、Intel ロゴ、その他のインテルの名称やロゴは、Intel Corporation またはその子会社の商標です。

その他の社名、製品名などは、一般に各社の表示、商標または登録商標です
配列結合最速王を決めよう.js

# この文書の目的
タイトル通りですが、最近JavaScript（Node.js）において配列の結合でトラブルに遭遇したので、どうしてたら良かったのかを改めてまとめてみました。

## 条件
この文書では、配列の結合とは以下のようなものを指すこととします。
`a=[1,2,3]; b=[10,20,30]`を`c=[1,2,3,10,20,30]`のようにする。

この例ではたかだか3要素しかない2つの配列を結合するだけなので、まあ普通に`concat()`でも使いましょう、で終わりですが、やりたいこと（というかトラブルになったこと）は、「ある程度の要素数を持ったある程度の数の配列を結合すること」です。

以下に示すサンプルでは、要素として配列を持った親配列が以下のように定義されているものとします。
```javascript
parentArray = [
    [1,2,3,....],
    [10,20,30,....],
    [100,200,300,....],
    ...
]
```
これを結合して、
`resultArray = [1,2,3,....,10,20,30,....,100,200,300,........]`
となるようにするのが目的とします。

# さあ比較しよう
## 普通の方法（普通に使えるけど条件によってはトラブルになるよ）
### concat（その1）
配列を結合するんだから`concat`に決まってんだろ、と思う方もいるかもしれません。
後述するように使い方によっては`concat`は有効ですが、以下のような使い方は気を付ける必要があります。
```javascript
let resultArray = [];
for (const subArray of parentArray) {
    resultArray = resultArray.concat(subArray);
}
```
まず気を付けるべきは、`concat`は「非破壊的関数だ」ということです。
従って、実行結果である「結合して大きくなった配列」を、ループの度にコピーしていることになります。
0要素の配列(resultArrayの初期値)と100要素の配列を足すと100要素のコピーが、その100要素の配列にまた100要素の配列を足すと200要素のコピーが発生します。これを1000要素になるまで繰り返すと、5500要素分のコピーが発生することになります。要素は1000しかないのに。
つまり、コピーに要する時間が指数的に伸びて行ってしまうのがこの方法です。

### push（その1）
`concat`と違い、`push`は破壊的変更をおこなう関数ですのでコピーは足す分だけになるので速いです。ただし配列自体を引数として渡しても配列のまま足してくれちゃうので、引数リストに変換してあげる必要があります。これはスプレッド演算子を使って実現できます。
```javascript
const resultArray = [];
for (const subArray of parentArray) {
    resultArray.push(...subArray);
}
```
とても速いです。速いのですが唯一の欠点は、これが引数リストとして渡さないといけない、ということです。
引数リストの長さの制限は、配列長の制限よりはるかに厳しいです。従って、長大な配列に対してこれを使うと、スタックオーバーフローと言われてしまう可能性があります。

## ちょっとひねった方法（トラブルを起こしにくい方法）
### concat（その2）
そもそもparentArrayが用意されている時点でここにたどり着いてる人もいると思いますが、`concat`には引数を複数渡すことができます。ですから、今回の例のようにparentArrayのような形で結合したい配列が用意されているのなら以下のようにするだけで結合した配列が出来上がります。
```javascript
const resultArray = [].concat(...parentArray);
```
これは速いです。試した中では最速でした。
今回はparentArrayが最初から用意されていましたが、プログラム的に順次足していくような処理になってる場合だと見落とすかもしれませんね。この形に持っていければ高速化できるので意識してみるといいと思います。
欠点の一つはここでもスプレッド演算子で配列→引数リストの変換をおこなっていることです。
引数リストの制限にひっかかるほどの数の配列を結合するケースはそんなにないだろうとは思いますけど・・・。
欠点のもう一つは、結合するまで結合対象の配列を保持しておかないといけないので、メモリを食うことです。そもそも大きい配列の結合の話をしているので実はこれも無視できません。

### flat
`concat`の引数リストの制限も許せない、というのであればこの方法も考えてみてください。
```javascript
const resultArray = parentArray.flat();
```
まあまあ速いです。`concat（その1）`に比べたら雲泥の差で速いです。`push`や`concat（その2）`に対する利点は引数リストを使わないこと、です。

(2024/10/19訂正)
Node.js v20(LTS)で試したら`flat`はなんだか遅いですね。条件にもよりますがざっくりでいうと他(`push`など)よりひとケタ位遅いです。Chromeだと`push`と同程度なんですけどなんででしょうね？同じV8エンジンなのに。

### push（その2）
引数リストの制限に負けない`flat`が遅かったものだから、「引数リストの制限に負けない」かつ「それなりに速い」手段を考えます。
おまけに、`concat（その2）`の欠点である「結合するまで結合対象の配列を保持しておかないといけないので、メモリを食う」の弱点も解消して、結合できる時にさっさと結合してメモリを解放していける方法になります。
```javascript
const resultArray = [];
for (const subArray of parentArray) {
    for (let i = 0; i < subArray.length; i = i + 30000) {
      resultArray.push(...subArray.slice(i, 30000));
    }
}
```
基本的に`push（その1）`と同じですが、引数リストの制限にかからないように分割して`push`しています。
今回の条件だとparentArrayが最初から用意されてるので意味ないですが、これが生きるのは結合対象の配列が順次できあがってくるようなケースです。
「引数リストの制限にかからず」「メモリも必要最低限しか食わず」「そこそこ速い」ので、まあどんなケースかあんまり考えなくてもこれ使っとけば無難です。

おっと、記事のタイトルは最速王でしたね。諸々に目をつぶって速さだけを追い求めるならば`concat（その2）`が抜群に速いですのでケースバイケースで使い分けましょう。

# 終わりに
参考になりましたら幸いです。
【ChatGPT】のメモリ機能と「to=bio」について。


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

　今回は、メモリ機能と「to=bio」について書きます。「to=bio」とは何か、知らない人も多いはず。

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

　昨日（2024/10/13）も
　　曖昧なニュースとして
　　　取り上げたOpenAIの
　　　　o1のことです。

　[Tibor Blahoさんポスト](https://x.com/btibor91/status/1844826233856762148?t=82JJldWaL4-W7V-M9NZwRw&s=19)
```Text:DeepL翻訳
2024年10月17日に開催されるOpenAIのイベント「Solving complex problems with OpenAI o1 models」では、o1モデルがどのように困難なタスクを処理するかについて、ライブデモやその特徴や今後の計画についてのディスカッションを交えて紹介する。
```

　このポストに
　　イベント（Zoom）への
　　　リンクが張られています。

　覗いてみると
　　こう書かれています。
>2024年10月18日 午前3時 JST
4日後に開始します
OpenAI o1 モデルで複雑な問題を解決する

　さすがに寝てます😅

　ですが、
　　もしかすると
　　　o1モデルが初公開されるかも。

　o1-miniでも、
　　o1-previewでもなく、
　　　本来のo1モデルが、です。
***
　これと同時に
　　Anthropic社の
　　　Claude 3.5 Opusも
　　　　発表される、かも、
　　　　　という話も流れてきました。

　どうなんでしょうねぇ😅
***
　さて、本題に入ります。

　今回は、
　　ChatGPTの
　　　メモリ機能についてです。

　以前（2024/09/26）に書いた記事に
　　メモリ機能のことを書きました。
[【ChatGPT＋Advanced Voice Mode】を使ってみた。調べたこと・わかったこと。](https://qiita.com/kabumira/items/f95b46139117f7ef7061)

　実際には、2024/04/24から
　　順次解放されていたようですね。
　　　書いた覚えが😅

　それ以来、
　　私は、機能をOFFにして
　　　使わずじまいでした。

　今回、
　　X-Twitterに、とあるポストが
　　　されましたので、
　　　　調べてみました。
　　　　　[佐藤拓哉さんポスト](https://x.com/satotaku_ai/status/1845766592082387348?t=ehcvgQRIKedj_-RpXikU2g&s=19)

　こちらでは、
　　「to=bio」というコマンドで、
　　　メモリ機能に
　　　　独自ショートカットを
　　　　　登録されています。

　　ここで言うショートカットは
　　　“ひと文字入れたら、
　　　　この処理をしてね”という
　　　　　ものです。

　　佐藤さんは
　　　メモリ機能を
　　　　自動的に発動させずに、
　　　　　ショートカットを登録する
　　　　　　ことをしていました。
***
　さて、
　　「to=bio」というコマンドは
　　　なんでしょうか？

　これは
　　さすがに
　　　本人に尋ねるしかありません。

　回答をまとめました。

　「to=bio」のbioは
　　“バイオグラフィーの略”。

　「to=bio」は、
　　ユーザーが個人の情報や好みなどを
　　　記録・記憶する際に
　　　　使用されるコマンドとして
　　　　　設計されたツールです。

　　つまり、ユーザーが
　　　明示的に、メモリ機能へと
　　　　情報の登録するのに
　　　　　使われます。

　　ただし、
　　　メモリ機能がOFFの場合は
　　　　当然ながら使えません。

　　　使いたい場合は
　　　　メモリ機能をONして
　　　　　使うようにしてください。

　　　セッション中でも
　　　　ONにすれば、
　　　　　機能するようです。
***
　使用方法の前に。

　「to=bio」には
　　ふたつの機能があります。

　ひとつは、
　　情報の登録。

　もうひとつは、
　　メモリした内容のリストアップ。

　ユーザーは
　　このどちらかを
　　　使うことになります。

　なお、消去はありません。
　　やりたければ、
　　　上書きになります。
***
　まず、情報の登録。

```Text:情報の登録
to=bio　＊＊＊
```
　＊＊＊に
　　登録したい情報を
　　　入れてください。

　例えば
「to=bio　私の名前はカーブミラーです」
　　とか。

　次に、内容のリストアップ。
```Text:内容のリストアップ
to=bio　リストアップ
```

　これだけです。

　「to=bio」で改行して
　　次の行から、書きはじめることも
　　　OKです。

　また、一回に
　　複数の情報を入れることも。
***
⭕訂正（2024/10/16）⭕
訂正します🙇

登録後に
「to=bio　リストアップ」しても
リストアップされないことがあります。

「to=bio　指示のリストを表示して」
としてください。
***
　あっ、削除できない、と書きましたが
　　こういうことはできました。

　「to=bio　私の名前をなくして」

　“私の名前”の部分を
　　書き換えれば、
　　　メモリ消去できます。

　まぁ、多様するのは
　　どうかとも思いますが😅

　と、とりあえず
　　ここまでが、わかったことに
　　　なります。

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

　今回は、ここまで。
PostgreSQLで文字列置換の更新

カラムに改行コード入れたくないのに入っちゃってたってことありますよね？下記で修正できます。

```sql
UPDATE `books` SET `title` = replace(title, '\n', '') where id = 1;
```

where 句なしでも、対応する行を検索してくれるので、1万行あっても3行だけ更新をしてくれます。でも、安全面を考慮して、where句はなるべくつけましょ
【Ruby】getsメソッドとchompの使い方について

# はじめに
こんにちは、今回はRubyのgetsメソッドとchompメソッドについてお話します。
この2つのメソッドは、ユーザーからの入力を処理するときによく使われますが、意外と知られていない細かい部分もあるので記事にしようと思いました

# `gets`メソッドとは
まずは基本的な`gets`メソッドの解説をしていきます
`gets`メソッドは、ユーザーの入力を受け取るためのメソッドです。プログラムが実行されると、キーボードから入力を受け取り、その値を文字列として返します。下の例を見てみましょう。
```ruby:gets1.rb
input = gets
puts "あなたが入力したのは: #{input}です"

# （入力）こんにちは
# あなたが入力したのは：こんにちは
# です
```
このコードを実行すると、コンソール上で入力を待ちます。例えば「こんにちは」と入力してEnterキーを押すと、上記のように表示されます。
本来であれば、「あなたが入力したのは: こんにちはです」のように出力したいのですが、`gets`のみの場合だとこんにちはのうしろに改行(`\n`)が入ります。

# `gets`が改行コードを含む理由
このように改行をするケースのほうが少ないのにどうして入力内容の後に改行(`\n`)が入るのでしょうか。すこし深堀してみましょう
ここで注意すべき点は、`gets`メソッドは入力値と一緒に改行コード（\n）も含めて返すということです。
`gets`での入力後、コンソール上でEnterキーを押すと、入力された文字列に改行が自動的に追加されるのです。実際に次のようなコードで確認できます。
```ruby:gets2.rb
input = gets
p input
# （入力）こんにちは
# "こんにちは\n"
```
改行コードが含まれるのは、入力が完了したことを示すEnterキーが押されたタイミングで、それも入力として扱われるからです。
しかし、ほとんどのケースでは改行をそのまま使いたくない場合が多いです。

# `chomp`メソッドとは？
そこで登場するのが、`chomp`メソッドです。
`chomp`メソッドは、文字列から末尾の改行コード（`\n`）を取り除くメソッドです。`gets`で入力されたデータをきれいにしたいときに非常に便利です。

```ruby:gets3.rb
input = gets.chomp
puts "あなたが入力したのは: #{input}です"

# （入力）こんにちは
# あなたが入力したのは：こんにちはです
```
多くの場合、入力された値をそのまま使うケースが多いため`gets`と`chomp`を合わせて使うケースが多く、単体ではなく合わせて覚えている人も多いのではないでしょうか。


# まとめ
* `gets`はユーザーの入力を取得するためのメソッドであり、入力に改行が含まれる。
* `chomp`メソッドを使うことで、`gets`で取得した文字列から改行を取り除くことができる。
* `gets.chomp`の組み合わせは、入力を扱うときの標準的なパターン。

このように、`gets`と`chomp`の組み合わせを使うことで、ユーザーからの入力を適切に処理できます。
[備忘録]ソフトウェアテストの種類

# なぜテストをするのか
- コンポーネントの動作を担保する
    - テストコードを書いておくと、バグの検知をいち早く行うことができる。
- 関数やコンポーネントがどのように動くのかがチームに伝わりやすい
    - 改修がしやすい

# 単体テスト（ユニットテスト）
関数やコンポーネント単位で行うテストのこと。
完全にコードで記述する。

# 結合テスト（e2eテスト）
関数やコンポーネントなどの機能を結合し、アプリ全体に対して行うテストのこと。
人が実際に動作確認をしたり、テスト自動化ツールを使って実施したりする。

# 一気通貫テスト
大きめのシステムで実施。
関連システムを含め、エコシステム全体に対して行うテスト。
システム同士の整合性を確認するのが目的。
単体テスト、結合テストが終わっている状態で実施する。
Discord上で一定時間経過後,自動でメッセージを削除するBOTを作成する

## 気軽に思ったことを投稿できるチャネルが欲しいな
Discord上で,時間経過でメッセージが消えるチャネルを作成することで,
チャットをすることの敷居が下がるかなと考えて,
サーバー活性化のためにBOTを作成しようと思った.

## 技術スタック
- C#
- Docker
- Discord

## やったこと
### DiscordBotを作成する.
Dicrod Developer Portalにアクセス

https://discord.com/developers/applications

自分のアカウントでログインを済ませたら,
Applicationタブ->NewApplicationを押すと,以下の画面が表示されるので,
Botの名前を入れてCreate.
![{760F7D6B-6853-4ABD-A523-BF591B19BF4B}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536729/bf1a84be-1cb1-66f5-9bb6-6a1666e78ae8.png)
作成が完了したら,
OAuth2タブ->Oauth2 URL Generatorで,
Botにチェックを入れた後,
Manage MessagesとRead Message Historyの２つにチェックを入れて,
生成されたリンクから自分のサーバーに招待する.

最後にTOKENを取得します.(次以降で必要にあるのでどこかにメモしておくと良いです.)
BotタブからRESET TOKENを選択します.するとTOKENが表示されます.
Bot Permissionsは先程と同じ項目にチェックを入れてください.
### wsl上でC#プロジェクトを作成する.
※wslにする必要はないかも.私はこのBotを将来的にデーモン化したいから一応wslに.
```
dotnet new console -n TweetManager(←任意のプロジェクト名)
cd TweetManager
dotnet add package Discord.Net --version 3.16.0
```

### 作成されたProgram.csに処理を記述していく.

```Program.cs
using Discord;
using Discord.WebSocket;
using System;
using System.Threading.Tasks;

class Program{
    private DiscordSocketClient _client = new DiscordSocketClient();
    private ulong _targetChannelId = チャネルのID;

    public static Task Main(string[] args) => new Program().MainAsync();

    public async Task MainAsync(){
        _client = new DiscordSocketClient();

        _client.Log += Log;
        _client.Ready += OnReadyAsync;

        string token = "TOKEN";//ここにディスコードのTOKENを入れる
        await _client.LoginAsync(TokenType.Bot,token);
        await _client.StartAsync();
        
        await Task.Delay(-1); 
    }

    private async Task OnReadyAsync(){
        Console.WriteLine("Bot is connected!");

        var channel = _client.GetChannel(_targetChannelId) as IMessageChannel;

        if(channel != null){
            await Task.Run(async () =>{
                while(true){
                    var messages = await channel.GetMessagesAsync().FlattenAsync();
                    var now = DateTimeOffset.UtcNow;

                    foreach(var message in messages){
                        //12時間経過していたら削除する.
                        if(message.Timestamp < now.AddHours(-12)){
                            Console.WriteLine("メッセージを削除します。");
                            await channel.DeleteMessageAsync(message);
                        }
                    }
                    //1hごとにチェックを入れる
                    await Task.Delay(TimeSpan.FromHours(1));
                }
            });
        }
    }

    private Task Log(LogMessage msg){
        Console.WriteLine(msg.ToString());
        return Task.CompletedTask;
    }
}
```
Program.csにチャネルIDとトークンを代入したら完了.
チャネルIDはディスコードのチャネルを右クリックでIDを取れます.

これらが完了したら以下のコマンドを実行してください.
```
dotnet run
```

これでBotの制作自体はおしまいです.
この状態では,Botが常駐している状態ではないので,PCを起動するたびにコマンドを打たないといけないので,次回はデーモン化などに挑戦していきます.
PostgreSQL×Dockerスターターテンプレート

## はじめに

DockerでテストDBを作成することは多いのですが、毎回構築方法を忘れてしまうので、ここにメモとして残しておくことにしました

## ディレクトリ構成

```txt
./
├──init
│  ├──create_schema.sql
│  ├──create_tables.sql
│  └──insert_sample_data.sql
└──docker-compose.yml
```

## docker-compose.yml

```yml:docker-compose.yml
version: '3'

services:
  db:
    image: postgres:17
    container_name: postgres_container
    ports:
      - 5432:5432
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydatabase
    restart: always

volumes:
  postgres_data:
```

1. **バージョン**: Docker Composeのバージョン3を使用しています。
2. **イメージ**: PostgreSQL 17を使用しています。必要に応じて別のバージョンに変更できます。
3. **コンテナ名**: `postgres_container`という名前でコンテナを作成します。
4. **ポート**: ホストの5432ポートをコンテナの5432ポートにマッピングしています。
5. **ボリューム**:
    - `postgres_data`: データベースファイルを永続化するためのボリュームです。
    - `./init`: 初期化スクリプトを配置するディレクトリをマウントしています。
6. **環境変数**:
    - `POSTGRES_USER`: データベースユーザー名を設定します。
    - `POSTGRES_PASSWORD`: データベースパスワードを設定します。
    - `POSTGRES_DB`: 作成するデータベース名を指定します。
7. **再起動ポリシー**: `always`を指定し、コンテナが停止した場合に自動的に再起動するようにしています。

:::note alert
このテンプレートを使用する際は、セキュリティのため`POSTGRES_USER`と`POSTGRES_PASSWORD`を適切な値に変更してください。また、必要に応じて`POSTGRES_DB`も変更してください。
初期化スクリプトを使用する場合は、`./init`ディレクトリにSQLファイルを配置することで、コンテナ起動時に自動的に実行されます
:::

## DDL

`./init`ディレクトリ内に配置する初期化スクリプトのサンプルを以下に示します。

:::note
これらのスクリプトは、PostgreSQLコンテナの初回起動時に自動的に実行されます。
:::

```sql:create_schema.sql
CREATE SCHEMA IF NOT EXISTS myapp;
COMMENT ON SCHEMA myapp IS 'スキーマの説明をここに記述';
```

```sql:create_tables.sql
SET search_path TO myapp;
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE posts (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    title VARCHAR(200) NOT NULL,
    content TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE users IS 'ユーザー情報を格納するテーブル';
COMMENT ON TABLE posts IS 'ユーザーの投稿を格納するテーブル';
```

```sql:insert_sample_data.sql
SET search_path TO myapp;
INSERT INTO users (username, email)
VALUES ('user1', 'user1@example.com'),
    ('user2', 'user2@example.com');
INSERT INTO posts (user_id, title, content)
VALUES (1, '最初の投稿', 'これは最初の投稿の内容です。'),
    (1, '2番目の投稿', 'これは2番目の投稿の内容です。'),
    (2, 'user2の投稿', 'これはuser2による投稿です。');
```

## 確認
デタッチドモード（バックグラウンド）でコンテナを起動します
```sh
docker-compose up -d
```

データベースに接続して、パスワードを入力します
```sh
psql -d mydatabase -U user -h localhost
```

```sh
mydatabase=# SET search_path TO myapp;
SET
mydatabase=# select * from users;
 id | username |       email       |          created_at           
----+----------+-------------------+-------------------------------
  1 | user1    | user1@example.com | 2024-10-11 00:40:59.524203+00
  2 | user2    | user2@example.com | 2024-10-11 00:40:59.524203+00
(2 行)
```

`./init`以下のsqlファイルが実行され、データベースがセットアップされていることが確認できました。
Module 'cv2' has no '****' memberとpylintちゃんに叱られる!

# AIちゃんとのお話

俺「AIちゃん、なんかVSCodeで警告が出てるんだけど」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/2e17ac95-50fd-4a70-7a6b-257b46efaab9.png)
AI「パッケージインストールしてないだけなんじゃねーの？」
俺「いや流石に頭の悪い僕でもそれはないと思うんだけど」
AI「一人称が安定しない奴は信用できないvenvに入れ」
俺「あるっぽいよpylintちゃんだけが情緒不安定で激おこぷんぷん丸だけっぽい、ぽい、ぽい」
AI「そしたらこんな感じで書けばいいんじゃね？」

```python
asset = cv2.imread(asset_path)  # noqa
```

俺「いやーこんな感じでめっちゃ怒られてるんだよ、一々そんなの書くのめんどくさくない？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/5666288a-4845-896c-f220-ffe804980901.png)

# .pylintrcファイルを作って遊ぼ

AI「venvに入っているな」
俺「はいっちょる」
AI「じゃあこのコマンドをコピペして実行しろ」

```powershell
pylint --generate-rcfile | out-file -encoding utf8 .pylintrc
```

俺「実行したら何もしてないのに".pylintrc"とかいう変なファイルができたんだけど」
AI「開け」
俺「ゴマ」
AI「extension-pkg-whitelistで検索かけろ」
俺「丘の下」

```configuration
# A comma-separated list of package or module names from where C extensions may
# be loaded. Extensions are loading into the active Python interpreter and may
# run arbitrary code.
extension-pkg-whitelist=
```

俺「トイック100点満点の俺には理解不能だよ( ；∀；)、翻訳さんに頼んでみたけど意味不明だよ」
AI「...」
AI「それをこうしろ」

```diff_conf
# A comma-separated list of package or module names from where C extensions may
# be loaded. Extensions are loading into the active Python interpreter and may
# run arbitrary code.
- extension-pkg-whitelist=
+ extension-pkg-whitelist=cv2
```

俺「したよー」
AI「んじゃ、generated-membersで検索かけろ」

```conf
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted.
generated-members=
```

俺「したよー」
AI「それをこうしろ」

```diff_conf
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted.
- generated-members=
+ generated-members=cv2.*
```

俺「したよー」
AI「保存しろ。そしてCtrl+Pを押して次のコマンドをコピペして実行しろ」

```co
>Pylint:Restart Server
```

俺「したよー」
AI「どないや？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/6879b67a-36d3-1b0b-438a-c8f1968eabe9.png)
俺「すごいよAIちゃん！なんかできてるっぽい！」
AI「にしてもお前のコードには問題が多いな」
山田奈緒子「反省！」
AI「お前は誰だよ」
効率の良いディスカッションとは？

**発表会手順書**

今回、教室でおこなっているチームでのディスカッションの流れなどを共有します。

### 1. 発表会の概要

- **実施日**：毎週水曜日と金曜日
- **時間**：発表時間はチームごとにフィードバックを含めて1人5分程度
- **形式**：3〜4人のチームで発表を行う

### 2. 発表会の目的

- **理解を深めること**：学んだことを他の人に説明することで、自分の理解を深めること。
- **コミュニケーションスキルの向上**：技術的な内容を簡単で分かりやすく説明する力をつけること。
- **チームワークの強化**：チームでの発表を通じて、お互いに協力することの大切さを学び、連携を深めること。

### 3. 発表内容

各チームメンバーは次の内容に沿って発表を行います：

- **学んだこと**：その週に学んだ内容を簡単にまとめること。
- **活用例**：学んだことがどのように役立つか、どんなふうに使えるかを具体的に説明すること。
- **難しかったこと**：学んでいて難しいと感じたことを共有し、その解決方法を説明すること。
- **質問やフィードバック**：他のメンバーからの質問やフィードバックを受けて、理解を深めること。

#### 発表内容の例

- **テーマ**：Pythonの繰り返し文について
  - **学んだこと**：Pythonでの繰り返し文（forループとwhileループ）の使い方や違いについて学びました。
  - **活用例**：forループを使ってリストのすべての要素を順番に処理したり、whileループを使って特定の条件が満たされるまで繰り返すことができます。
  - **ソースコードの例**：
    ```python
    # forループの例
    numbers = [1, 2, 3, 4, 5]
    for number in numbers:
        print(number)

    # whileループの例
    count = 0
    while count < 5:
        print(count)
        count += 1
    ```
  - **難しかったこと**：whileループで無限ループを防ぐために、どのように終了条件を設定するかが難しかったです。
  - **質問やフィードバック**：無限ループを避けるためのコツや、実際のプロジェクトでの繰り返し文の使い方について質問がありました。

  **無限ループを避けるためのソースコードの例**：
  ```python
  # whileループの終了条件を設定する際のコツ
  count = 0
  max_count = 10  # 終了条件を設定する
  while count < max_count:
      print(count)
      count += 1  # countを増やして終了条件に近づける
  ```

### 4. 使用ツール

- **資料作成**：
  - パワーポイント
  - Word
  - メモ帳
- **資料の提出**：Slackにて提出（提出期限は発表の前日まで）

### 5. フィードバックの仕方

- **具体的な指摘**：良かった点や改善が必要な点を具体的に挙げること。
- **建設的な意見**：批判ではなく、どう改善すれば良いか具体的な提案を含めること。
- **ポジティブな面も伝える**：改善点だけでなく、良かった点も必ず伝えて、発表者のやる気を保つこと。
- **批判・否定を禁止**：出された意見に対しての批判や否定はしないこと。

### 6. ディスカッション注意点

- **批判の禁止**：他の人の意見を否定せず、肯定的に受け止めることで自由に発言できる雰囲気を作ること。
- **互いの意見を尊重する**：他の人の意見を尊重し、自分と違う意見でもしっかり聞くこと。
- **学びの共有**：他の人から学んだことを積極的に吸収して、チーム全体で共有することを意識すること。
【DAY34】時間計算量と空間計算量について

## 計算量とは
ある問題を解くのにどのくらい手間を要したかを数値で表したものを計算量といいます。

## 時間計算量、空間計算量とは
コンピュータが特定の手順に従って与えられた問題を解く際に必要とする手順の回数を時間計算量、必要とする記憶領域の容量のことを空間計算量といいます。

## O記法について
入力サイズnに対して、アルゴリズムがどれくらい時間がかかるか予測を立てるのにO記法が使われます。
例：O(n), O(n^2), O(log n), O(2^n)

計算量については、入力サイズに対してどのようにスケーリングするかが重要です。そのため最も影響の多い項のみが考慮され、他の項は無視されます。
例：O(3n^2+2n+1) ≒ 0(n^2)

nが大きくなると、例えばO(2^n)はどんどん大きくなっていきますが、O(log n)はnが大きくなってもあまり大きくならず少ない計算回数で済みます。
このように、アルゴリズムを実装するときには、時間計算量、空間計算量を意識しながら最適化されたコードを書くことが重要です。
ラズパイのパスワードの話

# とある会での話
ラズパイを展示してデモを走らせていた、ラズパイに慣れ親しんでもらうために電源をつけっぱなして開放していたら。
数日してログインしようとするとログインできない！！
おかしいと思い強制終了してSDを抜いて/etc/shadowの日付を見るとその会の日付になっていることから、誰かに書き換えられた模様。

性善説にたって、開放したのが間違いでした・・・

# 復帰させる方法
以前使っていたSDをPCで読んで/etc/shadowのログインユーザー名行のパスワードハッシュをログインできないSDカードshadowにコピーすれば以前のパスワードでログインできる。
住宅価格予測 (回帰分析の概要について見ていきましょう)　House Prices - Advanced Regression Techniques

## 概要
このコンペティションは無期限に実施され、住宅の販売価格を予測することが求められます。さらに、特徴エンジニアリングやランダムフォレスト（RF）、勾配ブースティングなどの技術を練習することができます。過去にPythonやRの基礎を学び、さらにスキルを伸ばしたいデータサイエンスの学生にとって、非常に適したコンペティションとなります。

具体的な解析のNotebook Bookについてはこちらで扱っています。

https://qiita.com/Life-tech/items/f51716615dba3e2adc47



## コンペティションの説明
住宅の価格交渉には、寝室の数や庭の美しさだけでなく、地元の鉄道の距離や地下室の天井の高さなど、さまざまな要因が影響します。このデータセットには、アイオワ州エイムズの住宅に関する79の説明変数が含まれており、それらを基に「**住宅の最終価格**」を予測することが求められます。

## 練習できるスキル
創意工夫する特徴エンジニアリング
ランダムフォレストや勾配ブースティングなどの高度な回帰手法

## 評価方法
### 目標
各住宅の販売価格を予測することです。テストセットの各 Id に対して、 SalePrice 変数の値を予測します。

### 評価指標
提出物は、Root-Mean-Squared-Error (RMSE) に基づいて評価されます。RMSEは予測値の対数と実際の販売価格の対数の差を取ります。これにより、安価な住宅と高価な住宅の予測誤差が同等に評価されます。

### 提出形式
提出するファイルは以下の形式でなければなりません。

```yaml.csv
Id,SalePrice
1461,169000.1
1462,187724.1233
1463,175221
```
サンプル提出ファイル（sample_submission.csv）は、データページからダウンロードできます。

## 使用するテクニック
主な回帰技術
ランダムフォレストや勾配ブースティングなど、複数のツリーベースのアルゴリズムを活用します。
LASSO回帰(ラッソ回帰)やリッジ回帰といった正則化手法を使用し、多重共線性(※)を避けることが推奨されています。
※ 重回帰分析において、2つ以上の説明変数が高い線形関係にある状況のこと

## そもそもGetting Started コンペティションとは？
Kaggleの初心者向けコンペティションです。機械学習の基礎を学んだばかりの方や、MOOCを修了した方が次のステップに進むために最適な環境を提供します。


## 最後に～
このコンペティションは、住宅価格を予測するために高度な回帰技術や特徴エンジニアリングを学び、実践する絶好の機会です。データサイエンスのスキルをさらに向上させたい方におすすめの競技となっています。
【ネットワーク】３分間NetWorking 第4回〜第7回 OSI参照モデル、ネットワーキングデバイス

# はじめに
この記事は、3分間NetWorkingを読んでインプットした知識をアウトプットするために執筆しています。
学習内容のまとめ、学習してみての所感や疑問などを記載しています。
記事を読んでみて、間違っていることへの指摘や感想などありましたら、ぜひコメントをいただければと思います。
3分間NetWorkingのリンクは以下の通り。
https://www5e.biglobe.ne.jp/aji/3min/

# プロトコルスタック
第3回で説明された、通信を行うときの約束事であるプロトコルについて、もう少し掘り下げます。
通信におけるプロトコルは一つだけではありません。役割ごとに様々なプロトコルが設定されて、通信を行っています。
この複数のプロトコルを役割ごとにまとめたものをプロトコルスタックと言います。またはネットワークアーキテクチャやプロトコルスイートとも呼ばれます。

# プロトコルスタックの歴史
昔は各メーカーが独自のプロトコルスタックを作成し、自社製品に設定していました。各メーカーごとに異なるプロトコルスタックが設定されていたため、自社製品同士でしか通信をすることが出来ませんでした。
しかし、会社や組織ごとに使用しているPCは異なるため、取引先との通信を行うことが出来ないといったことが頻発し、業務効率の低下を招いていました。
そこで、世界基準で統一した規格が必要だということになり、ISO（International Orgznization for Standardization：国際標準化機構）により、OSI参照モデルという世界基準のプロトコルスタックが策定されました。

# OSI参照モデル
OSI参照モデルとは、異なる機種間でも通信できる世界基準で作成されたプロトコルスタックです。
OSI参照モデルでは、通信におけるそれぞれの役割（プロトコル）を7つの階層（レイヤ）に分けて定義しています。
プロトコルを7つのレイヤに切り分けることで、変更があっても該当のレイヤだけを修正すれば済むため、最小限の修正で済みます。
各レイヤの役割は以下の表の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893135/170f91cb-5b42-e526-7bf6-930c5d4c3a35.png)
OSI参照モデルにおける通信のプロセスは、データの送信側はレイヤ7から下に向かって処理されていき、レイヤ1で電気信号に変換され、宛先のレイヤ1に届く。受信側はレイヤ1から上に向かって処理されていき、例えば伝送されているデータがメールであれば、レイヤ7で送られてきたメールが表示されます。

# カプセル化・非カプセル化
OSI参照モデルでデータを送信する時、相手に送るものはデータだけではありません。
ヘッダと呼ばれる制御情報と、宛先、送信元のIPアドレス、エラーチェック用のトレーラと呼ばれるものをデータにくっ付けて送信します。
ヘッダは各レイヤごとに付加され、それぞれ名称が異なります。またトレーラはデータリンク層でのみ付加されます。
それぞれのヘッダは、トランスポート層ではセグメント、ネットワーク層ではパケット、データリンク層ではフレームと呼ばれます。
こうした送りたいデータ以外に、必要な情報をくっ付けることをカプセル化と言います。
カプセル化は全て送信側で行われる処理ですが、受信側では逆にカプセル化によって付加された情報を取り外していく処理が行われます。これを非カプセル化と言います。
これらの送りたいデータに制御情報などが付加されたデータをPDU（Protocol Data Unit）と言います。

# ネットワーキングデバイス
複数のPCからデータをLAN経由で流す場合、データの流れを制御する機器が必要になります。データの流れを制御する機器をネットワーキングデバイスと言います。
ネットワーキングデバイスはレイヤ1～3のそれぞれのレイヤの役割に従った機器があります。
レイヤ1では、リピータとハブ、レイヤ2ではブリッジとスイッチ、レイヤ3ではルータがあります。
それぞれの詳しい説明は、3分間NetWorking 第8回以降の、各レイヤごとの学習で説明されるようなので、ここではあくまでネットワーキングデバイスの概要として軽く記載するにとどめます。

# OSI参照モデルとTCP/IP
OSI参照モデルに似たプロトコルスタックがあります。TCP/IPと呼ばれる階層モデルです。
実は現在はOSI参照モデルはほとんど使われておらず、TCP/IPモデルがデファクトスタンダードとなっています。両者の違いについては以下の通りです。

■OSI参照モデル
・ISO（国際標準化機構）によって策定された。
・7階層からなる階層モデル

■TCP/IPモデル
・DARPA（米国国防高等研究計画局）によって策定された。
・4階層からなる階層モデル

両者の違いとしては、策定した団体と、階層の数です。
大まかな内容についてはほとんど一緒で、OSI参照モデルが7階層にも分かれており、複雑であったものをTCP/IPモデルは4階層にまとめてより分かりやすくしています。
元々は、OSI参照モデルが先に策定されましたが、TCP/IPが登場し、OSI参照モデルよりも分かりやすかったことから、TCP/IPが使われるようになり、デファクトスタンダードとして定着しました。
しかし、OSI参照モデルはネットワークの基礎理論として優れているため、ネットワークを理解するのであれば、OSI参照モデルを学習することは無駄ではないそうです。
私自身、OSI参照モデルが現在ではほとんど使われていないと知った時は、勉強する意味あるのかなと思いましたが、現在では教育用として使われることが多いようなので安心しました。

# まとめ
今回はOSI参照モデルとネットワーキングデバイスについてまとめました。
次回からいよいよOSI参照モデルについて、深く学習していくため、自身がインプットした知識を分かりやすくアウトプットしていければと思います。
最後に、記事を読んで間違いの指摘などがあればコメントで教えていただけると幸いです。
ありがとうございました。
DBeaverのローディングが終わらない現象の解決法

# 現象

* ある朝、DBeaverを開くとポップアップで以下のような内容のエラーが表示された
```
Unexpected value at line 723 column 3 path $
See https://github.com/google/gson/blob/main/Troubleshooting.md#malformed-json
```
* その後、ポップアップを閉じて起動しようとするもローディングが永遠に終わらない現象に見舞われた。

# 解決

* `/Users/<ユーザー名>/Library/DBeaverData/workspace6/General/.dbeaver/data-sources.json`の内容が変になっていることによるエラーだった。
* エラーメッセージをよく読むと723行目の3列目と記載がある。
* json内のその位置を確認してみると何故か余分なかっこがあったので消したら解決した。（作業前にはバックアップを忘れずに。）
    * 最近使ってないデータソースを整理したんだけどDBeaverのバグでその時のごみが残ってたみたい。
【macOS】asdfを使ってphpを導入するには


mac に asdf を使って php を導入する奮闘記  

WSLでの使い方は以下の通り  

https://qiita.com/sigeta/items/54eeb7671484c62d0853


## asdf の導入からエラーまで

mac だとなんか `brew` にあるみたいなので、こちらからインストールしてみる
※ちなみに当方 Intel Mac

```bash
$ brew install asdf
$ asdf --version
version: v0.14.1

$ asdf plugin-add php https://github.com/asdf-community/asdf-php.git
Plugin named php already added
```

ありゃ、すでにPHPプラグインが入ってた

```bash
$ asdf install php 8.3.12
```

数々のエラーが出てきた...
検索用に並べておく

```
configure: error: bison 3.0.0 or later is required to generate PHP parsers (excluded versions: none).

configure: error: re2c 1.0.3 is required to generate PHP lexers.

configure: error: The pkg-config script could not be found or is too old.  Make sure it

No package 'gdlib' found

configure: error: Please specify the install prefix of iconv with --with-iconv=<DIR>

If you need to have libiconv first in your PATH,

No package 'oniguruma' found

No package 'libzip' found

Could not open input file: composer-setup.php
```

あ〜わかんねぇ〜
ということで調べたところ、有用 issue を見つけた

https://github.com/asdf-community/asdf-php/issues/8#issuecomment-841169592

```bash
$ brew install libsodium gpg git tmux neovim vim htop curl wget re2c bison zlib libgd libiconv oniguruma postgresql bzip2 readline libedit tidy-html5 openssl libzip

$ export PATH="$(brew --prefix bison)/bin:$(brew --prefix icu4c)/bin:$(brew --prefix icu4c)/sbin:$PATH"
$ export PHP_CONFIGURE_OPTIONS="--with-zlib-dir=$(brew --prefix zlib) --with-bz2=$(brew --prefix bzip2) --with-readline=$(brew --prefix readline) --with-libedit=$(brew --prefix libedit) --with-tidy=$(brew --prefix tidy-html5) --with-iconv=$(brew --prefix libiconv) --with-openssl=$(brew --prefix openssl) --with-curl=$(brew --prefix curl)"

$ asdf install php 8.3.12
$ asdf global php 8.3.12

$ php --version
PHP 8.3.12 (cli) (built: Oct  5 2024 21:08:45) (NTS)
$ composer --version
Composer version 2.8.1 2024-10-04 11:31:01
PHP version 8.3.12 
```

お〜一発で成功
brew で必要なパッケージを導入していたが、PATHとかの設定を忘れてたみたい  
流石にビルドまでは精通してない...かなしみ...
Azure Ephemeral OS Diskメモ

Azure Ephemeral OS Disk（エフェメラル OS ディスク）は、Azure Virtual Machines（VM）の OS ディスクとして使用できる、一時的なディスクです。通常のマネージドディスクとは異なり、エフェメラル OS ディスクは仮想マシンのローカル一時ディスクに保存されます。そのため、ディスクのデータは VM の停止・再起動や削除時に消失する可能性があります。

### 主な特徴と利点

1. **高速起動と再起動**:
   - エフェメラル OS ディスクは仮想マシンのローカルストレージ上にあるため、通常の OS ディスクよりも高速に VM を起動・再起動できます。

2. **コスト削減**:
   - ストレージコストを削減できます。通常のマネージドディスクとは異なり、エフェメラル OS ディスクの使用には追加料金がかかりません。

3. **ステートレスワークロードに最適**:
   - 状態を保持しないワークロードや一時的な仮想マシンに適しています。たとえば、スケールセットの自動スケーリングや短時間での検証や開発に向いています。

4. **VM サイズの制約**:
   - 一部の Azure VM サイズではエフェメラル OS ディスクは利用できません。対応している VM サイズを選択する必要があります。

5. **VM スケールセットとの互換性**:
   - エフェメラル OS ディスクは VM スケールセットと非常に相性がよく、スケールイン・スケールアウト時に高速なデプロイが可能です。

6. **保存データの耐久性なし**:
   - データは VM のライフサイクルに依存し、OS ディスクのデータが持続的に保持されません。したがって、重要なデータは別の永続ディスクやストレージに保存する必要があります。

### 使用シナリオ

- **開発・テスト環境**: 短期間のテストやステートレスな開発環境で役立ちます。
- **コンテナ化されたアプリケーション**: コンテナ化されたアプリケーションのように、アプリケーションのステートが重要でない場合に最適です。
- **Azure Kubernetes Service (AKS)**: AKS のノードを高速にデプロイしたり、リソースをスケーリングする場面で便利です。

### 設定方法

1. **VM 作成時**:
   - Azure ポータル、Azure CLI、または ARM テンプレートを使用して、VM の作成時にエフェメラル OS ディスクを選択できます。
   
   例（Azure CLI）:
   ```bash
   az vm create --name MyVM --resource-group MyResourceGroup --image UbuntuLTS --ephemeral-os-disk true
   ```

2. **VM スケールセット作成時**:
   - VM スケールセットの作成時にも、エフェメラル OS ディスクを使用するオプションがあります。

エフェメラル OS ディスクは、デプロイ速度やコスト削減を重視する環境で有効です。ただし、永続的なデータが必要な場合には通常の OS ディスクを選択する必要があります。
データベース管理で覚えておくべきコマンド

今回はデータベース管理で覚えておくべきコマンドをまとめた記事を作成します。

1. データベース全般で使う基本コマンド
データベース一覧の表示
データベースに接続後、すべてのデータベースを一覧表示するためのコマンドです。

MySQL:
```sql
SHOW DATABASES;
```
PostgreSQL:
```sql
\l
```
データベースの作成
新しいデータベースを作成するためのコマンドです。

MySQL & PostgreSQL:
```sql
CREATE DATABASE データベース名;
```
データベースの削除
不要になったデータベースを削除するコマンドです。削除は慎重に行いましょう。

MySQL & PostgreSQL:
```sql
DROP DATABASE データベース名;
```
データベースに接続
作成したデータベースに接続して操作を行います。

MySQL:
```sql
USE データベース名;
```

PostgreSQL:
```sql
\c データベース名
```
2. テーブル操作の基本コマンド
テーブル一覧の表示
データベース内のすべてのテーブルを表示します。

MySQL:
```sql
SHOW TABLES;
```

PostgreSQL:
```sql
\dt
```

テーブルの作成
テーブルを作成するためのコマンドです。フィールド名、データ型などを指定します。

MySQL & PostgreSQL:
```sql
CREATE TABLE テーブル名 (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  age INT
);
```

テーブルの削除
テーブルを削除するコマンドです。削除するとデータも消えるため注意が必要です。

MySQL & PostgreSQL:
```sql
DROP TABLE テーブル名;
テーブルの内容を確認
テーブルの構造（フィールドやデータ型など）を確認するコマンドです。
```

MySQL:
```sql
DESCRIBE テーブル名;
```

PostgreSQL:
```sql
\d テーブル名
```

3. データの操作に関するコマンド
データの挿入
テーブルに新しいデータを挿入するコマンドです。

MySQL & PostgreSQL:
```sql
INSERT INTO テーブル名 (name, age) VALUES ('John Doe', 25);
```
データの更新
既存のデータを変更するコマンドです。

MySQL & PostgreSQL:
```sql
UPDATE テーブル名
SET name = 'Jane Doe', age = 30
WHERE id = 1;
```
データの削除

指定した条件に基づいてデータを削除するコマンドです。

MySQL & PostgreSQL:
```sql
DELETE FROM テーブル名
WHERE id = 1;
```

データの検索
条件に基づいてデータを取得します。SELECT文はデータベース操作の基本です。

MySQL & PostgreSQL:
```sql
SELECT * FROM テーブル名;
```

条件を指定してデータを検索する場合:
```sql
SELECT * FROM テーブル名 WHERE age > 20;
```


4. インデックス操作
インデックスの作成
インデックスを作成することで、データの検索パフォーマンスを向上させることができます。

MySQL & PostgreSQL:
```sql
CREATE INDEX idx_name ON テーブル名 (name);
```

インデックスの削除
インデックスが不要になった場合は削除することができます。

MySQL:
```sql
DROP INDEX idx_name ON テーブル名;
```

PostgreSQL:
```sql
DROP INDEX idx_name;
```

5. トランザクションの操作
トランザクションは、複数のSQL文を一括して実行し、データの一貫性を保つために使用されます。

トランザクションの開始
トランザクションを開始します。

MySQL & PostgreSQL:
```sql
BEGIN;
```

トランザクションのコミット
変更を確定してトランザクションを終了します。

MySQL & PostgreSQL:
```sql
COMMIT;
```
トランザクションのロールバック
エラーなどが発生した場合、トランザクションの内容を元に戻します。

MySQL & PostgreSQL:
```sql
ROLLBACK;
```

6. ユーザーと権限に関するコマンド
新しいユーザーの作成
データベースに新しいユーザーを作成します。
MySQL:
```sql
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
```

PostgreSQL:
```sql
CREATE USER username WITH PASSWORD 'password';
```


ユーザーに権限を付与
ユーザーに対して、特定のデータベースへの権限を付与します。

MySQL:
```sql
GRANT ALL PRIVILEGES ON データベース名.* TO 'username'@'localhost';
```

PostgreSQL:
```sql
GRANT ALL PRIVILEGES ON DATABASE データベース名 TO username;
```
権限の確認
ユーザーに対してどの権限が付与されているかを確認します。

MySQL:
```sql
SHOW GRANTS FOR 'username'@'localhost';
```


PostgreSQL:
```sql
\du
```


7. データベースのバックアップとリストア
バックアップの作成
データベース全体のバックアップを作成するコマンドです。

MySQL（コマンドラインから）:
```sql
mysqldump -u root -p データベース名 > backup.sql
```


PostgreSQL（コマンドラインから）:
```sql
pg_dump データベース名 > backup.sql
```
バックアップからリストア
バックアップファイルからデータをリストアするコマンドです。


MySQL（コマンドラインから）:
```sql
mysql -u root -p データベース名 < backup.sql
```

PostgreSQL（コマンドラインから）:
```sql
psql データベース名 < backup.sql
```

今回はデータベース管理で覚えておくべきコマンドをまとめた記事を作成しました。