OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者向け】PHPのパッケージ管理ツール "Composer" って何？

:woman: : PHPで開発を始めたばかりなんだけど、パッケージ管理ってどうやってするの？何かいい方法ってある？

:man: : PHPのパッケージ管理には Composer というツールが便利だよ。Composer はパッケージの依存関係を管理してくれるんだ。

https://getcomposer.org/

:woman: : 依存関係って何？

:man: : 依存関係っていうのは、あるプログラムが他のプログラムやライブラリに頼っていることを示しているんだ。例えば、あるプログラムが "A" というライブラリを使っていて、それが正しく動くためには "B" というライブラリも必要だったりすることがあるんだ。

:woman: : なるほど！つまり、Composer はその依存関係を解決してくれるってこと？

:man: : そうそう、Composer はプロジェクトに必要なパッケージやライブラリを一括で管理してくれるんだ。依存関係を自動的に解決して、必要なパッケージをダウンロードしてくれるから、手動でインストールしたり設定したりする手間が省けるんだ！

:woman: : それは便利そう！どうやって Composer を使えばいいの？

:man: : Composer を使うには、まずプロジェクトのルートディレクトリ（プロジェクトの一番上のディレクトリ）に **composer.json** というファイルを作成するんだ。そのファイルに必要なパッケージの情報を記述することで、Composer がそれを解決してくれるんだ。

:woman: : 例えばどんな情報を書くの？

:man: : composer.json では "require" というセクションに必要なパッケージの名前とバージョン制約を書くんだ。バージョン制約はどのバージョンを使うかを指定する方法で、例えば "^1.0" は1.x系の最新バージョンを使うことを意味してて、">=2.3 <3.0" は2.3以上3.0未満の範囲のバージョンを使うことを意味しているんだ。
```json:書き方例
{
    "require": {
        "monolog/monolog": "2.0.*"
    }
}
```

:woman: : なるほど、それでどうやってパッケージをインストールするの？

:man: : composer.json を作成したら、ターミナルやコマンドプロンプトでプロジェクトのルートディレクトリに移動して、`composer install` というコマンドを実行するんだ。すると Composer が依存関係を解決して、必要なパッケージをインストールしてくれるよ。
```bash
composer install
```

:woman: : でも、パッケージのバージョンが更新されたらどうするの？

:man: : それは大丈夫だよ。composer.json の中の "require" セクションに書いたバージョン制約に基づいて、Composer は最新の安定版や互換性のあるバージョンを自動的に選んでくれるんだ。新しいバージョンがリリースされたら、`composer update` コマンドを実行することでパッケージをアップデートすることもできるよ。
```bash
composer update
```

:woman: : あと気になるのは、他の開発者とプロジェクトを共有してる場合かな。それぞれのコマンドを実行するタイミングによってバージョンに違いが出てきたりしないの？

:man: : それも大丈夫だよ。Composer はプロジェクトの安定性を保つために **composer.lock** というファイルを生成してくれるんだ。このファイルには、実際にインストールされたパッケージの正確なバージョン情報が含まれていて、他の開発者と composer.lock ファイルを共有することで、パッケージの一貫性を保つことができるんだ。

:woman: : なるほど！ composer.lock ファイルがパッケージの一貫性を保つための大事なファイルなんだね！Composer があればパッケージの管理が簡単になりそうだし、安心して開発できそう！

:man: : 分かってもらえてよかった！Composer はPHPの開発をスムーズに進めるための頼もしいツールだよ。ぜひ使ってみて！
Docker Tutorial #3 Docker run Nginx, Httpd, Mysql and Ubuntu (2023)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/e10ab998-127e-ecf8-0e99-eed1651071c5.png)

# Target commands
:::note info
 docker run mysql
 docker run nginx
 docker run httpd
 docker run ubuntu
:::

# Mysql
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/34f97d89-1984-7bb9-5bfa-a8eaebb3a236.png)


```terminal:terminal
    docker run -d --name db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pw mysql
```

# Httpd
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/49e29167-6657-6bd8-d31b-35ba7f2d885f.png)

```terminal:terminal
    docker run -d --name webserver -p 8080:80 httpd
```

# Nginx
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/82e54ce0-acfa-d231-d8b1-be2c51623da6.png)

```terminal:terminal
    docker run -d --name nginx -p 80:80 nginx
```

# Ubuntu
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/0eecf074-4186-5db6-4451-a9096d1151fa.png)

```terminal:terminal
    docker run -d -it --name ubuntu ubuntu
```


# Docker stats
>The docker stats command returns a live data stream for running containers.
```terminal:terminal
    docker stats
```

# Getting a shell inside Containers
>The docker exec command runs a new command in a running container.
```terminal:terminal
    docker exec -it db bash
    bash-4.4#

    mysql -u root -p
    Enter password:

    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 9
    Server version: 8.0.33 MySQL Community Server - GPL

    Copyright (c) 2000, 2023, Oracle and/or its affiliates.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql>show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.01 sec)

    mysql> exit
    Bye
    bash-4.4#

    bash-4.4# exit
    exit
```
データサイエンスのための微分積分 第10回 ハイネ 定理

:::note info
本記事は数学講座[2.9ハインの定理](https://www.matongxue.com/lessons/905/parts/831)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# ハイネ 定理

関数$f(x)$の定義域内で、$\displaystyle\lim_{n\to\infty} x_n=x_0，x_n\ne x_0，n\in\mathbb{Z}^+$ の数列{$x_n$}。このとき、以下の関係が成り立ちます：

```math
\lim_{n\to\infty} f(x_n)=L\iff \lim_{x\to x_0}f(x)=L
```

ハイネ定理が**関数極限**と**数列極限**の関係を結ぶ架け橋となる定理です。

:::note info
https://www.matongxue.com/lessons/905/parts/831
なぜこのハイネ定理が必要なのか、証明方法とか、まだ理解できていないです！
後で補足を追記します！
:::

# 応用例1

- $\displaystyle\lim_{x\to 0}\sin \frac{1}{x}$が存在しないことを証明する

関数$\displaystyle f(x)=\sin \frac{1}{x}$の図が以下通りです。$x=0$の時に、関数が定義なし！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/172a4f0e-ed7e-3308-1673-f3af218b8c7b.png)

1. 数列 {$\{f(x_n)\}$}、{$\displaystyle\{x_n\}$} = {${\frac{1}{2n\pi-\frac{\pi}{2}}\}$}、$→ $ $\displaystyle\lim_{n\to\infty}x_n=0$且つ$x_n\ne 0$
2. 数列 {$\{f(y_n)\}$}、{$\displaystyle\{y_n\}$} = {${\frac{1}{2n\pi+\frac{\pi}{2}}\}$}、$→ $ $\displaystyle\lim_{n\to\infty}y_n=0$且つ$y_n\ne 0$

但し、この時の$f(x_n)$と$f(y_n)$が違う
- $f(x_n)$ = -1
- $f(y_n)$ = 1

ハイネ定理によれば：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/f6765760-d10e-d43f-6553-5e8c9a2813e9.png)

同様な方法で、**$\displaystyle\displaystyle\lim_{x\to+\infty}\sin x$** 存在しないことも証明できます。

# 練習

- 以下の説明が正しいか：

もし、数列${x_n}$が**存在し**、$\lim_{n\to \infty}x_n = x_0 (x_n \neq x_0)$を満たし、$\lim_{n\to \infty} f(x_n)=L$である場合、$\lim_{x\to x_0}f(x)=L$となります。

↑
上記の説明が正しくない、**存在ではなく**、**任意**が正しいです。

例えば、上記の応用例1の場合は、以下の$x_n$の数列であれば、$\lim_{n \to \infty}x_n = 0$、且つ$\lim_{n \to \infty}f(x_n)=0$ですが、$\lim_{x\to x_0}f(x)=L$が存在しないです！

```math  
\{x_n\}=\{\frac{1}{n\pi}\}
```

# 補足

- ハイネ定理での$x_n\neq x_0$が必要な理由：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/4ba0d545-c60a-9403-1990-b79fc34075d9.png)

# 参照情報

- [函数极限的性质 海涅定理 （归结原则）（函数极限与数列极限的关系）](https://www.bilibili.com/video/BV1j7411V74w/?spm_id_from=333.337.search-card.all.click&vd_source=a38498a2570a69d082eaecc84f6d3fe7
)
Xiaomi 端末で File Provider 経由でファイルが共有できない（シェアなどが正しく動作しない）

# はじめに
Xiaomi Redmi 9A で File Provider 経由でファイル共有するための Intent を投げると、以下のように Intent を受け取った側でエラーが出てしまい非常に困ったので調査しました。

```java
java.io.FileNotFoundException: No content provider: content://mymy.package.debug.fileprovider/provided_dir/data.png
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1994)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1823)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1500)
at com.android.photos.BitmapRegionTileSource$UriBitmapSource.regenerateInputStream(BitmapRegionTileSource.java:267)
at com.android.photos.BitmapRegionTileSource$UriBitmapSource.readExif(BitmapRegionTileSource.java:304)
at com.android.photos.BitmapRegionTileSource$BitmapSource.loadInBackground(BitmapRegionTileSource.java:170)
at com.android.wallpapercropper.WallpaperCropActivity$3.doInBackground(WallpaperCropActivity.java:152)
at com.android.wallpapercropper.WallpaperCropActivity$3.doInBackground(WallpaperCropActivity.java:148)
at android.os.AsyncTask$3.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
```

# 解決方法
Xiaomi の一部の端末では簡単には adb インストールをさせてくれないので 「MIUIの最適化をオンにする」をオフにしていました。

なんとこれがオフになっているだけでエラーが発生する・・・。

「設定アプリ」 -> 「追加設定」 -> 「開発者向けオプション」 -> 「MIUIの最適化をオンにする」をオンに戻すだけ解決。

# 参考
https://stackoverflow.com/questions/69780554/miui-bug-intent-getting-activity-result-canceled
【Android】JDKの依存関係でビルドエラーとなった場合の対処法

# はじめに
様々な理由から現在でもAndroid13対応が終わりきっていないプロジェクトもあるのではないでしょうか？
そんな中でバージョンアップによりJDKの依存関係でビルドエラーになることがあります。
今回は上記が理由でビルドエラーとなった場合の対処法をまとめておこうと思います。

# 依存関係によるビルドエラー対処法
まず、エラーの内容は以下です。

```
Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.7.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21)
Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk7-1.7.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.21)
```

上記エラーを解消するには、gradleに以下を追加する必要があります。

```app/build.gradle
configurations.implementation {
    exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
    exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7'
}
```

以上になります。
今回のエラーはJDK7、８の依存関係でエラーとなっていますが、今後別のバージョンで同じエラーとなる可能性があります。
その場合は同じように追記すれば問題ありません。

# さいごに
Firebase Dynamic Linksがサービス終了するらしいですねー
プログラミング初心者がQiitaに登録してみた

### Qiitaに登録した経緯
Markdownでブログを書きたいと思うも、以下の理由で避けていました。

- 日記(ブログ)は **Qiita** に向かない
- **Qiita** はプログラミングのベテランのかたが使っている印象がある

けれどもMarkdownを覚えるには **Qiita** が使いやすいと思い登録‼

プログラミングの勉強に関するブログは **「blogger」** にして、要点をまとめたものは **「Qiita」** にしようと思いました。

:::note info
[MYブログ](https://programming-ns.com/programming-study3/ "看護師がプログラミング習得を目指す")
:::
ChatGPTが登場から質問してみたかった事: ソクラテスとプラトン

### 初めに
ChatGPTを使うことで、簡単に答えを得られる時代になりました。
昨今、「ChatGPTが嘘をつく」という足を引っ張るような発言を多く見るようになりましたが、それはちょっとフェアではないと思います。

どうせ質問するなら、回答が決まりきった事実ではなく、人類が何世紀もかかって取り組んでいる哲学的な内容が相応しいのではないかという考えに行きつきました。

OpenAIが開発した大規模言語モデルはご存知のように大量のデータに対して、自己教師学習と強化学習(RLHF)を使って生成されます。

このことを踏まえ、自分なりに気になっている質問をChatGPT(GPT-4)にぶつけてみます。
当初は質問内容のほんの些細な違いで、どの程度、回答に差分が発生するのかをdiffコマンドで比較してみる、ぐらいの気持ちだったのですが、私程度の人間を遥かに超える回答がもらえましたので、皆さんにも共有したいと思います。

:::note info
昨日、思い切ってChatGPT Plusを契約しました。(おこずかいが辛いことにw)
この記事は、これを記念として記録するために書いております。
したがって、お気軽に見ていただければ幸いです。
:::

質問内容は、こちらです。
```test:質問
現代に XXX が生きていて、もし、あなたと対話を繰り返したとしたら、
真理を追求する方法として、これまでにない新たな方法や道標が導かれると思います。
それはどのような内容や結論になりますか
```

そして、上記『xxx』に
* プラトン
* ソクラテス

を入力してみます。結果はこちら。

### プラトンの場合

```text:プラトンと入力
プラトンが現代に生きていたとしたら、彼の真理への追求は相変わらず強力であることでしょう。
そして私との対話を通じて、彼が導き出す可能性のある新たな方法や結論について
考えることは非常に興味深い課題です。

デジタル技術の活用: プラトンは現代の技術に興味を持つかもしれません。
彼は情報の利便性やアクセシビリティが真理への道筋をどのように変えるかを探求するでしょう。
例えば、彼は大規模なデータ解析やAIの能力を用いて真理を追求する新たな方法を検討するかもしれません。

現代科学との対話: プラトンは自然哲学を重視しており、現代科学の進歩を喜ぶでしょう。
彼は物理学、生物学、化学、神経科学など、真理に対する現代科学の理解を用いて、
新たな哲学的洞察を得るかもしれません。

多元文化の理解: 現代のグローバル化とインターネットは、様々な文化や思考の交流を可能にしました。
プラトンはこれら多元的な視点を真理への道筋に取り入れることを試みるかもしれません。
彼はそれぞれの文化が持つ真理の視点を理解し、それを融合させる方法を模索するかもしれません。

人間性とAI: AIの存在はプラトンの「何が真の知識であり、何が真の人間性であるか」という問いを
新たな形で引き立てるでしょう。
彼はAIと人間の関係性、およびAIが持つ「知識」が真の「知識」であるかどうかを深く探求するでしょう。

これらはあくまで仮説であり、プラトンが現代に生きていたらどのような視点や結論を得るかは、
完全には予測できません。しかし、彼の強い哲学的探求心を考えれば、
現代の課題に対する彼の洞察力は非常に興味深いものになるでしょう。
```

### ソクラテスの場合

```text:ソクラテスと入力
ソクラテスが現代に生きていた場合、彼の哲学的アプローチと現代の技術、科学、文化が融合した結果、
新しい真理探求の方法が生まれるかもしれません。

ディアレクティカ: ソクラテスはディアレクティカ（対話による問答法）を用いて真理を探求しました。
この方法を現代に適応すると、ソーシャルメディア、オンラインフォーラム、
AI技術などを活用した大規模なコミュニティベースのディスカッションが可能になります。
大量の視点と意見を織り交ぜながら、より洗練された真理に辿り着くかもしれません。

科学的方法との結合: 現代科学の進歩と統計的手法を利用し、
ソクラテスの哲学的疑問提起や詮索をさらに深めることができるでしょう。
理論と実践を結びつけることで、真理の探求は新たなレベルに達するかもしれません。

倫理学の再定義: ソクラテスが生きていたら、彼はおそらく現代社会の新たな倫理的課題（AIの倫理、
クローニング、環境問題など）についてのディスカッションを刺激するでしょう。
彼の哲学的視点は、これらの問題に対する新たな理解や解決策を導く可能性があります。

知識と無知についての新たな理解: ソクラテスの有名な言葉「我知ることなし」は、
自己の無知を認めることが知識の始まりであるという考えを表しています。
現代社会での情報過多や偽情報の問題を考えると、このソクラテスの考え方は、
どの情報が真実であるかを見極める新たな視点を提供するかもしれません。

これらはあくまで推測にすぎません。真理は一つではなく、探求する方法も無数にあると考えられます。
もしソクラテスが現代に生きていたら、彼なりの方法で新たな真理を探求するでしょう。
```

何かコメントでも書こうと思っていましたが、差分(diff)のレベルを遥かに超え、diffレベルでは全てが異なり、内容については、今の私では気の利いたコメントを書く事は到底不可能と判断しました。
以上です。
SQLでのデータベーステーブル設計の基本


こんにちは！今日はSQLでのデータベーステーブル設計についてお話ししようと思います。テーブル設計はデータベースの品質を保つ上で非常に重要なステップであり、その設計が適切でなければパフォーマンス問題やデータの整合性の問題が起こる可能性があります。

## テーブル設計の基本原則
まず、テーブル設計の基本原則から始めましょう。

1. 一貫性 : 同じ種類のデータは同じテーブルに格納すべきです。
2. 原子性 : 各フィールドは最小の単位まで分解されるべきです。
3. データの独立性 : 各テーブルは他のテーブルから独立しているべきです。

これらの原則を念頭に設計することで、スケーラビリティとメンテナンス性を確保できます。

## テーブル作成の基本SQL文
テーブルを作成する基本的なSQL文は以下の通りです。

```sql
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    column3 datatype,
   ....
);
```
`table_name`は作成するテーブルの名前、`column1`, `column2`などはカラム名、`datatype`はそのカラムのデータ型を表します。

たとえば、次のように`users`テーブルを作成できます。
```sql
CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(50),
    password VARCHAR(50)
);
```

このSQL文は`users`という名前のテーブルを作成します。このテーブルには`id`, `username`, `email`, `password`という4つのカラムがあります。

## 注意点
テーブル設計には以下のような注意点があります。

・ データ型の選択 : 適切なデータ型を選択することが重要です。例えば、パスワードにはVARCHARを、生年月日にはDATEを使用するなど、データの性質に応じて適切なデータ型を選択します。
・ 主キーの選定 : 各テーブルは一意の主キーを持つべきです。主キーはテーブルの各レコードを一意に識別するために使用されます。
・ 正規化 : テーブル設計の際には正規化を考慮することが重要です。正規化はデータの冗長性を排除し、データの整合性を保つための手法です。

以上がテーブル設計の基本的な考え方と、それを実現するための基本的なSQL文の作成方法です。設計の際にはこれらのポイントを念頭に置き、データベースのパフォーマンスと整合性を維持するよう心掛けてください。
SSHキーの生成からGitHub連携まで

# SSHキーを使用したローカルリポジトリとGitHubの連携

この一連の作業に関していい感じにまとめられたと思うので共有することにしました。
誰かの役に立てば幸いです。

## はじめに  
- ローカルでGitの初期設定を行う
```

# Gitでは誰が変更したのかが重要である為ユーザー名とe-mailの設定が必須(変更可能)
git config --global user.name "your_username"
git config --global user.email "your_e-mail"

# 新規リポジトリのデフォルトブランチ名をmainに変更
git config --global init.defaultBranch main

# 正しく設定できているか確認
git config --list

```
- 補足(`user.emailにnoreply アドレスを使う`)  
GitHub は Committer の判別にメールアドレス(git config の user.email)を使用している。  
これを連携させないと、GitHub 上のログに本人のアバターが出ない。  
しかし、自分のメールアドレスは登録したくないという人のために  
GitHub 側にて ダミーのメールアドレス(noreply アドレス) が用意されている。
```
1.GitHub にログイン
2.https://github.com/settings/emails を開く
3.「Keep my email address private」を ON にする
4.表示されたID+USERNAME@users.noreply.github.comのような形式のダミーアドレスをuser.emailに登録
```  
## SSHキーを使ってGithubと連携する
GitHub(リモートリポジトリ)とローカルを連携させるためにSSHキーを使って連携させる。  
手順は以下の通り    
```
1.ローカルのターミナルにてSSHキーを保存するディレクトリに移動
cd ~/.ssh

2.SSHキーをRSA形式で生成
オプションなし: ssh-keygen 
よりセキュアに生成: ssh-keygen -b 4096 -C "自身のuser.e-mailを指定"

※コマンドを実行してSSHキーを生成する際に
「SSHキーを保存するファイルのパス」と
「秘密鍵を保護するためのパスフレーズの追加」(push時にこのパスワードの入力が求められるようになる)
の確認がされる。
特別変更する必要がなければデフォルトのままEnterキーを押す。

3.公開鍵を表示しコピーする
cat ~/.ssh/id_rsa.pub

4.GitHubと連携する
GitHubにて
「https://github.com/settings/keys」ページで  
「New SSH keys」をして  
「Title」には任意の名前を付け  
「Key」にはコピーした公開鍵をペーストする。  
「Add SSH Key」を押下し完了。
```
補足
- `-b`オプション(bits): 生成される鍵のビット数を指定(デフォルト値:2048)
- `-C`オプション(Comment): 生成される鍵に追加するコメントを指定(一般的に自身のe-mailを指定する)
- `id_rsa.pub`ファイル: SSHキーペアの公開鍵ファイル

## さいごに
これらの内容は他の方の記事も存分に参考にさせて頂いてます。
ぜひそちらも参考にしてください。

## 参考
- [Cloud9とGitHubを連携させる方法（初心者向け）](https://qiita.com/higu1988/items/3a9c4fe528c2388bdc7f)
- [GitHub でダミーのメールアドレスを使用する](https://qiita.com/sta/items/982ab68e8220a81d485c)
- [【簡単】Cloud9とGitHubを連携させてソースコードを保存する方法](https://kosuke-space.com/cloud9-github)
GPUが2GBくらい解放されない原因の一つ

### あれ！？プロセス全部killしたのにGPUが0にならないぞ？！
深層学習初心者の僕は毎度毎度jupyter notebookなどで実験をしているとGPUメモリを解放したくて以下のコマンドをよく実行して
```
$ # nvidia関連のプロセスを全部kill
$ kill -9 $(lsof -t /dev/nvidia*)
```
僕「よし、GPU解放したぞ！nvidia-smiで早速確認〜」
```
$ nvidia-smi
Tue Jan 11 08:58:05 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000000:00:04.0 Off |                    0 |
| N/A   37C    P0    39W / 300W |   2631MiB / 16160MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      3721      C   ...nvs/codeparrot/bin/python     2629MiB |
+-----------------------------------------------------------------------------+
```

僕「ん、約2GBも解放されてない？なんでだ？」

と、ずっと疑問でしたが先日[hugging faceのドキュメント](https://huggingface.co/docs/transformers/perf_train_gpu_one)読んでたら解決しました。

### 原因：カーネルがGPUに乗るだけで結構メモリが食われる
結論としては
> pythonカーネルがGPUに乗ってるだけで1〜2GBメモリ食われるよ

とのことでした。以下、元ページの翻訳になりますが```nvidia-ml-py3```ライブラリからGPUの占有状況を調べてみると
```python
>>> from pynvml import *
>>> def print_gpu_utilization():
        nvmlInit()
        handle = nvmlDeviceGetHandleByIndex(0)
        info = nvmlDeviceGetMemoryInfo(handle)
        print(f"GPU memory occupied: {info.used//1024**2} MB")
>>> print_gpu_utilization()
GPU memory occupied: 0 MB
```
pythonを起動しただけではGPUは占有されていないことがわかりますが、torch.Tensorオブジェクト一つでもGPUに送ると...
```python
>>> import torch
>>> torch.ones((1,1)).to("cuda")
>>> print_gpu_utilization()
GPU memory occupied: 1343 MB
```
のように1GBもメモリは喰われてしまうようです！


### モデル単体はどれくらい食うの？
当然、利用するモデルにはよりますがBERTのlarge-uncasedもおよそ1.3GB取るみたいです。
```python
>>> from transformers import AutoModelForSequenceClassification
>>> model = AutoModelForSequenceClassification.from_pretrained("bert-large-uncased").to("cuda")
>>> print_gpu_utilization()
GPU memory occupied: 2631 MB.
```
従って、プロセスをキルしたとしても2GBくらいはメモリがしようされているものと考えて良さそうです！
Linux Laravelsail

コマンドは　sudo su - 
の後に入力してください。

Centos8

```sh
yum update
dnf -y remove podman
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf -y install --nobest docker-ce docker-ce-cli
dnf -y update docker-ce
systemctl enable docker
systemctl start docker
dnf upgrade
chmod +x /usr/local/bin/docker-compose
docker-compose --vesrion
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker ps -a
reboot
sudo usermod -aG docker USER
curl -s https://laravel.build/Laradocker | bash
cd Laradocker
chmod -R 777 storage
./vendor/bin/sail up
```

ubuntu

```sh

sudo curl https://get.docker.com | sh
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt-cache policy docker-ce
sudo apt install docker-ce

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v

sudo usermod -aG docker $USER
sudo systemctl start docker
sudo systemctl enable docker
docker --version
docker-compose --version
sudo reboot

curl -s https://laravel.build/Laradock | bash
cd Laradock
chmod -R 777 storage
./vendor/bin/sail up

```

起動後は
http://localhost/
で画面が表示されれば成功です。
次からコマンド長いなと思った人は下記のエイリアスをご確認お願いします。

``` 

vi ~/.bashrc

# Laravel Sail Command Alias
alias sail="./vendor/bin/sail"


上記を適当にスクリプトの影響のなさそうな場所に入れて保存。
最後尾等が割とオススメです!
最後に再読み込み。
source ~/.bashrc

``` 

登録後Laravel Sailの起動等は下記のようなコマンドになります。


``` 

シャットダウン
sail stop

立ち上げ
sail up

バックグラウンド立ち上げ
sail up -d

```
Webアプリケーションについて

今回は現在学習しているPHP絡みの **「Webアプリケーション」** について
調べ学習を行い、その結果を記載していきたいと思います。
「これは違うよ」という箇所ありましたら、コメントにてご教示いただけますと幸いです。

# Webアプリケーションとは

自分のPCにアプリケーションをインストールせずに、
ブラウザ(Microsoft Edge、Google Chrome、Safari等)があれば利用することができるアプリケーションのことです。
ログインや情報の登録、ユーザそれぞれに合わせたページの表示など複雑な動作が可能です。
有名な例でいうと、Youtube、クックパッドが該当します。
似たようなもので、Webサイトも同じくブラウザから利用することができます。
しかしWebアプリケーションとは異なり、情報の表示といったような単純な動作しかできません。

### 動く仕組みについて
普段、ネットで調べ物をしている状況を思い出してください。
皆さんたいてい、次のような操作をするはずです。
1. 「ブラウザ」のアイコンをクリックする。
1. 表示された「検索欄」に知りたいキーワードを入力し、検索ボタンを押下する。
1. 表示されたものの中から任意のURLをクリックする。
1. クリックしたURLのページが自分のPC画面に表示される。

我々人間からしたらボタンをポチポチ押しているだけの単純作業です。
しかし、裏であなたのPCはせっせと働き、あなたがクリックしたURLサイト画面を表示させるべく奮闘しています。
ではどのように働いているのか、それを今から説明します。(上記1~4の3~4の部分になります。)

説明するにあたり、2人の登場人物がいます。
１人目は **Webクライアント**さん。あなたがお持ちのPCさんです。
2人目は **Webサーバ**さん。世界のどこかに存在するPCさんです。
(※サーバと聞いて「?」となる方は、PCのことだと思ってください。)

2人はネットワークというもので繋がっており、通信ができる状態にあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/cffeefab-f2cf-4b80-be15-12200ad69b80.png" width=75%>


①Webクライアントさんがブラウザ上でURLをクリックするとWebサーバさん宛に
「このクリックしたURLの情報が欲しいです」とお願いを出します。（これが**リクエスト**)

②このお願いを受け取ったWebサーバさんは、
自身の中から対象のデータを探し、Webクライアントさん宛に返します。(これが**レスポンス**)

③最後にWebクライアントさんが返されたデータを自身の画面に表示する

この一連の流れによって、**初めて我々は閲覧したいWebページをみることができる**、というわけです。

※画像なしだと、非常にわかりづらいですね。ごめんなさい。


# 備考
ただ書籍を読んでいるだけでは 
**「わかったつもり」** となっていることがほとんどです。 
そして私もその一人。

この記事はできるだけ
1. **自分の言葉で記載し**
2. **綺麗に書くことを目的としない**

ことを意識しながらやっています。
より適した表現があれば、随時訂正していく予定です。
自分のために行っていますが、どなたかが言語化する際の手助けになれたら幸いです。
XcodeとGitHub連携時にSHA-1署名のRSAキーエラーについて

## エラー表示
XcodeとGitHub連携しようとしたところ、以下のエラーが表示されました。
![08264A6B-E20D-4CD0-A9D0-2741C0C40EB2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658262/ef792772-714e-93ea-e190-0e6064d99d35.jpeg)
## エラー内容
このエラーメッセージは、SHA-1ハッシュ関数を使用したRSAキーが使用されていることによるものです。
SHA-1はセキュリティ上の脆弱性があるため、現在は推奨されておりません。
エラーには、以下の記事を参考とのことです。
[GitHubのブログ記事](https://github.blog/2021-09-01-improving-git-protocol-security-github/)

どうやらXcodeとGitHubの連携だからというわけではなく、GitHubの仕様が変更されたみたいです。

関連して、Appleの回答は以下
[Apple回答](https://developer.apple.com/forums/thread/702389)


## 結論
ecdsaを使用して新しい SSH キーを生成しましょうとのこと

## 手順
#### はじめに
以下の手順は最適解というよりは、あくまで参考でお願いします。
#### ①.sshディレクトリに移動
```zsh:
cd ~/.ssh
```
#### ②新しいECDSA鍵を生成
```zsh:
ssh-keygen -o -a 100 -t ecdsa -f ~/.ssh/id_github -C "your_email@yourdomain"
```
"your_email@yourdomain"はご自身のアドレスを入力してください。
#### ③ssh-agentを実行します。
```zsh:
eval "$(ssh-agent -s)"
```
:::note info
SSHエージェント
秘密鍵を保持し、セッション中に再認証を要求されずにSSH接続を行うために使用されます。
:::
#### ④生成された鍵をキーチェーンに追加
```zsh:
ssh-add --apple-use-keychain ~/.ssh/id_github
```
:::note info
キーチェーン
MacOS上で秘密鍵を安全に管理するための仕組みです。
このコマンドにより、鍵をキーチェーンに追加し、パスフレーズを再入力する必要がなくなります。
:::
#### ⑤新しい公開鍵の内容をクリップボードにコピー
```zsh:
pbcopy < ~/.ssh/id_github.pub
```
#### ⑥GitHubのSSH設定ページへ
⑤でコピーしておいた公開鍵を[GitHubのSSH設定ページ](https://github.com/settings/keys)へ貼り付ける。
#### ⑦GitHubでトークンを取得する
[Personal Access Tokens](https://github.com/settings/tokens)からトークンを取得し、コピーしておく。
Select scopesは以下をチェックしておく。
・repo
・admin:public_key
・user
・write:discussion

#### ⑦XcodeへGithubアカウントを追加
・Xcode→Preferencesをクリック
![6C756DE5-5C74-4D31-90F4-4825B38E18FB_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658262/8d538378-79af-8412-add9-88985a597558.jpeg)
・Accountタブの左下の「+」をクリック
![4A6861CC-AA34-4B4D-A24F-DC9ACD1B2992.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658262/e4bc3426-e11d-be47-f1ff-4ace4d89de90.jpeg)
・GitHubを選択し、「Continue」をクリック
![B6575BD1-F477-462C-B864-51C69A572714_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658262/84af3909-606a-8a2a-0192-2569df36048e.jpeg)
・Accountと先ほどコピーしたトークンを入力し、「Sign in」をクリック
![E437EE7B-B243-4E8E-889A-5DAA8197B851_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658262/e18baf5b-be09-c6a9-d8c3-b7d3585938ce.jpeg)
・SSHキーとしてid_githubを選択する。
![3A95171C-9429-4A6E-9452-B71A29100819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658262/1128d2f9-3ceb-8b11-ad34-a12fb3de5e8f.png)
XcodeとGitHubが連携ができました。
就職面接における深掘り質問を予想するLINEbotを作ってみた【CODEMGYM AI Labインターン】

就職活動に取り組んでいる大学生で、面接官から予想外の質問が飛んできて困った経験はありませんか？今回は、そんな就活生にオススメなLINEbot「あなただけの深掘り質問予想」を紹介します！

# 目次
* 開発のきっかけ
* LINEbotの概要
* 苦労した点
* 使用した技術
* 最後に

# 開発のきっかけ
私がこのLINEbotを開発したきっかけは、数か月前まで就活生だった私自身の経験を生かしたLINEbotを開発したかったからです。一方で、既に就活生支援を謳ったLINEbotは世に溢れていました。しかし、その多くは自己分析や企業分析、ES作成を支援するというものでした。そういった就職活動序盤の課題を解決するLINEbotは多いものの、既に志望企業やES作成は済んでいる就活生向けのLINEbotは少ないのでは？と考え、そういった就活生を支援するLINEbotのプロダクト案の企画を始めました。そして、就職活動中盤以降で重要になる面接対策、特に面接官からの深掘り質問に着目し、深掘り質問を予め予想して対策ができるようなLINEbotを開発しました。

# LINEbotの概要
私が開発した「あなただけの深掘り質問予想」は、ユーザーが入力した「ガクチカ」や「志望動機」に対して、面接官が質問してくると想定される深掘り質問を提案するというサービスです。そして、提案した５つの深掘り質問に対する回答例も可能です。ユーザー自身のガクチカや志望動機を送信する部分以外は、全てLINEのクイックリプライ機能で操作することができます。したがって、シンプルかつ気軽に面接対策ができるようになっています。

* 実際の使用感
・ガクチカを深掘ってみた例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438688/77aca266-6231-a235-784d-6409e02f387b.png)
・志望動機を深掘ってみた例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438688/d565a11b-04d9-ee1a-f871-6a1c07aa3f34.png)
この例のように気軽に1文で聞いてみるのも良し、正式に書いた400字の志望動機文を送ってみるのも良しといった感じで、面接対策をすることが出来ます。まだガクチカが決まってない人も一度、何気ない大学生活の一部を送ってみると、意外な側面からガクチカが完成するかもしれませんよ？

・ふざけて送ってみた「わんちゃんを頑張って育てました」というガクチカに対する返答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438688/0958cc33-24e3-5b13-82f6-5542b2f34fdf.png)
一見ガクチカには到底ならないようなことでも、病気やケガ予防の観点から問題解決力や情報収集能力をアピールできるような一面を見ることが出来ました！

# 苦労した点
* アイデア出し
LINEbot開発を開始する前にインターン生たちでアイデア出しをする機会がありました。「こんなbotがあったら面白そう、役に立ちそう」というような案は簡単に出すことが出来ましたが、実際に開発に移そうと思うと、色々な障害があります。新規性やトークン量(マネタイズ)、需要と供給の観点から、それに見合ったプロダクトを発想するのは大変だったと思います。

* 例外処理
プロダクトを作るとき、開発者には「このように使われて欲しい」という理想があるわけですが、必ずしもそれを利用者が理解できるとは限りません。そのため、クイックリプライ機能や説明文を駆使して、ユーザビリティの高い設計にする必要がありました。それでも間違った使われ方をされる可能性を考慮して、例外処理も怠れません。プロダクトのリリース以降も、間違った使い方をしてしまっているユーザーを確認しています。今後も、この点に関しては修正が必要な様です。

# 使用した技術
* AWS
このLINEbotはAWSのLambda上で作った関数をLINEアカウントと連携させ、ユーザーから送信されたメッセージに対して実行されるようにしたものです。チャット履歴やユーザー情報はAWSのDynamoDBに記録しておき、会話が続くように設計しています。
* ChatGPT API
このアカウントがユーザーに対して送信する深掘り質問予想は、ユーザーの入力をChatGPTに送信して出力されたものです。OpenAIのアカウントからAPIキーを取得し、Lambda上で環境変数として連携させることで、ChatGPTとLINE上で会話することが出来ます。また、予めシステムプロンプトとして指令を与えておくことで、LINEbotに合わせた性質にChatGPTを変えることが出来ます。

# 最後に
このLINEbotアカウントは、私がインターン生をしているCODEMGYMでの業務の一環として開発したものです。AWSやLINEbotについては何も知らない状況から3週間ほどで学び、4日ほどの稼働時間で開発することが出来ました。
これからもインターンを通して開発したプロダクトを紹介していく予定なので、是非フォロー・いいねをお願いします！

今回開発したLINEbotの友達追加はこちらから！
https://liff.line.me/1645278921-kWRPP32q/?accountId=527rnyiu
Vue3でtoRefs()関数を使う

## reactive()関数とtoRefs()関数
- Vue3ではreactive()関数を使用することでオブジェクトをリアクティブにできる
    - リアクティブなオブジェクト＝オブジェクトの値が変更されると、自動的に追跡し変更されるオブジェクト
    - ただし、リアクティブなオブジェクトにアクセスする時は`.value`をつける必要がある

- toRefs()関数は、リアクティブなオブジェクトを個別の参照（ref）に変換できる
    - アクセスする際に`.value`が不要になる


以下の場合、userはリアクティブなオブジェクトのため、nameの値を取得したい場合は`use.name.value`のように`.value`を使う必要がある。
```javascript
const user = reactive({
  name: 'John Doe',
  age: 25
});
```
以下の場合はrefの参照になるため、`.value`を使わず直接参照できる
```javascript
const { name, age } = toRefs(user);

console.log(name.value); // 'John Doe'
console.log(age.value);  // 25
```

- reactive関数を使用して作成されたオブジェクトを、toRefsを使用せずに分割する場合、個別のプロパティはリアクティブではなくなり、プロパティの値が変更されても自動的に再レンダリングされなくなる


### 分割代入について
- JavaScriptの構文の一つで、配列やオブジェクトの要素を別々の変数に分割して代入する方法を**分割代入**という

以下のコードは、numbers配列の要素を [a, b, c, d, e] という変数に分割代入していて、配列の要素がそれぞれの変数に割り当てられ、値が表示されている
```javascript
const numbers = [1, 2, 3, 4, 5];

const [a, b, c, d, e] = numbers;

console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
console.log(d); // 4
console.log(e); // 5
```

オブジェクトでも分割代入は可能

```javascript
const person = {
  name: 'John Doe',
  age: 30,
  city: 'New York'
};

const { name, age, city } = person;

console.log(name); // 'John Doe'
console.log(age);  // 30
console.log(city); // 'New York'
```

リアクティブなオブジェクトを分割代入する場合に、リアクティブな状態を保ちたいのであれば、toRefs()を用いるようにする
Docker Tutorial #2 Docker run and stop (2023)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/d6b4b6f1-7619-1557-39ab-d290acd14510.png)

# Target commands
:::note info
**docker run**
**docker stop (container ID)**
**docker start (container ID)**
**docker logs (container ID)**
**docker rm -f (container ID)**
:::


# Docker run
>I will try running the NGINX image.

```terminal:terminal
    docker run -d -p 8080:80 nginx
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/83ec21b4-8c3f-7af6-6dc4-0742c33b2c14.png)

>I will check the running containers.
```terminal:terminal
    docker ps --format "CONTAINER ID:  {{.ID}}\nIMAGE:    {{.Image}}\nCOMMAND:  {{.Command}}\nCREATED:  {{.CreatedAt}}\nSTATUS:   {{.Status}}\nPORTS:    {{.Ports}}\nNAMES:    {{.Names}}"
```

```terminal:terminal
    CONTAINER ID:  157a491d1dc8
    IMAGE:    nginx
    COMMAND:  "/docker-entrypoint.…"
    CREATED:  2023-05-21 18:16:14 +0900 JST
    STATUS:   Up 14 minutes
    PORTS:    0.0.0.0:8080->80/tcp
    NAMES:    vigorous_mclaren
```

# Docker stop
```terminal:terminal
    docker stop 157a491d1dc8 (container id)
    157a491d1dc8
```

```terminal:terminal
    docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

```

# Docker start
>If you want to start the same container again, you would execute the "start" command. Running the "run" command would create a new container.

```terminal:terminal
    docker start 157a491d1dc8 (container id)
    157a491d1dc8
```

# Docker logs
>To check the logs, you can execute the following command
```terminal:terminal
    docker logs 157a491d1dc8
```

# Docker rm
>To remove a container, you can use the "rm" command. If you want to remove a running container, you need to include the "-f" option when executing the command.

```terminal:terminal
    docker rm -f 157a491d1dc8 or 157
```
【個人開発】って自信持って書きたかったけど。。。つまんないクソアプリ作ってしまった

## ウイスキー記録アプリ（仮）

ウイスキー記録アプリ(仮)

https://app-20230414.firebaseapp.com/

## コンセプト/Tobe 目指すべき姿

初心者がBarでとりあえずおすすめで！を卒業したい
ウイスキーの名前を覚えて、好きな銘柄をつくる第一歩のアプリ

## 特徴

- ウイスキーの名称、蒸留所名を記録できる
- 飲んだ感想を忘れないように記録できる
- 今までに飲んだ履歴を確認できる

:::message
ん、特徴なくね！？ってなってもう一度、好きなウイスキーを見つけるための独自の機能やシステムを探していくため基本機能が完成したこの段階で(仮)リリースします。
:::

## 類似サイトとの比較

::: message
そもそも、ウイスキー記録とかの関連アプリは少ないですが。。。
:::

- 玄人向けのサイトが多い印象
  - すでに名前は知っていて、ウイスキーの特徴を知っている人同士が繋がったり情報交換できる

## 開発期間

|日付|工程|
|----|----|
|2023/1~|アイディア考案|
|2023/2 初旬|開発計画策定|
|2023/2 初旬|フロントエンド実装開始|
|~2023/4|フロントエンド実装完了|
|2023/5 GW|バックエンド実装|
|2023/5 現在|デプロイ完了＆一旦リリース|

:::message
フロンエンドよわよわなのでめっちゃ時間かかった。tailwindCSS簡単でそれっぽくなって最高でした。
:::

## 技術選定

- バックエンド
  - Go
  - firebase Hosting
  - Firebase Storage
- フロントエンド
  - Vue.Js
  - tailwindCSS
- インフラ
  - Google Cloud Platform
    - Cloud run
  - PlanetScale
- ミドルウェア
  - Firebase Authentication
  - MySQL

## マネタイズ（予定）

- GoogleAdsenseによる広告収入
- ウイスキーのおすすめのアフィエイトリンクによる広告収入


## システム構成

1. フロントエンドの構成
    firebaseを使用。当初、App Engin にしようかと考えていたが認証や画像本する関係上、firebaseに統一。
2. バックエンドの構成
    Cloud Runを使用。最初こそつまずきはするが、コマンドやナレッジが蓄積されれば簡単、楽。
3. DBの構成
    PlanetScaleというOSSのサーバレスDBを使用。中身は、MySQLで使いやすい。ブランチ構成で開発と本番がGitと同じように分けられるし、アカウントもGithubのもで良い。無料枠の制限も個人利用は十分過ぎるほど多い。

    [PlanetScaleはこちら](https://planetscale.com/)

4. 認証
    Firebase Authenticationを使用。Firebase Admin SDK を使用するだけなので楽。

5. 画像保存
    Firebase Storageを使用。Google Cloud Storage でも良かったが。。。

## このアプリのこれからについて

- まず、自分で使ってみて改善点を洗い出す
- 身近な人に使ってもらうなどして改善点を出してもらう
- 都度、issueを立ててアジャイルなサイクルを回す
- このアプリのユニークなポイントを見つけ実装し、本リリースする
- テスト書く

## まとめ

- このアプリを(仮)リリースした理由
  - ここでリリースしないと、一生リリースしな気がした。
  - 他にも作りたいもの[^1]が多過ぎる。
  - クリーンアーキテクチャとか学んでいかなければいけないことも多い。
- アイディアを形にしてみての感想
  - 今までツール系しか個人開発作らなかったがやはりサービスを作るのは難しい
  - フロンエンド苦手だけど、やりやすくするフレームワークはたくさん知れたし、いろいろ作っている途中に目移りしそうになって困った
  - 他の個人開発者の方も言われているが、このアプリは使われるのだろうかという疑問が常にあった
- マネタイズむずい
  - 広告収入くらいしか考えつかない
  - かといって、サブスクを導入するようなアプリでもない
  - 本当に、新しいビジネスモデルを創造できる人って尊敬できるなと感じた
- ChatGPTめっちゃ頼った
  - Google検索よりも早く目的の情報にたどり着ける
  - たまに、あきらかに間違いもある
  - AIさまさまでした

[^1]: [PokeAPI](https://pokeapi.co/)ならぬ、モンハンAPIをオープンソースで作りたい

## 過去に個人開発したツール

https://qiita.com/o-ga/items/6abb7081d470926cb128

https://qiita.com/o-ga/items/fe6e50affca4488de3ae
ITパスポートを受ける

# はじめに
その昔、初級シスアドという資格を取得した者です。諸事情によりITパスポート試験を受けることにしました。

# ITパスポートとは

https://www3.jitec.ipa.go.jp/JitesCbt/

日本のIT業界ではもはや説明不要の入門資格で、非IT業界でもDX界隈の多くの人が取得していいます。特に近年は金融業界の大量受験により2022年度（令和四年度）は受験者数が25万人を超えたそうです。

https://www.ipa.go.jp/shiken/reports/ip-oubo2022.html

# 試験勉強

はじめはNO勉強で真の実力を測ることも考えましたが、受験手数料もお安くないので、万全の構えをとるために下記のコースを受講することにしました。

### [ITパスポート最速合格コース ～効率的な学習で0から合格まで～](https://www.udemy.com/course/itpassport/)

https://www.udemy.com/course/itpassport/

> ITパスポート試験は問われる範囲が広く、必要となる知識が多岐にわたります。書籍などで学習をしようとしてもそれぞれの単語の関連がわからず、ただの暗記になってしまうこともあります。しかし、このコースでは仕組みや実際の例、図を使って体系的に必要な知識を学習することができます。このコースでテストに合格するだけではなく、実生活の中でITを理解できるような知識を身につけましょう！

と、コースの説明に書いてありましたが、本当にその通りだと思います。二進数の計算方法などの基本的な話から、話題のSDGsの話までとにかく範囲が広いので「昔聞いた気がする・・・」という内容を一通り思い出しておくだけでも、安心感を得ることができます。

思い出すだけでなく、目新しいトピックとして「ストラテジ」の内容、例えば知的財産や法律の話はとても新鮮でしたし、年々アップデートされると思うのでここだけ毎年復習したいほどでした。GDPRくらいは何となく知っていても[COPPA](https://niantic.helpshift.com/hc/ja/18-niantic-kids/faq/1178-what-is-coppa-and-why-is-it-important/)なんて聞いたことありますか？


# 試験の流れ

https://www3.jitec.ipa.go.jp/JitesCbt/html/application/applies.html

## 申し込み
その昔（初級シスアド）は書店などで申込書を取り寄せたり、今では考えられないくらい面倒だった申し込みですが、今は全部Webから完結できるようになっており、便利になりました。独特のUIに戸惑うところはありましたが、手数料の振り込みもクレジットで決済できました。


## 試験当日
Webからダウンロードできる確認票(PDF)なるものと身分証明書をもって試験会場に行って受験します。計算用のA4用紙と鉛筆をもらって、端末の前に座り、試験を受けます。2時間にわたってひたすら4択の選択肢から選択し続けるのは精神的に疲れます。試験が完了するとすぐに採点されて合否が分かります。

## 試験の結果
試験が終わるとなんと経済産業大臣から翌々月中旬に合格証書が書留で送られてくるようです。何となく全体的に利権の香りのようなものを感じますが、楽しみに待ちたいと思います。

### 合格発表
試験の翌月に合格発表ということで合格者の受験番号がWebから確認できました。官報公示もあるようです。さすがは国家資格。

https://www3.jitec.ipa.go.jp/JitesCbt/html/openinfo/pass.html

### 合格証書
あれから2か月弱。とうとう経済産業大臣から合格証書が送られてきました。こんな仰々しい証書をもらったのはいつ以来か。

https://www.ipa.go.jp/shiken/logo/202305.html

ロゴの使用許可もいただけました。せっかくなので使ってみます。

![02_markset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/a7e2f7dc-92ae-0a74-5d9d-8f8c0b2566d6.png)


# おわりに
今まで機会がなくて受けていなかったITパスポートですが、問われる範囲が広範囲にわたるので勉強は意外と大変でした。それでも職場などで費用負担してもらえるならぜひトライすべきだと思いました。ITに関わる方であれば一般教養チェックとして持っておいて損は無いのではないでしょうか。そう「ITパスポート」ですから。
nuxt3がvuexを採用しなかった３つの理由

Nuxt3はVuexを採用せず、代わりにPiniaと呼ばれる新しい状態管理ライブラリを採用しました。これは、以下のような理由によるものです。

### 1. パフォーマンスの向上

Piniaは、Vue3のReactivity APIを最大限に活用しており、ストアの更新時に不必要な再レンダリングを引き起こす可能性があるVuexの監視機能の問題を解決することができます。

### 2. 単純さ

Vuexは、大規模なアプリケーションで非常に役立つことができますが、小規模なアプリケーションではオーバーキルになることがあります。Piniaは、より単純なアプリケーションで状態管理をより簡単に行うことができます。

### 3. 開発者エクスペリエンス

VuexのAPIは、一部の開発者にとっては複雑に感じることがあります。Piniaは、より直感的なAPIを提供することで、開発者のエクスペリエンスを向上させています。

### まとめ

以上の理由により、Nuxt3はVuexを採用せず、Piniaを採用したと言えます。ただし、Nuxt3は依然としてVuexをサポートしており、必要に応じて使用することができます。
ChatGPTで占いを作成し、毎日更新するサイトをAzureで建ててみた

# はじめに
　ChatGPTのAPIを使って何かしたいなというのとAzure Functionsを試してみたかったので、組み合わせて「ChatGPTで占いを作成して毎日自動更新するWebサイト」を作って公開しました。
　作成したWebサイトはこちら https://fortunetellingai.z11.web.core.windows.net/
　コードはこちら https://github.com/yymatsumoto/FofrtuneTellingAI

　個々の技術の使い方(ChatGPT API, Azure Functions, Azure Blob Storage)はググれば出てくると思うので書きません。やりたかったことは「日次でWebサイトを自動更新して公開する」なので、そこの流れを書きます。具体的なコードはGitHubを見てください。
　ChatGPTで占いを作成して使用しているのは日次で自動更新するコンテンツとしてちょうど良かっただけなので、占い結果については責任を負いません。

# 設計
* Azure Blob Storageを用いて静的なWebサイトを作成。このHTMLをAzure Functionsで日次更新する。
* Azure Functionsで、ChatGPT APIを呼び出して占い文言を作成→HTMLタグに変換→Azure Blob Storageを更新という流れを構築しています。
* C#を使用しています。

# ChatGPT APIの利用
　ChatGPT側でAPI keyを取得し、プロンプトを設定してAPIにPOSTすれば投げれば占い結果が返ってきます。
　設定したプロンプトは以下の通り。
```
yyyy/MM/ddの占いを作成してください。星座ごとに、12個の結果を作成してください。1つの星座は15文字程度で作成してください。結果以外の文章は生成しないでください。
```
　`15文字`は全然守ってくれないですが文字数を変えると文字数も一応変わるのと、1星座当たりの文字数が長いと12星座分を出してくれないので15文字に指定しています。

　`結果以外の文章は生成しないで`も時々守ってくれないのですが、指定しておくと冒頭がすごく長くなることはなさそうなので指定しています。
　例えば2023/5/21は頭に以下の文言がついています。
```
おはようございます。AIアシスタントの私が、今日の2023年5月21日の星占いをお届けします。それでは、さっそく各星座の運勢を見ていきましょう。
```
　確実に消すにはいろいろうまいことやってあげる必要がありそうですが、これはこれで味なので厳密に弾く処理はせずに採用しています。

# 占いからHTMLタグを作成し、Azure Blob Storageを更新
　取得した占いを用いてHTMLタグを作成し、Azure Blob StorageのHTMLを更新します。Microsoftが提供している.NET用Azure Storageクライアントライブラリを使用するとAzure側の諸々の設定を渡せば簡単に接続できるので便利でした。
　ちなみにデザインもChatGPTに作成してもらったCSSを使用しています。

# Azure Functionsで日次で占いを更新
　毎日占いを更新するため、TimerトリガーのAzure Functionsを作成し、上記の処理を一定間隔で実行しています。占いの要件を考えると日次で更新されればよいので1日1回実行すればよいと思っていたのですが、時々ChatGPTが反抗して「AIは占いを作成できません」といったことを言ってくるので、一日一回のみ実行では駄目でした。一方で一日数回実行すると一日数回占いが変わってしまうので、占いとして微妙じゃないか？という感じでした。
　その対応策として、一時間に一回実行にして、更新日文字列が本日の場合はスキップすることで一日一回(のみ)更新を実現しています(もっと良いやり方はたくさんあると思います)。

# Azure Blob Storageで公開
　上記で作成したHTMLをAzure Blob Storageの「静的なWebサイト」で公開しています。アクセス数単位の課金で1日当たり1円未満(碌にアクセスされなければ)のようなので、ポートフォリオみたいな感じで安く公開しておくには良いと思います。

# 最後に
　技術お試しドリブンの個人開発をしようとすると、コンテンツどうしようということが多かったのですが、厳密性の問われない適当なものとChatGPTの相性は良いですね。いろいろ試してみようと思います。
Docker Tutorial #1 Docker Commands (2023)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/fc35cfd5-78b3-b187-4968-f89f11cffc19.png)


https://docs.docker.com/engine/reference/commandline/cli/

# List of Docker commands
>Please execute the following command in the terminal.
```terminal:terminal
    docker
```

>The list of commands will be displayed.
```terminal:terminal
  run         Create and run a new container from an image
  exec        Execute a command in a running container
  ps          List containers
  build       Build an image from a Dockerfile
  pull        Download an image from a registry
  push        Upload an image to a registry
  images      List images
  login       Log in to a registry
  logout      Log out from a registry
  search      Search Docker Hub for images
  version     Show the Docker version information
  info        Display system-wide information
```


# Command Line Stracture
```terminal:terminal
    docker <command> <sub-command> (options)
```

# Sample
>I will try starting nginx on port 8080.

```terminal:terminal
    docker run -d -p 8080:80 nginx
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/753c80ba-a976-d78d-036f-2c6b0053b8d7.png)
既存の docker-compose.yml を Dev Containers で利用する方法

- [この記事で改善できること](#この記事で改善できること)
- [実行環境](#実行環境)
- [コンテナー環境の構築](#コンテナー環境の構築)
- [Dev Containers 拡張機能を使う](#dev-containers-拡張機能を使う)

# この記事で改善できること

Docker 環境のためインストールした Python パッケージの補完が VSCode で使えないといったことの改善。  
他の言語でも同様の内容を改善できると思います。

# 実行環境

|                 |                    |
| --------------- | ------------------ |
| PC              | Mac mini M1, 2020  |
| 仮想環境        | Docker             |
| エディター      | VSCode             |
| VSCode 拡張機能 | Remote Development |

# コンテナー環境の構築

Dev Container を使用する前に Docker 環境の構築を始めます。  
まず使用するフォルダーを作成し、VSCode で開きます。

ターミナルで以下のコマンドを実行します。

```sh
mkdir devcontainer-sample
cd devcontainer-sample
code .
```

アプリケーション開発用のフォルダーとファイルの作成をします。

```sh
mkdir src
touch src/main.py src/requirements.txt
```

FastAPI を実行するための依存関係を記述します。

```src/requirements.txt
anyio==3.6.2
click==8.1.3
fastapi==0.95.2
h11==0.14.0
idna==3.4
pydantic==1.10.7
sniffio==1.3.0
starlette==0.27.0
typing_extensions==4.5.0
uvicorn==0.22.0
```

コンテナーでの動作確認用に以下の記述をします。

```src/main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}
```

次に Dockerfile と docker-compose.yml の作成を行います。

```sh
touch Dockerfile docker-compose.yml
```

```:Dockerfile
FROM python:3.11-slim

WORKDIR /src

COPY ./src/requirements.txt .
RUN pip install -r requirements.txt
```

```docker-compose.yml
version: '3'
services:
  fastapi:
    build: .
    volumes:
      - ./src:/src
    ports:
      - 8000:8000
    command: uvicorn main:app --host 0.0.0.0 --reload
```

コンテナーの起動をします。

```sh
docker compose up -d
```

ブラウザーで `http://localhost:8000/` を開き、`{"Hello":"World"}` と表示されれば動作の確認完了です。

コンテナーを停止させます。

```sh
docker compose down
```

# Dev Containers 拡張機能を使う

```sh
mkdir .devcontainer
touch .devcontainer/devcontainer.json
```

```.devcontainer/devcontainer.json
{
  "dockerComposeFile": "../docker-compose.yml",
  "service": "fastapi",
  "workspaceFolder": "/src"
}
```

service に記述する値は docker-compose.yml で services に記述した値を使います。

workspaceFolder はコンテナー内のフォルダーを指定します。  
そのフォルダーを VSCode で開くことになります。

F1 を押し、入力欄に `>Dev Containers: Reopen in Container` と記述し Enter でリモートコンテナー環境を実行します。

ブラウザーで `http://localhost:8000/` を開き、`{"Hello":"World"}` と表示されれば動作の確認完了です。

F1 を押し、入力欄に `>Dev Containers: Reopen Folder Locally` と記述し、Enter でリモートコンテナー環境を終了し VSCode で元のフォルダーを開きます。
プログラミング初学者の質問

## はじめに
今回プログラミングスクールに通い始めて私が質問するときに気を付けようとしている質問の仕方についてまとめようとおもいます。　　
自分が分からないことに対して相手に質問する際に「**相手の時間を取らずに解決まで至れるか**」を意識して質問を考えることです。　　
　　
私自身分からないことも分からないと、いきなり「○○が分からないです。」「エラーが出て解決できないです。」などと質問しがちになってしまいます💦　　

そこで今回いろんなサイトを拝見しどのような手順で質問すればよいかまとめました。

## 質問の１５分ルール
質問をするとき自分で解決しようと思って考えていて気が付いたら２時間も経過していた！　　
なんてことはざらにあると思います。（私もよくやりがちです…）

その結果予定通りに作業が進んでいないと焦っていました。
確かに自分で考えることも大切ですが、それによって遅れが生じ予定通りに完成できないということもありますよね。

**そこでどのタイミングで質問するべきなのか？**

そこで１５分ルールです！
- １５分は自分で調べたりして解決できるかやってみる
- １５分経っても解決できなかったら質問する

これを意識するだけでも効率よく学習や仕事ができるようになると考えています。

「**１５分経ったら聞けばいいや！**」って思っていても
知らぬ間に時間が過ぎていることもありますが💦

なのでだいたい、行き詰ってから**15分～45分くらい**考えたけど無理！ってなったら質問するように心がけています。

質問するタイミングはこんな感じです。


## 質問の仕方について

質問する際の手順はこんな感じ💭💭

**(1)実現したいこと**　　
**(2)実現するために自分が試したこととその結果**
**(3)調べた内容や資料**
**(4)原因だと思う箇所**

こんな内容を踏まえて質問すると〇

(1)実現したいこと
自分が何をしようとしたときにエラーなどがでたのか。なんの処理を行いたいのかを明確に伝えることです。

(2)実現するために自分が試したこととその結果
問題やエラーから自分なりに考えて試したこと、調べたことなどとそのことを試した結果を伝えることです。
(質問したいということは結果的に自分の思うようにはいっていないと思うので。)

(3)調べた内容や資料
どのような意図をもって解決策を調べたのかを伝えます。
参考にした資料を添付したりすると分かりやすいですね！

(4)原因だと思われそうな箇所
(1)～(3)で試してみて解決できなかったけど、
「このエラー文からこのコードに原因がありそう」
などと自分で仮説してみると解決の目処が立ちやすいと思います。



#### 質問するときはただ答えを教えてもらうではなくヒントや注目するべき場所を教えてもらうというスタンスが大事！
だと私は思いました。

まだまだ私も
「ここのエラーが出たのですが、分からないところも分かりません！！」
ってこともあるのでその時は素直にわかりません。と伝えていますが、ここは自分の改善点でこれからもっと質問上手になって
効率よく学習を進めていきたいと思っています！！


初めての投稿で文章も読みにくいかと思いますが、こちらもこれからいろんなアウトプットに活用していきたいと思います！
【Git】Gitのブランチに「&」を入れたら削除できなくなった件


## 問題点
gitのブランチで下記のようなブランチ名を作成したら、削除できませんでした。
例) feature/add_view&controller

```
$ git push origin --delete feature/add_view&controller
[1] 19856
zsh: command not found: controller
error: unable to delete 'feature/add_view': remote ref does not exist
error: failed to push some refs to 'https://github.com/~'

[1]  + exit 1     git push origin --delete feature/add_view
```

どうやら「&」が入っていると、&より後ろのブランチ名（controller）がbashコマンドと見なされてしまっているようです。

## 対策
削除するときに、下記の形であれば削除できるようになりました。
単純にダブルクウォートで囲ってあげれば削除できました

```:ローカルブランチ
git branch -d "feature/add_view&controller"
```

```:リモートブランチ
git push origin --delete fix/authentication
```
本日の微分方程式（17日目）

またまた本日も積分因子の問題です．
こんなんなんぼやったって良いですからね（ほんとに）．
明日からは，定数変化法を使って解いていこうと思います．

前回の内容はこちら

https://qiita.com/Schwarzschi1d/items/d0f2eb7c26e8b923b7f2

## 問題
積分因子を用いて，以下の微分方程式の一般解を求めよ．

```math
\begin{align}\tag{1}
y^\prime +\frac{4y}{x} = \sin2x.
\end{align}
```

## ポイント
- $\dfrac{\mathrm{d}y}{\mathrm{d}x}+P(x)y=Q(x)$ の形式の微分方程式は，**一階線形微分方程式**と呼ばれます．
- **積分因子**とは， $e^{\int P(x)\mathrm{d}x}$ のことです．一階線形微分方程式は，積分因子をかけることで，左辺が積の微分の形になります．
- 一階線形微分方程式については，ヨビノリさんの動画もご参照ください．

https://www.youtube.com/watch?v=Hfby9zyZ0HY&list=PLDJfzGjtVLHnmhT1AhMx7bSt0ZOGbIP3c&index=4

## 解説

まずは積分因子を具体的に求めていきましょう．
$P(x)=\dfrac{4}{x},~Q(x) = \sin 2x$ ですから，

```math
\begin{align}\tag{2}
e^{\int P(x)\mathrm{d}x}
&=e^{\int \frac{4}{x}\mathrm{d}x}\\
&=e^{4\log |~x~|}\\
&=e^{\log |~x~|^4}\\
&=e^{\log x^4}\\
&=x^4,
\end{align}
```

と求まります（ここの積分においては，$P(x)$ の原始関数を1つ求めるだけでいいので，任意定数は不要です．[参考](https://qiita.com/Schwarzschi1d/items/aa2abcda639b8f0e2550)）．

これを与えられた微分方程式（1）の両辺にかけていきましょう．


```math
\begin{align}\tag{3}
y^\prime\times x^4 +\frac{4y}{x}\times x^4 &= \sin2x\times x^4\\
\therefore y^\prime\times x^4 +y\times 4x ^3&= x^4\sin2x.\\
\end{align}
```

さて，左辺は積の微分の形になっているはずです．
積の微分公式 $\left(f(x)g(x)\right)^\prime = f(x)^{\prime}g(x)+f(x)g(x)^{\prime}$ と，にらめっこしてみましょう． 
$f(x)=y,~g(x)=x^2$ としてみれば，$\left(f(x)g(x)\right)^\prime$は，

```math
\begin{align}\tag{4}
\left(y\times x^4\right)^\prime = y^\prime\times x^4 +y\times 4x ^3,
\end{align}
```
と表すことが出来ます．
紛れもなく式(3)の左辺と一緒です．
したがって，式(4)の結果を式(3)に代入すれば，

```math
\begin{align}\tag{5}
\left(y\times x^4\right)^\prime = x^4\sin2x,
\end{align}
```

との関係式を得ます．後は両辺を $x$ で積分して完了です．

```math
\begin{align}\tag{6}
\int \left(y\times x^4\right)^\prime \mathrm{d}x&= \int x^4\sin2x\mathrm{d}x,\\
y\times x^4&= \int x^4\sin2x\mathrm{d}x,\\
y\times x^4&= -\frac{1}{2}x^4\cos2x+x^3\sin 2x+\frac{3}{2}x^2\cos2x-\frac{3}{2}x\sin2x-\frac{3}{4}\cos2x  +C~~~(C:任意定数),\\
\therefore y&= -\frac{1}{2}\cos2x+\frac{\sin 2x}{x}+\frac{3\cos2x}{2x^2}-\frac{3\sin2x}{2x^3}-\frac{3\cos2x}{4x^4}+\frac{C}{x^4}~~~(C:任意定数).\\
\end{align}
```

## 【補足】 瞬間部分積分

最後の式の部分積分は，俗に言う瞬間部分積分と呼ばれるもので暗算しています．
（まともに計算をしても良いのですが，$\LaTeX$ で書くのが面倒だったのもあります．）

```math
\begin{align}
\int f(x)g(x)\mathrm{d}x &= f^{(0)}g^{(-1)}-f^{(1)}g^{(-2)}+f^{(2)}g^{(-3)}-f^{(4)}g^{(-4)}+f^{(5)}g^{(-5)}-\cdots\\

\int x^4\times \sin 2x\mathrm{d}x &=-\frac{1}{2}x^4\cos2x+x^3\sin 2x+\frac{3}{2}x^2\cos2x-\frac{3}{2}x\sin2x-\frac{3}{4}\cos2x  +C
\end{align}
```

詳しくは，ヨビノリさんの動画をご参照ください．

https://www.youtube.com/watch?v=5YyP8WA2aik

## 【参考】 Wolframalpha

非常に便利なので皆さん積極的に使っていきましょう．

https://www.wolframalpha.com/input?i=y+%E2%80%B2+%2B4y%2Fx+%3D+sin%282x%29&lang=ja
(デカ文字)Arduino UNOとSSD1306に「数字」まとめ


● 12x24

https://qiita.com/caa45040/items/536d3eb255a631bac473

● 24x32

https://qiita.com/caa45040/items/f32388e044765c6239fa

● 32x32

https://qiita.com/caa45040/items/1f438f3084f59e66471b

● 24x48 注意

https://qiita.com/caa45040/items/060d0715ad7aab6f3387

● 32x48　注意

https://qiita.com/caa45040/items/219ee49f5cbc84ff80ac

● 24x64

https://qiita.com/caa45040/items/d0303832e6ebcef52646

● 32x64

https://qiita.com/caa45040/items/2e138b451b26afc7e652

● 64x128 注意

https://qiita.com/caa45040/items/598f1288f1a9584832a1
Neon (Postgres) をコンテナで動かす

Neon は Postgres の永続データをオブジェクトストレージに保存することが可能です。そのためストレージ使用量のオートスケーリングによるコスト効率とオブジェクトストレージの高い耐久性のメリットを享受できます。

手っ取り早く試すには[提供元のマネージドサービス](https://neon.tech/)がありますが、無料枠が ~~3GB~~（いまは 0.5GB ）で足りなかったためコンテナでお試し環境を構築しました。

コンテナを使わずにローカルで動かす場合

https://qiita.com/mikecaat/items/f7aea72dd610c7a04171

また、 Vercel Postgres という名前でサーバーレス SQL データベースとして提供されています。

https://vercel.com/blog/vercel-storage

#### 構成（Docker Compose）
- pageserver x 1
- safekeeper x 3
- storage_broker x 1
- compute x 1
- MinIO x 1 （Amazon S3 互換オブジェクトストレージ）

#### ソースコードをクローン
```shell
git clone https://github.com/neondatabase/neon.git --depth 1
cd neon/docker-compose/
```

#### コンテナを起動
```shell
# コンテナを起動
docker compose up --build -d

# バージョン指定する場合。Postgresバージョン（デフォルトは14）、コンテナイメージのタグバージョン（デフォルトはlatest）
PG_VERSION=15 TAG=2937 docker compose up --build -d
```

#### compute node に接続
さっそく `localhost:55433` に `psql` コマンドで接続してみます。
接続データベース名「postgres」
ユーザーは「cloud_admin」
パスワードは 「cloud_admin」
```shell
# インストールせずにコンテナの psql で接続（入っていない場合など）
docker run -it --rm --add-host=localhost:host-gateway postgres:latest psql -h localhost -p 55433 -d postgres -U cloud_admin

# インストール済み psql で接続する場合
echo "localhost:55433:postgres:cloud_admin:cloud_admin" >> ~/.pgpass
psql -h localhost -p 55433 -U cloud_admin
```
これで Neon の Postgres データベースに接続できました！
アプリケーションなどプログラムからも Postgres と同等に扱えると思います。

:::note
Neon 特有のブランチ機能は？と思われそうですが、ブランチ作成方法など不明なので分かり次第追加したいです。
`cargo neon` コマンドで操作するようなのですが…
:::

#### MinIOで永続データを見たい場合（S3互換ストレージ）
永続データは S3 互換ストレージの MinIO に保存されています。
操作PCとサーバーが別なのでポートフォワーディングして繋ぎました。
```shell
# SSH ポートフォワーディング
ssh -L 9001:localhost:9001 <remote-server> -N
```
http://localhost:9001/ にアクセスしてログインすると永続データを確認できます。
- Username: `minio`
- Password: `password`
:::note
この構成だとコンピューティングとストレージがコンテナ単位で分離しているものの同じマシン上に存在しています。
せっかく分離できているので、高い耐久性を誇る AWS S3 や Cloud Storage に保存したいところです。
:::

#### 参考にしたサイト
- https://github.com/neondatabase/neon/blob/main/docs/docker.md
- https://gotohayato.com/content/561/
【Python】バイナリサーチの実装

# はじめに
与えられた数字のインデックス番号を返すアルゴリズムです（binary_search）。

# 実装

```python:binary_search.py
from typing import List, NewType

IndexNum = NewType("IndexNum", int)

def linear_search(numbers: List[int], value: int) -> IndexNum:
  for i in range(0, len(numbers)):
    if numbers[i] == value:
      return i
  return -1

# パターン１（該当する数字のインデックス番号を出力）
# def binary_search(numbers: List[int], value: int) -> IndexNum:
#   left, right = 0, len(numbers) - 1
#   while left <= right:
#     mid = (left + right) // 2
#     if numbers[mid] == value:
#       return mid
#     elif numbers[mid] < value:
#       left = mid + 1
#     else:
#       right = mid - 1
#   return -1

# パターン２
def binary_search(numbers: List[int], value: int) -> IndexNum:
  def _binary_search(numbers: List[int], value: int, left: IndexNum, right: IndexNum) -> IndexNum:
    if left > right:
      return -1
    
    mid = (left + right) // 2
    if numbers[mid] == value:
      return mid
    elif numbers[mid] < value:
      return _binary_search(numbers, value, mid + 1, right)
    else:
      return _binary_search(numbers, value, 0, mid - 1) 

  return _binary_search(numbers, value, 0, len(numbers) - 1)

# テスト
if __name__ == "__main__":
  nums = [0,1,5,6,8,10,25] 
  print(binary_search(nums, 6))
```

# 参考
https://www.udemy.com/course/python-algo/
nuxt3 と viteはどんな関係？

Nuxt 3 と Vite は、どちらも JavaScript アプリケーションを構築するためのツールです。

### Viteはビルドシステム

Nuxt 3 は、サーバーサイドレンダリング（SSR）を含む Vue.js ベースのアプリケーションを構築するためのフレームワークであり、Vite は、モダンなウェブ開発のための高速なビルドシステムです。

### Nuxt 3はViteを内包

Nuxt 3 は、Vite をビルドシステムとして採用しています。これにより、Nuxt 3 ユーザーは、Vite のパフォーマンスの向上と柔軟性を享受できます。また、Vite は、HMR（ホットモジュールリローディング）やエラー時のリカバリーなど、開発中の機能強化にも貢献しています。

ただし、Nuxt 3 は、Vite によって提供される機能の一部をラップして、より簡単に利用できるようにしています。例えば、Nuxt 3 では、Vite の HMR 機能が Nuxt の HMR 機能と統合されています。また、Nuxt 3 では、TypeScript のサポートがデフォルトで有効になっていますが、Vite は TypeScript をサポートしていますが、デフォルトでは無効になっています。

### まとめ

Nuxt 3 は、Vite をビルドシステムとして採用することで、より高速で柔軟性の高い開発を可能にする一方で、Vite によって提供される機能をより使いやすくするようにカスタマイズされています。