OmniAICreator/Qiita-1.07M huggingface dataset:
古いスマートフォンにDockerをインストールする最も簡単な方法（Root不要）

# 古いスマートフォンにDockerをインストールする最も簡単な方法（Root不要）

## すべてはICDOWNダウンロードサイトのおかげ

私はZerotermuxを探しているときにこのウェブサイトを見つけました。

（ちなみにZerotermuxも非常に便利です。Termuxをベースに多くの実用的な機能が追加されています。）

### 必要なAPKファイル
[Alpine Termux APK](https://d.icdown.club/repository/main/Alpine_Termux.apk)

このAPKをインストールすると、Alpine Linux環境を搭載したqemuエミュレータターミナルが使用可能になります。

### 使用手順
1. APKをインストールし、`Launch`を選択して起動します。

   ![Launch画面](https://i-blog.csdnimg.cn/blog_migrate/84a6f684d852c8bf12035fceb51e2e58.png)

2. Linux環境を起動します。

   ![Linux起動画面](https://i-blog.csdnimg.cn/blog_migrate/b706652165b10511a51fa059d1e9ffde.png)

3. `root`ユーザーでログインします。

   ![ログイン画面](https://i-blog.csdnimg.cn/blog_migrate/af127d355d84a9223f07bbb21db9f963.png)

### Dockerのインストール

Alpine環境が準備できたら、以下のコマンドでパッケージを更新してDockerをインストールします。
```bash
apk update && apk add docker
```

ただし、`apk update`でエラーが発生した場合は、リポジトリを変更する必要があります。

#### リポジトリの変更手順
1. 以下のコマンドでリポジトリ設定ファイルを編集します。
   ```bash
   vi /etc/apk/repositories
   ```

2. ファイル末尾に以下を追加します。
   ```
   http://dl-2.alpinelinux.org/alpine/v3.9/main
   http://dl-2.alpinelinux.org/alpine/v3.9/community
   ```

   ![リポジトリ変更画面](https://i-blog.csdnimg.cn/blog_migrate/07b56bb58ae7e8d4206e9fb898c17667.png)

3. 不要なリポジトリをコメントアウトしてエラーを防ぎます。

   ![コメントアウト例](https://i-blog.csdnimg.cn/blog_migrate/a058d122979aa925414222192620175c.png)

4. `esc`キーを押して以下を入力し、保存して終了します。
   ```
   :wq
   ```

5. 再度`apk update`を実行します。

   ![更新成功画面](https://i-blog.csdnimg.cn/blog_migrate/ca2556c2f18c1c61c36d76b6fb6aa6a6.png)

6. Dockerをインストールします。
   ```bash
   apk add docker
   ```

   ![インストール画面](https://i-blog.csdnimg.cn/blog_migrate/99b73ec0cdb2df4e22c59ce6c2f054b0.png)

### Dockerの起動
1. Dockerサービスを起動します。
   ```bash
   service docker start
   ```

   ![サービス起動画面](https://i-blog.csdnimg.cn/blog_migrate/84eae4e8896281d2822662e67c1aedae.png)

2. 以下のコマンドでDockerが正しくインストールされているか確認します。
   ```bash
   docker version
   ```

   ![バージョン確認画面](https://i-blog.csdnimg.cn/blog_migrate/75c04b10ca4e92c4cf4d31dbfa04555a.png)

### 自動起動設定
Dockerを起動時に自動的に開始するには、以下のコマンドを実行します。
```bash
rc-update add docker boot
```

### SSHの設定
リモートSSHが必要な場合は、以下の記事を参考にしてください。
[AlpineでのSSHサービスのインストールと設定](https://mayanpeng.cn/archives/248.html)

#### ポートフォワーディング設定
1. 起動時に`Setting`を選択します。

   ![Setting画面](https://i-blog.csdnimg.cn/blog_migrate/d611f9527bcf29c46eed4c4d3fec3e5c.png)

2. `Exposed ports`を選択し、転送するポートを設定します。

   ![ポート設定画面](https://i-blog.csdnimg.cn/blog_migrate/34ec82838a1f9547233006c599a996d4.png)

   ![ポート入力例](https://i-blog.csdnimg.cn/blog_migrate/d84b6c0d6ab4cf13db04c7bac79f8e17.png)

### 参考リンク
- [Alpine LinuxでのDockerインストール方法](https://zhuanlan.zhihu.com/p/107963908)
WindowsシステムでVS CodeのCode Runnerを使ってShellスクリプトを実行する方法

### WindowsシステムでVS CodeのCode Runnerを使ってShellスクリプトを実行する方法

#### 環境変数を設定せずに実行可能

Shellスクリプトの1行目にシェルを指定しないでください。たとえば、`#!/bin/bash`のような記述は不要です。これを書いてしまうと、Code Runnerの設定を上書きしてしまいます。

#### VS Codeの設定で`Code-runner: Executor Map`を検索

1. **"setting.jsonで編集"**をクリックします。

    ![設定画面](https://i-blog.csdnimg.cn/blog_migrate/acaf0ac87165e8a864890572054f49ab.png)

2. Shellスクリプトの後ろにある引用符内の内容を使用したいシェルのパスに変更します。

    私の場合は、Gitに付属のBashを使用しました。

    ![GitのBashパス](https://i-blog.csdnimg.cn/blog_migrate/f5ff6d48aacb33a992e600c7e5ee7a72.png)

#### 注意点

Windowsからコピーしたパスは次のようになっている場合があります（外側に手動でダブルクオートを追加）。

```
"C:\Program Files\Git\bin\bash.exe"
```

これを次の形式に修正します：

```json
"shellscript": "  & \"C:\\Program Files\\Git\\bin\\bash.exe\"",
```

* パス外側のダブルクオートおよび中のバックスラッシュには、それぞれ前にもう1つバックスラッシュを追加してエスケープします。
* さらに、先頭に` & `を追加します。

（この操作はVS CodeでPythonファイルをデバッグする設定から着想を得ています。かなり詳しく説明したつもりです。）

#### 実行方法

保存後、`.sh`ファイルのウィンドウに戻り、右上の三角ボタンをクリックするだけで実行できます。（再度強調しますが、`#!/bin/bash`のような記述は不要です。）

![実行ボタン](https://i-blog.csdnimg.cn/blog_migrate/0e915f7faacb112620a6228f4b055ea0.png)

#### 楽しい学習を！
UbuntuでNode.js環境設定

定期監視するのにNode.jsの```pm2```を使うとアプリケーションが永続化できて便利。
UbuntuにNode.js環境を構築する手順。
|ツール|概要|
|---|---|
|nvm|Node Version Manager<br>Node.jsのバージョン管理ツール<br>複数のNode.jsバージョンのインストールとバージョン切り替えが可能になる|
|Node.js|オープンソースのJavaScript実行環境|
|npm|Node Package Manager<br>Node.jsのパッケージ管理ツール<br>Node.jsと一緒にインストールされる|

# 今回の環境
:::note
ubuntu 22.04 (arm64)
:::

# nvmインストール
```shell
cd ~
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
```
:::note
実行結果
```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16631  100 16631    0     0  44944      0 --:--:-- --:--:-- --:--:-- 44948
=> Downloading nvm from git to '/home/aoisouma/.nvm'
=> Cloning into '/home/aoisouma/.nvm'...
remote: Enumerating objects: 380, done.
remote: Counting objects: 100% (380/380), done.
remote: Compressing objects: 100% (323/323), done.
remote: Total 380 (delta 43), reused 179 (delta 29), pack-reused 0 (from 0)
Receiving objects: 100% (380/380), 382.75 KiB | 4.50 MiB/s, done.
Resolving deltas: 100% (43/43), done.
* (HEAD detached at FETCH_HEAD)
  master
=> Compressing and cleaning up git repository

=> Appending nvm source string to /home/aoisouma/.bashrc
=> Appending bash_completion source string to /home/aoisouma/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
```
:::

```shell
source ~/.nvm/nvm.sh
```

バージョン確認
```shell
nvm -v
```
:::note
自環境でのバージョン
```
0.40.1
```
:::

# Node.js, npmインストール
```nvm```を使ってインストールを行う。
バージョンの指定には複数の方法あり

## stableバージョン
```stable```:安定バージョン
```shell
nvm install stable --latest-npm
nvm alias default stable
```

## LTSバージョン
```LTS```:(Long Term Support)長期メンテナンスサポートがあるバージョン
```shell
nvm install --lts --latest-npm
nvm alias default 'lts/*'
```

## 指定バージョン
```
nvm install バージョンNo
```

:::note
インストール例
```shell:3つのバージョンをインストールした場合
nvm install --lts --latest-npm
nvm install stable --latest-npm
nvm install 18.12.0
```
```shell:使用バージョンおよびdefaultをltsに設定
nvm use lts/*
nvm alias default lts/*
```
上記の場合、下記のようになっている
```shell:インストールの確認
nvm ls
```
![スクリーンショット 2025-01-13 18.11.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090248/77327d99-4654-907a-e421-9214b7504e8d.png)

:::

## (補足)```nvm alias default```の機能
```nvm alias default``` を使うと、```Node.js``` のデフォルトバージョンを設定できます。この設定を行うと、```nvm use``` コマンドを明示的に指定しなくても、ターミナルを起動した際や新しいシェルセッションを開始した際に、自動的にそのバージョンが使用されます。
```shell:デフォルトバージョンの設定
nvm alias default lts/*
```

```shell:デフォルトバージョンの削除
nvm unalias default
```

# PM2のインストール
グローバルインストールする
```shell
npm i -g pm2
```
:::note warn
nvm useで指定したNode.js環境でインストールされます。
Node.jsのバージョンを変更するとインストールされていないことになります。
:::
Chakra UI を使おうとしたら「プロパティ 'value' は型 '{ children: Element[]; }' にありませんが、型 'ChakraProviderProps' では必須です。」と言われた件について

# はじめに
業務でReactを初めて扱うことになったので、JISOの方のハンズオン動画を参考にキャッチアップをすることにしました

動画は以下
https://www.youtube.com/watch?v=_S--bTdPezU

その中でChakra UIを利用するステップがあったのですが、動画の手順ではうまく行かなかったので記事にしてみました


# 開発環境
|カテゴリ  |ソフトウェア名  |バージョン  |
|---|---|---|
|OS  |Windows  |11  |
|プログラミング言語  |TypeScript  |5.6.3  |
|ライブラリ  |react  |18.3.1  |
|ライブラリ  |chakra-ui\react  |3.3.1  |
|ビルドツール  |vite  |6.0.7  |

# 問題

動画の開始から[ちょうど25分たった際](https://www.youtube.com/watch?v=_S--bTdPezU#t=0h25m00s)に、Chakra UIを利用するためのコンポーネントであるChakraProviderを追加していました。実際のコードが以下になります。

```react:App.tsx
import { ChakraProvider } from "@chakra-ui/react"
import { Title } from "./Title"

function App() {
  return (
    <ChakraProvider>
      <div>
        <Title />
        <Title />
        <Title />
      </div>
    </ ChakraProvider>
  )
}

export default App
```

この時、表題にも記載した内容をVSCodeから警告されました
```
プロパティ 'value' は型 '{ children: Element; }' にありませんが、型 'ChakraProviderProps' では必須です。
provider.d.ts(4, 5): 'value' はここで宣言されています。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/6c658aa4-f584-7688-c480-1cbc620af284.png)


# 原因
Chakra UI V3が2024年10月にリリースされたらしく、そのアップデートに伴いChakraProviderの扱いが変わったようです。

https://qiita.com/kkawakami/items/754ab770cf74b3815fa3

実際にChakraProviderの参照元を見てみると、引数としてChakraProviderProps型のパラメータを必要としていることがわかります。
```react:node_modules\@chakra-ui\react\dist\types\styled-system\provider.d.ts
import type { SystemContext } from "./types";
declare const useChakraContext: () => SystemContext;
export interface ChakraProviderProps {
    value: SystemContext;
    children: React.ReactNode;
}
declare function ChakraProvider(props: ChakraProviderProps): import("react/jsx-runtime").JSX.Element;
export { ChakraProvider, useChakraContext };
```
# 解決

value値にChakra UI側が提供しているdefaultSystemを渡してあげればいいようです。
defaultという名前なのだから、省略させてほしいですね。。。
```react:App.tsx
import { ChakraProvider ,defaultSystem } from "@chakra-ui/react"
import { Title } from "./Title"

function App() {
  return (
    <ChakraProvider value={defaultSystem} >
      <div>
        <Title />
        <Title />
        <Title />
      </div>
    </ChakraProvider>
  )
}

export default App
```


# 参考
- 同一事象の記事

https://qiita.com/masa_code/items/ac1a9923ffbb0e616c28

- defaultSystemについての記載

https://www.chakra-ui.com/docs/theming/customization/overview
Windows上でのVS CodeでCodon環境を構築する方法

# Windows上でのVS CodeでCodon環境を構築する方法

長い間、噂のCodonがどれだけ速いのか試してみたかったのですが、CodonがWindowsをサポートしていないため困っていました。

以下はその進展についての記録です：

[Native Windows support by inumanag · Pull Request #403 · exaloop/codon (github.com)](https://github.com/exaloop/codon/pull/403)

このPRを見ると、対応が進んでいるようです（PRを新規作成しているだけかもしれませんが）。
近いうちに成果が出ることを期待しています。

ただ、公式によると、WSLを使えばWindows上で使用可能とのことです。

そこで、最強のエディターであるVS Codeを組み合わせてCodonを試せないかと思い、情報を検索しました。
しかし、ほとんど関連情報が見つからなかったため、自分で試しに設定を行い、その手順を共有します。

## 第1歩：WSLをインストールする

Microsoft Storeで好きなLinuxディストリビューションを検索してインストールをクリックするだけです。

ここでは、最も一般的なUbuntuを選びました。

![Ubuntuのインストール](https://i-blog.csdnimg.cn/blog_migrate/f0104f13af3b27b2d9255ee25ecf8bea.png)

ただし、インストール後に直接開くとエラーが発生することがあります。

エンターキーを押すとそのまま終了してしまいます。

原因はWSLのカーネルが古い可能性があります。

私のシステムはWindows 11 22H2ですが、これに関連しているかどうかは不明です。

この問題が発生した場合は、管理者権限でPowerShellを開き、以下のコマンドを実行して完了するのを待ちます：

```bash
wsl --update
```

その後、Ubuntuを再び開くと、正常にユーザー名とパスワードを設定できるようになります。

## 第2歩：Codonをインストールする

ユーザー名とパスワードを設定した後、公式のインストールコマンドをコピーして実行します：

```bash
/bin/bash -c "$(curl -fsSL https://exaloop.io/install.sh)"
```

インストールが完了すると、Codonのインストールパスが表示されます。

通常、現在のユーザーの`.codon`フォルダ内にあります。

このパスをコピーして保存しておいてください。この後使用します。

## 第3歩：VS Codeを設定する

ここでは、既にVS Codeがインストールされていることを前提とします。未インストールの場合は、自分でインストールしてください。

まず、Code Runner拡張機能をインストールします。

![Code Runnerのインストール](https://i-blog.csdnimg.cn/blog_migrate/4a3aa6eec4a00dffdadc2d43849f1d6f.png)

インストール後、設定で「code-runner.executorMap」を検索します。

![設定画面](https://i-blog.csdnimg.cn/blog_migrate/643a7e792907de317fee0c26ff2f8082.png)

「setting.jsonで編集」をクリックします。

Pythonの値を以下のように変更します：

**注意：`/username/.codon`の部分は、先ほどコピーしたCodonのインストールパスと一致させる必要があります。**

図では、私のusernameは`shinpei`です。

```json
"python": "cd $dir && wsl /home/username/.codon/bin/codon run $fileName",
```

![編集後の設定](https://i-blog.csdnimg.cn/blog_migrate/1124c26151f0aac6d9847eb0274c4772.png)

保存後、右上の実行ボタンをクリックしてPythonスクリプトを実行すると、自動的にCodonが呼び出されて実行されます。

![実行画面](https://i-blog.csdnimg.cn/blog_migrate/8e51c59a3a78b22d51b33fe0040e5d80.png)

正しい出力が表示されれば、設定成功です。

## 既知の問題

VS Codeでは、デフォルトでプロジェクトのルートディレクトリを作業ディレクトリとしてPythonファイルを実行します。このとき、Pythonファイルの絶対パスを取得します。

しかし、WSLでLinuxコマンドを実行する場合は、Linuxのファイルパスを使用する必要があります。Code Runnerが渡すWindowsのパスは認識されません。

私が採用した方法は、Pythonファイルのディレクトリに移動してからファイル名で実行する方法です。

単一のPythonファイルをテストする場合は問題ありませんでしたが、プロジェクトファイルが多い場合や、ファイル間で相互に呼び出しがある場合には問題が発生する可能性があります。

このディレクトリ管理の問題は、通常のVS Codeでも発生します。

Codonがさらに成長し、関連する補助ツールが充実することを期待しています。
DBeaverとExcelの連携

### DBeaverとExcelの連携

最近、同僚の勧めでこのかわいいラッコ（DBeaver）を知りましたが、そのインターフェースは以前使用していたa5m2よりも遥かに優れており、ER図機能も非常に強力です。ただし、結果をExcel形式でエクスポートする機能がない上、a5m2のようにデータを直接Excel表にコピーすることもできません。このように便利なツールに、こんな体験を損なう欠点があるなんて悔しい思いをしました。

そこで、ネットで解決策を探してみたところ、DBeaverがプラグイン拡張に対応していることが判明しました。「このニーズを満たすプラグインがあるのでは？」と考えた結果、見つけることができました！

#### 見つけたプラグイン

[DBeaver - Office integration | Eclipse Marketplace](https://marketplace.eclipse.org/content/dbeaver-office-integration)

![DBeaver Office Integration](https://i-blog.csdnimg.cn/blog_migrate/f34307dde7b96d822d99f0cd8922113b.png)

このプラグインを使用すると、結果をxlsx形式でエクスポートできるだけでなく、開いたExcelファイル内で直接結果を編集することも可能です。まさに求めていたものです！次に問題となるのは、プラグインのインストール方法です。

#### プラグインのインストール手順

1. DBeaverのメニューから「プラグイン」を選択します。
2. プラグインの検索欄に「DBeaver Office Integration」と入力し、該当のプラグインを選択します。

![プラグイン選択画面](https://i-blog.csdnimg.cn/blog_migrate/97c87bb9e486da581da89ab9ea838cc6.png)

3. プラグインを選択し、「次へ」をクリックします。

![インストール画面](https://i-blog.csdnimg.cn/blog_migrate/24e41b43e94cc4244b513dc47e388398.png)

4. 証明書を作成できないとの警告が表示される場合がありますが、「インストールを続行」をクリックしてください。また、ソフトウェアの信頼性を確認するダイアログが表示されたら、「信頼」をクリックします。

5. インストールが完了すると、DBeaverが再起動されます。

#### 動作確認

再起動後、以下のようにエクスポート用のボタンが追加されているはずです。

![エクスポートボタン](https://i-blog.csdnimg.cn/blog_migrate/38d28ca7e5377e6a1f0e1222b623675b.png)

試しにExcelに直接コピーしてみると、セルが生成されていることが確認できます。

![コピー結果](https://i-blog.csdnimg.cn/blog_migrate/698273fe4f25ccfe7afe5ecc74b475e8.png)

これで完璧に問題が解決しました！

#### 注意点

DBeaverをアップデートすると、プラグインを再インストールする必要がある点が少し不便です。
openbabel のMac/Linuxへのインストール方法

毎回忘れるので書きます。  
openbabelの公式ドキュメントにおける [Compiling open-babel](https://openbabel.org/docs/Installation/install.html#compiling-open-babel) の項に則ってやります。 
Mac or Linux でしかやったことがないので、Windowsの人はドキュメントを見てがんばってください。

# 事前にインストールしておく物

* tar
* cmake
* make

# 手順

1. ビルド用のディレクトリを適当に用意（`~/openbabel` など）
    ```bash
    mkdir ~/openbabel
    cd ~/openbabel
    ```
2. [GitHub のリリース](https://github.com/openbabel/openbabel/releases/tag/openbabel-3-1-1) から Ver.3.1.1 のソース（`openbabel-3.1.1-source.tar.bz2`) をダウンロードする
3. ディレクトリ下に tar.bz2 を移動
    ```bash
    mv ~/Downloads/openbabel-3.1.1-source.tar.bz2 ./
    ```
4. 解凍
    ```bash
    tar -jxf openbabel-3.1.1-source.tar.bz2
5. cmake
    注意：ここでカスタムディレクトリを指定しない場合はデフォルトで `/usr/local/bin` にコマンドがinstallされるため、手順7. で`sudo`が必要になります
    ```bash
    cd build
    
    # root権限でデフォルトの /usr/local/bin にインストールする場合
    cmake ../openbabel-3.1.1
    # root権限なしでカスタムディレクトリ下にインストールする場合
    cmake ../openbabel-3.1.1 -DCMAKE_INSTALL_PREFIX=/path/to/install/directory/
    ```
6. make
    ```bash
    make -j4 # 4並列で実行
    ```
7. コマンドをinstall
    ```bash
    make install
    ```
8. （optional）ビルド用に作った`~/openbabel` は削除しても大丈夫
    ```bash
    cd ../..
    rm -r openbabel
    ```
【Python】文字列関連の操作まとめ　※随時追加

様々なパターンの文字列の操作方法まとめ。自分用チートシート。
学習の進度に合わせて、内容は随時追加する。


# 1. 文字列の連結
+演算子を用いる。

:::note info
文字列1 + 文字列2
:::

``` python
string_1 = "あいうえお"
string_2 = "かきくけこ"

print(string_1 + string_2)

# あいうえおかきくけこ
```


# 2. 文字列の繰り返し（乗算）
*演算子を用いる。

:::note info
文字列 * 回数
:::

``` python
string = "あ"

print(string * 5)

# あああああ
```


# 3. 大文字・小文字の変換
いずれも文字列に対するメソッドを用いる。
## 3-a. 小文字 → 大文字（upperメソッド）
文字列内の小文字をすべて大文字に変換する。

:::note info
文字列.upper()
:::


``` python
string = "abc"

print(string.upper())

# ABC
```

## 3-b. 大文字 → 小文字（lowerメソッド）
文字列内の大文字をすべて小文字に変換する。

:::note info
文字列.lower()
:::

``` python
string = "ABC"

print(string.lower())

# abc
```


# 4. 文字列の長さを取得
len関数を用いる。

:::note info
len(文字列)
:::

``` python
string = "abcde"

print(len(string))

# 5
```


# 5. 部分文字列の操作
## 5-a. 特定位置の1文字を抽出
インデックスで指定すると、その位置の文字を取得できる。
インデックスは0から始まるため、n文字目の文字を出力したい場合は、インデックスでn-1の値を指定すればよい。

:::note info
文字列[n-1]
:::

:::note warn
文字列の長さ以上のインデックスを指定した場合は、エラーとなる。
:::

``` python
string = "abcde"

# 1文字目を抽出（インデックス指定は 1-1=0）
print(string[0])
# a

# 5文字目を抽出（インデックス指定は 5-1=4）
print(string[4])
# e
```

負の値を用いると末尾からの位置を指定できる。最後尾の文字のインデックスは-1となる。
``` python
string = "abcde"

# 最後の1文字を抽出
print(string[-1])

# e
```

## 5-b. 特定位置の部分文字列を抽出
スライスで抽出位置を指定する。前述のインデックスと同じく、0から始まる。

:::note info
n文字目からm文字目までの部分文字列を取得する場合
文字列[n-1 : m]
:::

``` python
string = "abcde"

# 2～4文字目を抽出
print(string[1:4])

# bcd
```

startを省略すると先頭からの取得となる。

``` python
string = "abcde"

# 3文字目までを抽出
print(string[:3])

# abc
```

## 5-c. 部分文字列の位置を取得（findメソッド）
:::note info
文字列.find(取得する文字列)
:::

### 取得可能な場合
``` python
string = "abcdefghij"

# 文字列"efg"の位置を取得
print(string.find("efg"))

# 5
```
最初の部分文字列（一番左の文字）の位置のみ取得できる。

### 取得不可能な場合
``` python
string = "abcdefghij"
print(string.find("xyz"))

# -1
```
指定した文字列が見つからなかったときは、`-1`が返ってくる。


## 5-d. 文字列の個数を取得（countメソッド）
:::note info
文字列.count(カウントする文字列)
:::
``` python
string = "abc_abc_abc_abc_abc_aaaaa"

# 文字"a"
print(string.count("a"))
# 10

# 文字列"abc"
print(string.count("abc"))
# 5
```


# 6. 文字列の置換（replaceメソッド）
:::note info
文字列.replace(置換対象の文字列, 置換後の文字列)
:::
``` python
string = "a1, a2, a3"

print(string.replace("a", "A"))
# A1, A2, A3
```
localhostがスマホで読み込めない時の対処法（Windows）

### 事象
PCでローカルサーバーを起動してReactアプリを表示でき、
- PCとスマホが同じWi-Fiであること
- IPv4アドレスを確認し、正しいアドレスであること  
- ファイアウォールを使用していないこと

を確認したにも関わらず、スマホで表示できなかった。

### 原因
WindowsのWi-Fi設定が悪さをしていた。
「プライベートネットワーク」に変更して、解決
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903141/cd5fd60e-cbe3-ae04-b23b-53c3dc122ecd.png)
paizaラーニングレベルアップ問題集の「カンマ区切りのN個のデータの入力」をやってみた。

paizaラーニングレベルアップ問題集の[カンマ区切りのN個のデータの入力](https://paiza.jp/works/mondai/stdin/stdin_comma_n)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/stdin/stdin_comma_n
- - -
###### 方針（C, C++）
- 整数$N$を受け取ります
- 以下を$N$回繰り返します
	- カンマ直前までの文字列を受け取る
	- 受け取った文字列を末尾改行付きで出力する
###### 方針（C, C++以外）
- 整数$N$を受け取ります
- 文字列を1行受け取り、カンマで区切り、文字列配列とします
- $i=1,2,...,N$について、文字列配列の$i$番目の要素を末尾改行付きで出力します

[カンマ区切りの3つのデータの入力](https://qiita.com/anonymously115/items/c74b14b3b600884bcf36)とは異なるコードを掲載します。
本記事のコードの方が初学者向けと思います。
- - -
###### C
```c
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		char s[101];
		scanf("%[^,],", s);
		printf("%s\n", s);
	}
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string s;
		getline(cin, s, ',');
		cout << s << endl;
	}
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		int n = int.Parse(Console.ReadLine());
		string[] S = Console.ReadLine().Split(',');
		for (int i = 0; i < n; i++) Console.WriteLine(S[i]);
	}
}
```
- - -
###### Go
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	var n int
	fmt.Scan(&n)
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	S := strings.Split(scanner.Text(), ",")
	for i := 0; i < n; i++ {
		fmt.Println(S[i])
	}
}
```
- - -
###### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		String[] S = sc.nextLine().split(",");
		for (int i = 0; i < n; i++)
			System.out.println(S[i]);
		sc.close();
	}
}
```
- - -
###### JavaScript
```js
const lines = require("fs").readFileSync("/dev/stdin", "utf8").split('\n');
const n = Number(lines[0]);
const S = lines[1].split(',');
for (var i = 0; i < n; i++) console.log(S[i]);
```
- - -
###### Kotlin
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	val n = sc.nextInt()
	sc.nextLine()
	val S = sc.nextLine().split(",")
	for (i in 0 until n)
		println(S[i])
	sc.close()
}
```
- - -
###### PHP
```php
<?php
	$n = intval(trim(fgets(STDIN)));
	$S = explode(",", trim(fgets(STDIN)));
	for ($i = 0; $i < $n; $i++)
		echo "$S[$i]\n";
?>
```
- - -
###### Perl
```pl
chomp(my $n = <STDIN>);
chomp(my $s = <STDIN>);
@S = split(",", $s);
for (my $i = 0; $i < $n; $i++) {
	print "@S[$i]\n";
}
```
- - -
###### Python3
```py
n = int(input())
S = input().split(',')
for i in range(n):
	print(S[i])
```
- - -
###### Ruby
```rb
n = gets.to_i
S = gets.split(',')
n.times do |i|
  puts S[i]
end
```
- - -
###### Scala
```scala
import scala.io.StdIn._

object Main extends App{
	val n = readInt()
	val S = readLine().split(",")
	for (i <- 0 until n) {
		println(S(i))
	}
}
```
- - -
###### Swift
```swift
let n = Int(readLine()!)!
let S = readLine()!.split(separator: ",")

for i in 0..<n {
	print(S[i])
}
```
Pythonで棒グラフを描写する

## 内容
棒グラフの描写方法を備忘録としてまとめておきます。
最終的な棒グラフのイメージはこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569853/dc8ee788-bd13-82e2-323c-6330e14056ba.png)

具体的な手順は下記になります。
```py
# ライブラリインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
```

今回はアヤメのデータを元にグラフを描写します。
```py
# データ読み込み
from sklearn.datasets import load_iris
iris = load_iris()
# データフレームを作成
data = pd.DataFrame(iris.data, columns=iris.feature_names)
# ターゲットデータを追加
data['target'] = iris.target
```

データは下記の状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569853/3219e4bf-7c37-2646-f41c-8bfa5325f693.png)

ターゲットのデータは下記に対応しています。
0 : setosa
1 : versicolor
2 : virginica

それぞれの平均値をグラフ化するコードをまとめていきます。
平均を算出する方法はGroupby関数を用いて平均を得ます。
```py
# グループ分けするコラムを指定
group = data.groupby('target')
# 平均を得るコラムを指定
group_mean = group['sepal length (cm)'].mean() #  平均

# ラベルを指定する
labels = ["setosa","versicolor","virginica"]

# 横軸の幅を指定
left = np.arange(len(labels)) 

plt.bar(left , group_mean , width = 0.5 , label = "mean" , color = "coral")
plt.xticks(left , labels)
plt.legend()
plt.show()
```

あんまりにも簡単なのでfor文をもちいて一括でグラフ描写します。
まずはコラム名を取得します。
今回は一番最後に"target"があるので、スライスでコラム名を取得します。

あとはFor文で変更するだけです。

```py
# コラム名を取得
columns = data.columns[ : -1]

# for文で一括で平均を取得＆描写
# ラベルを指定する
labels = ["setosa","versicolor","virginica"] 

# 横幅を指定
width = 0.2

# 横軸の幅を指定
left = np.arange(len(labels)) 

for i, column_name in enumerate(columns):
    group_mean = group[column_name].mean() #平均
    
    #グラフ描写
    plt.bar(left + i * width  , group_mean, width= width ,label = column_name)
    plt.xticks(left + (len(columns) - 1) * width / 2, labels)
plt.legend()
plt.show()
```

前回の投稿と同じような内容になってしまいましたが、
平均を簡単にグラフ化できるので便利かと思います。
【C#】キャスト時に便利なis演算子

コーディングしている際にどうしてもキャストを使いたくなるケースってありますよね？

C#においては一般的に3パターンの実装方法があります
### 1. 通常キャスト
```csharp
Animal animal = new Animal();

try
{
    Cat cat = (Cat)animal;
    // catを使った処理
}
catch (InvalidCastException)
{
    // 処理失敗時の処理
}

class Animal { }
class Cat : Animal { }
```

### 2. as演算子を使用
```csharp
Animal animal = new Animal();

Cat cat = animal as Cat;
if (cat != null)
{
    // catを使った処理
}

class Animal { }
class Cat : Animal { }
```
### 3. is演算子を使用
```csharp
Animal animal = new Animal();

if (animal is Cat cat)
{
    // catを使った処理
}

class Animal { }
class Cat : Animal { }
```

ケースバイケースだとは思いますが、キャスト時は便利なis演算子を使うことをオススメします！

理由は以下の通りです

## キャスト失敗時の例外リスク回避
通常のキャストの場合、キャストに失敗した際は`InvalidCastException`が発生します

つまり、適切な箇所でtry-catchの実装が必要ということですね

その実装を失念するとプログラムが予期せず落ちるリスクが高まり、アプリケーションの安定性の低下を招くかも...

is演算子ではキャスト失敗時はif条件式がfalseになるだけなので例外発生の考慮は不要になります

## Nullチェックが不要
as演算子を使用した場合、キャストに失敗した際はnullが返却されます

そのままnullチェックを行わず`cat`を使用しようとすると`NullReferenceException`の発生を招く可能性があります

つまり、as演算子を使う場合はキャスト後の値のnullチェックが必須になります

is演算子では値がnullの場合はキャスト失敗時同様にif条件式がfalseになるため、ブロック内の処理は実行されません

## コードの簡潔さ
is演算子を使えば、上記のキャスト失敗判定、nullチェックに加えてキャスト後の変数宣言も同時に記述できます

ifの条件式内でキャストが成功すれば、変数`cat`に勝手にキャスト後の値を代入してくれます

あとはifブロック内で`cat`をそのまま使うだけですね！

## まとめ
コードの記述量を見て貰えば一目瞭然ですが、is演算子を使うことによってかなり簡潔に実装できます

通常キャストやas演算子利用時より考慮すべき項目が少ないからということですね👍

複雑なエラーハンドリングが不要で、単純に型変換をしたいだけであれば便利な演算子なのでぜひ今後の選択肢の一つに！

## 参考
https://note.com/mizeee7956/n/nea627251b840

https://learn.microsoft.com/ja-jp/dotnet/csharp/fundamentals/functional/pattern-matching#null-checks
【AWS SAP】CloudFront経由でのS3アクセスにおけるHTTP 403エラー

# 背景

- メディア会社は静的ウェブアプリケーションを運用している。
- アプリケーションは Amazon S3 バケットにアップロードされ、Amazon CloudFront を利用して配信される。
- ビルドパイプラインはアカウントA内で実行される。
- S3 バケットと CloudFront ディストリビューションはアカウントBに存在する。

## 技術構成

- S3 バケットにはバケットポリシーが設定されている。
- CloudFront ではオリジンアクセスコントロール（OAC）が有効化されている。
- ファイルのアップロードにはアカウントAの IAM ロールが使用される。

## アーキテクチャ図

```mermaid
graph TD
    subgraph AccountA["アカウントA ビルドアカウント"]
        BuildPipeline["ビルドパイプライン"]
    end

    subgraph AccountB["アカウントB ディストリビューションアカウント"]
        S3Bucket["Amazon S3 バケット"]
        CloudFront["Amazon CloudFront"]
    end

    BuildPipeline -->|ファイルアップロード| S3Bucket
    S3Bucket -->|オリジンアクセスコントロール OAC| CloudFront
    User["エンドユーザー"] -->|HTTPリクエスト| CloudFront
    CloudFront -->|S3オブジェクトのリクエスト| S3Bucket
```

## 問題

- テスト中に CloudFront の URL 経由でアプリケーションにアクセスしようとすると、HTTP 403 Access Denied エラーが発生。

## 質問

- CloudFront を通じて S3 のオブジェクトに正常にアクセスできるようにするには、どのような対策を講じるべきか？



## 解答
- **S3バケットポリシーを確認**
  - オリジンアクセスコントロール（OAC）がCloudFrontからの`GetObject`アクセスを許可しているか確認。
　
- **CloudFrontの設定を確認**
  - 正しいOACがCloudFrontディストリビューションに設定されていることを確認。
　
- **オブジェクト所有権の確認**
  - アカウントAからアップロードされたオブジェクトの所有権がアカウントBに移譲されていることを確認。
      - アカウントAのIAMロールにbucket-owner-full-controlオプションを指定して、アップロード時に所有権をS3バケット所有者に移譲します。
        ```bash
        aws s3 cp YOUR_FILE s3://YOUR_BUCKET_NAME --acl bucket-owner-full-control
        ```
参考

https://repost.aws/ja/knowledge-center/s3-bucket-owner-full-control-acl

        
- **キャッシュをクリア**
  - CloudFrontのキャッシュをクリアし、最新の設定を反映。
論文読み : Eyes Wide Shut? Exploring the Visual Shortcomings of Multimodal LLMs

１つ前のDreamLIPの論文で，MLLMを使えば画像の詳細な情報をテキストで表現できると言っていましたが，MLLMの視覚能力の限界についての論文があったので読みました．

### 今回の論文
https://arxiv.org/pdf/2401.06209

### 概要
![スクリーンショット 2024-12-12 12.31.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/97aeca3a-123f-3cce-e1d9-91d6440e074b.png)
上の図はGPT-4Vに写真と写真に関する問いをして，GPT-4Vが間違えた例．人間では決して間違えないような簡単な問題でもMLLMは間違えてしまう．そういったタスクについて分析し，それに対応するアプローチも提案している．


### MLLMのどこが足を引っ張っているのか
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/a0132700-20fe-449b-cdf0-1287a5e030da.png">

この論文ではCLIPモデルが視覚的な詳細情報を欠いている点に焦点を当て，「CLIP-blind pairs」という新たなデータセットを作成し，視覚的限界を評価するためのベンチマーク（MMVP）を構築．
- Step1 : CLIPでの特徴空間上で近い且つ，DINOv2での特徴空間上で遠い画像ペア（CLIP-blind pairs）を探す
- Step2 : CLIP-blind pairsに対して人が視覚的相違に関する問題を作成

下の表はベンチマークを様々なMLLMに解かせた結果．最も性能が良いモデルでも40%ほど．

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/0b1c8156-7b0c-eb6d-c439-d0aa5d7928fe.png">

### この論文で提案されているモデル
![スクリーンショット 2024-12-12 12.42.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/eb46302f-b98b-63f9-9ea0-f7b9738f7829.png)
Standard MLLMに対し，Addictiv-MoF MLLM (A-MoF)とInterleaved-MoF MLLM (I-MoF)を提案．A-MoFではCLIPに加え，事前済みのDINO Encoderとの出力をAdapterに入力．I-MoFではCLIP EncoderとDINO EncoderそれぞれについてAdapterを用意し，Adapterの出力は交互に組み込んでLMに入力．

### 評価
- A-MoFの評価
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/f5071c51-71cc-54ee-6375-9c8c1959fe43.png">

SSL ratioはDINO Encoderの出力を使う割合．MMVPはこの論文で提案されているベンチマーク指標．LLaVAはinstruction-following capability，要するにLLMが指示に従う能力．
Standard MLLMと比べてMMVPは高くなるが，その代わりに指示が聞けなくなるというトレードオフが発生．

- I-MoFの評価
<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/416188b5-3ee6-2d17-7646-8ec7a1d1ad45.png">

POPEはハルシネーションの評価．
I-MoFではStandard MLLMと比べるとMMVPも向上し，instruction-following capabilityも向上している．
日経NETWORK_202501

日経NETWORK 2025年1月号を読んで、気になった記事を浅堀りする

## 日本企業のDMARC導入率

日本の大手企業の導入率は9割くらい
多いと考えるか、少ないと考えるか

https://www.twofive25.com/news/20240209_dmarc_report.html

### 経産省からの要請

クレジットカード会社等は、DMARC導入を要請されているみたい

https://www.meti.go.jp/press/2022/02/20230201001/20230201001.html

### 自分の会社はどう？

DMARC対応しているか調べてみよう

https://qiita.com/toshihirock/items/ad46e32721d1d301786b

## SPE (Single Pair Ethernet)

1対のより線だけで実現するイーサネット
もちろん速度は遅いけど、給電できるし距離も長い(1km)

https://e-spec.org/

> 元々、自動車のネットワーク向けに100BASE-T1が誕生しましたが省電力や取り回しやすさの点から産業機器等への使用に関しても注目が高まっております。

https://www.macnica.co.jp/business/semiconductor/articles/basic/143914/

ラズパイのHAT(拡張モジュール)も発売されている

https://www.okstech.co.jp/products/spe_hat.html

<iframe width="560" height="315" src="https://www.youtube.com/embed/F0ce9dID_T8?si=FhZ1QyQ3PfVN4gJa" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

ただし、SPE対応のLANスイッチは、まだまだ少ないようで、産業用のものしか見つからなかった
RJ45を主として、オプションでSPFポートを有するスイッチがあるように
SPEポートも必要になる

## マイクロセグメンテーション

https://xtech.nikkei.com/atcl/nxt/column/18/00001/09940/

> 従来のネットワークセグメンテーションでは、ネットワーク毎にファイアウォールを設置したり、VLAN等で境界を設けていましたが、**マイクロセグメンテーションでは、ホスト単位（サーバ、PC、コンテナといったワークロード毎）で論理的に境界を設けます。**

https://www.nri-secure.co.jp/glossary/microsegmentation

ホストにエージェントをインストールして、ホストOSのファイアウォールを直接編集するようで

https://www.illumio.com/ja/blog/illumio-agent-more-reliable-than-inline-agents
資格取得への道のり１：Cisco Certified DevNet Associate DEVASC 200-901

備忘録として残しておく


参考文献：
Cisco Certified DevNet Associate DEVASC 200-901 Official Cert Guide (English Edition)
https://amzn.asia/d/eTOG8kP

>>DevNet Associate認定資格の対象者

①キャリアの初期段階にある開発者
②ソフトウェアと自動化のスキルを取り入れたい経験豊富なネットワークエンジニア


自分は①に該当する
ゲームボーイ RGBDS 開発メモ 第13回 文字の表示

### タイトルに文字を表示したい
ビットマップデータを探したところひらがなも対応している[https://amaitorte.jp/others/lab/amtjp-gbstudio-font](https://amaitorte.jp/others/lab/amtjp-gbstudio-font) がありましたので、利用させていただきました。

こちらも rgbgfx で変換してロードしています。

```
SECTION "font", ROM0

FontTiles: INCBIN "font.bin"
FontTilesEnd:
```
224個のタイルデータを消費してしまうので、動的にタイルにロードするのも
考えたのですが、今回は贅沢にそのままロードさせました。

本当は表示する文字だけタイルに定義しているんだろうなあ。市販のROMのタイル見てみたい衝動に駆られます（笑）

```
; Param HL 文字列のアドレス
; Param DE 表示したいタイルマップ先頭
DrawCaption:
.loop
    ld a, [hl+] ; 文字コードを得る
    or a
    ret z 

    add 32 ; 文字コードからインデックスを得る
    
    ld [de], a
    inc de
    jr .loop
```

静的なら簡単ですね。C言語と同じように最後に0をいれておいて、
みつかったらretです。呼び出し側はこちら

```
DrawTitleCaptions:
    ld hl, .START_GAME ; 文字列のアドレス
    ld de, $9925 ; 表示したいタイルマップ先頭
    call DrawCaption

    ld hl, .CREDIT ; 文字列のアドレス
    ld de, $9983 ; 表示したいタイルマップ先頭
    call DrawCaption
    
    jr .done
.START_GAME: db "START GAME", 0
.CREDIT: db "２０２４ HIRO８２４AB", 0
.done
```

CHARMAPで文字列のコードを定義してあります。

```
CHARMAP "あ", 65
CHARMAP "ぃ", 66
CHARMAP "い", 67
CHARMAP "ぅ", 68
CHARMAP "う", 69
CHARMAP "ぇ", 70
CHARMAP "え", 71
CHARMAP "ぉ", 72
CHARMAP "お", 73
```

ドットから始まるラベルはそのラベルからだけ参照できるので、ローカルなものを定義するときいい感じ。
db "あい" で db 65,67 と定義したのと同じになります。これはプログラムとして実行されてはまずいので、jr でおしまいまで飛ばしてあります。

![スクリーンショット 2025-01-13 17.11.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733735/305366c7-704f-8c02-3452-3b0f128b3836.png)

Windowとかは使わず背景でやっています。スクロールさせたいからBGですね。

### 次回

スタートボタンを押すと次の画面へ遷移させます！ゲームの内容は
連射測定ゲームにする予定です！

### 雑談

今は、資料や開発環境も無料で使えて本当にいい時代になりました。昔は、LSI C 試食版しかなかった（笑）
スクロールやBGMはMSXではマシン語を使わないと難しかったので、今、コードを書いていてうれしいです。
Kotlin Koans やってみた 6

# Introduction
## Nothing type
### 問題
常に例外をスローする関数には、戻り値の型として Nothing を使用することができます。
そのような関数を呼び出すと、コンパイラは関数の実行がそれ以降続かないことを前提に処理します。

failWithWrongAge 関数には Nothing 型を戻り値として指定してください。
Nothing 型を指定しない場合、checkAge 関数はコンパイルされません。
これは、コンパイラが年齢が null である可能性を前提としているためです。

### 解答
```kotlin
import java.lang.IllegalArgumentException

fun failWithWrongAge(age: Int?): Nothing {
    throw IllegalArgumentException("Wrong age: $age")
}

fun checkAge(age: Int?) {
    if (age == null || age !in 0..150) failWithWrongAge(age)
    println("Congrats! Next year you'll be ${age + 1}.")
}

fun main() {
    checkAge(10)
}
```

### 解説
[Kotlin 公式ドキュメント > The Nothing type](https://kotlinlang.org/docs/exceptions.html#the-nothing-type)

#### The Nothing type
Kotlin では、すべての式に型があります。たとえば、`throw IllegalArgumentException()` という式の型は `Nothing` です。`Nothing` は Kotlin に組み込まれた型で、すべての型のサブタイプ、いわゆる「ボトム型」と呼ばれるものです。これにより、`Nothing` は他のどの型が期待される場合でも、戻り値の型やジェネリック型として使用しても型エラーを引き起こすことはありません。

`Nothing` は Kotlin で特別な型として扱われ、例外を常にスローしたり、無限ループなどで正常に終了しない関数や式を表現するために使用されます。この型は、まだ実装されていない関数や、常に例外をスローするように設計された関数に使用することで、コンパイラやコードを読む人に意図を明確に伝えることができます。関数のシグネチャでコンパイラが `Nothing` 型を推論すると警告が表示されますが、戻り値の型として明示的に `Nothing` を定義することで、この警告を回避できます。

以下の Kotlin コードは、`Nothing` 型の使用例を示しています。このコードでは、関数呼び出しの後のコードが到達不可能としてコンパイラに認識される様子が確認できます。
```kotlin
class Person(val name: String?)

fun fail(message: String): Nothing {
    throw IllegalArgumentException(message)
    // この関数は正常に戻り値を返すことはありません
    // 常に例外をスローします
}

fun main() {
    // 'name' が null の Person インスタンスを作成します
    val person = Person(name = null)
    
    val s: String = person.name ?: fail("Name required")

    // 's' はこの時点で確実に初期化されています
    println(s)
}

/*
Exception in thread "main" java.lang.IllegalArgumentException: Name required
    at FileKt.fail (File.kt:4)
    at FileKt.main (File.kt:13)
    at FileKt.main (File.kt:-1)
*/
```
Kotlin の `TODO()` 関数も `Nothing` 型を使用しており、今後の実装が必要な箇所を明確にするためのプレースホルダーとして役立ちます。
```kotlin
fun notImplementedFunction(): Int {
    TODO("This function is not yet implemented")
}

fun main() {
    val result = notImplementedFunction()
    // これは NotImplementedError をスローします
    println(result)
}

/*
Exception in thread "main" kotlin.NotImplementedError: An operation is not implemented: This function is not yet implemented
    at FileKt.notImplementedFunction (File.kt:2)
    at FileKt.main (File.kt:6)
    at FileKt.main (File.kt:-1)
*/
```
ご覧のとおり、`TODO()` 関数は常に `NotImplementedError` 例外をスローします。

# おわりに
`Nothing` 型って知らなかったな〜。
まだ実装してないよ〜って時に `TODO()` を使うのね。
`TODO("This function is not yet implemented")` これは関数未実装のときのテンプレとして使いたい！空で書けたらかっこいいんだけどな〜。あ、でも IntelliJ が気を利かせて入れてくれてたような気がしなくもない・・・

---

[← 前回の記事](https://qiita.com/b-yuko/items/672fc37e158180e58f9d)　|　[次回の記事 →](https://qiita.com/b-yuko/items/01541f78faf31c1ba311)
【Node.js】コマンド チートシート【Git】

:::note info
太字部分はその時々で書き換えて実行すること
[ ]内はオプションのため記述は必須ではない
:::

## Node.js(npm)コマンド
|コマンド  |意味  |
|---|---|
|npm install   |package.jsonを使った一括インストール  |
|npm install --save **module名**  |ローカルインストール<br>module名をpackage.jsonの依存情報に追加  |
|npm -g install **module名** |グローバルインストール|
|npm cache clear|キャッシュクリア|
|npm ls |インストール済モジュール一覧を表示|
|npm run **スクリプト名**|JavaScriptプログラムの実行|

## Angular(ng)コマンド
|コマンド  |意味  |
|---|---|
|ng serve |開発ビルドと実行<br>（ビルド結果はメモリ上にのみ展開）|
|ng build|ビルド結果をファイルに出力<br>(distフォルダへ)|
|ng build -prod --aot|公開用にサイズを縮小してビルド|
|ng lint|コード規約遵守の検証<br>（tslint.jsonファイルでルール設定）|

## Gitコマンド
|コマンド  |意味  |
|---|---|
|git clone **GitのURL**|リモートからローカルにクローンを作る|
|git branch [-a]|アクティブなブランチを確認する|
|git checkout **dev**|アクティブなブランチを切り替える|
|git checkout -b **features**|ローカルで新しいブランチを作成し、そのブランチに切り替える|
|git pull|リモートの変更をローカルに取得、更新する|
|git fetch|リモートの変更をローカルに取得する|
|git merge **origin/main**|fetchで取得した変更でローカルを更新する|
|git add|変更をすべてステージングする|
|git commit -m **"コミット時コメント"**|ステージングした内容をコミットする|
|git status|ローカルの変更状態を確認する|
|git diff|ローカルで比較して差分を表示する|
|git push origin **main**|リモートに変更を送信する|
【AWS SAP】エクスポネンシャルバックオフとは

# エクスポネンシャルバックオフとは
再試行間隔を指数的に増やし、負荷を軽減する**手法、仕組み**

<font color="red">**※一般的には設定値の意味ではない！**</font>
## 直訳すると
- エクスポネンシャル
    - **指数関数的**
- バックオフ
    - **後ろ**

## 具体的に
- 再試行のたびに待機時間を倍増させ、例えば1秒、2秒、4秒、8秒と増加させる
- これにより、システムの過負荷や競合を避け、安定性を向上が可能
- さらに、再試行間隔にランダムな遅延（ジッター）を加えることで、同時再試行による負荷集中を防ぐ効果もある


## エクスポネンシャルバックオフの歴史
- 1970年代にネットワーク通信の競合解決手法として登場
- イーサネットプロトコル（1973年）で衝突回避に採用
- 通信失敗後、再試行間隔を指数関数的に増加させるアルゴリズム
- ネットワーク過負荷やリソース競合を軽減する目的で設計
- 現在は通信だけでなく、APIリトライや分散システムでも活用


## AWSでいうエクスポネンシャルバックオフとは

| AWSサービス                  | 機能                          | デフォルト設定       | 説明                                                                 |
|------------------------------|-------------------------------|----------------------------------|----------------------------------------------------------------------|
| **DynamoDB**                | APIリトライ                   | **有効**                             | 過剰リクエストや一時的な障害時にエクスポネンシャルバックオフを使用   |
| **S3**                      | スロットリング回避             | **有効**                             | 過剰なリクエストに対しバックオフで負荷を軽減                        |
| **EC2**                     | ネットワークエラー対応         | **有効**                             | インスタンス起動や停止の失敗時に自動リトライ                        |
| **CloudWatch Logs**         | APIリトライ                   | **有効**                             | ログ送信失敗時に自動的に再試行                                      |
| **Step Functions**          | 分散システムの安定性向上       | **有効**                             | ワークフローのタスク実行失敗時に再試行                              |
| **カスタムユーザー設定**      | ユーザー定義リトライポリシー   | 無効                             | カスタムリトライは明示的に設定が必要                                |
Go言語(プログラミング)入門メモ⑦

## panicとrecover
プログラムの強制終了を扱う際にpanicとrecover関数を用いる。
※実際にプログラムではpanicとrecoverを書くことは推奨されていない

## panicでプログラムを強制終了させる。
panicは実行中のプログラムを停止させる組み込み関数。
ここでは、thirdPartyConnectDB関数を作成し関数内でpanic関数を呼び出す。panicの引数には「Unable to connect database」という文字列を指定する。このthirdPartyConnectDB関数を、saveという関数から呼び出し、main関数でsave関数を呼び出す。
main関数の最後にsave関数が実行できたか確認するために、「OK?」と表示される処理書く。このプログラム実行により、プログラムが強制終了し「panic(Unable to connect database)」とスタックトレースの情報が出力される。
※スタックトレースとは
プログラムの実行中にエラーや例外が発生した際に、そのエラーがどこで、どのような経路をたどって発生したのかを示す情報
以下の情報を含むことが多い：

・エラーが発生したメソッドや関数の名前
・エラーが発生したファイルの名前と行番号
・エラーが発生する前に呼び出されたメソッドや関数の呼び出し履歴

~~~
func thirdPartyConnectDB() {
    panic("Unable to connect database")
}

func save() {
    thirdPartyConnectDB()
}

func main() {
    save()
    fmt.Println("OK?")
}


//以下のように表示される
panic: Unable to connect database

goroutine 1 [runnning]:
main.thirdPartyConnectDB(...)
以下略
~~~

## 発生したpanicをrecoverで処理する
panicで発生したエラーを処理するためには、recoverを使用する。
save関数の中に、deferを使って遅延実行する関数リテラルを作る。関数リテラルでは、変数sにrecoverの返り値を入れて、fmt.Printlnで表示する。
deferで書いた関数を実行するためには後ろに()をつける。このプログラムを実行すると、panic関数とmain関数の最後に書いたしょりである「OK?」が表示される。

~~~
func thirdPartyConnectDB() {
    panic("Unable to connect database")
}

func save() {
    defer func() {           //deferで関数を作成
        s := recover()
        fmt.Println(s)
    }()　　　　　　　　　　　　//()をつけて実行
    thirdPartyConnectDB()
}

func main() {
    save()
    fmt.Println("OK?")
}

//以下のように表示される
Unable to connect database
OK?
~~~

上記ではpanicのスタックトレースが表示されずにコードを実行することができた。
thirdPartyConnectDB関数で発生したpanicをsave関数の中のdeferで実行されたrecover関数がキャッチすることにより強制終了を防いでいる。

※注意
save関数のなかで、defer処理を定義する前にthirdPartyConnectDB関数を呼び出してしますとpanicでプログラムが終了してしまう。これは、deferでrecoverの遅延実行を指定する前に、panicが発生してしまうためである。


## 学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897
【Docker】VSCodeでDev Containersを利用してDockerのデーモンに接続できないエラーの対処法(WSL,Ubuntu)

## はじめに
**VSCode**の拡張機能である**Dev Containers**を利用して**Ctrl+Shift+P**から**Reopen in Container**を選択することで、VSCodeを用いてdocker container上での開発が可能になります。
しかし、デーモンに接続できませんというエラーの表示がたまに見られます。ログを見てみると、具体的には以下のようなエラーが表示されています。

```
[82697 ms] Start: Run in Host: docker version --format {{json .}}
[82710 ms] {"Client":{"Version":"27.3.1","ApiVersion":"1.47","DefaultAPIVersion":"1.47","GitCommit":"ce12230","GoVersion":"go1.22.7","Os":"linux","Arch":"amd64","BuildTime":"Fri Sep 20 11:39:44 2024","Context":"default"},"Server":null}
[82710 ms] Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

[82712 ms] Exit code 1
```

このエラーの対処法について説明します。環境は**WSL**の**Ubuntu**で、**Docker Desktop**の使用を前提としますが、Rancher Desktopなどでも同様にして対処が可能です。

## エラーの対処
原因は、**Docker Desktop**の**WSL integration**で**Ubuntu**が有効になってないことです。

**Docker Desktop**を起動し、右上の歯車マークから**Setting**を開いてください。
**Resources**の**WSL integration**を選択し、**Enable integration with additional distros**の**Ubuntu**を有効にしてください。

最後に、忘れずに右下の**Apply & restart**を選択して保存してください。

![スクリーンショット 2025-01-13 165422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/a03474f9-b058-0650-7a8f-181fa9f5824e.png)

**Rancher Desktop**などを使っている場合も同様に、**WSL**の**Ubuntu**を有効にする設定があると思うので探して有効にしてください。

再度VSCodeから**Reopen in Container**を選択してみると、無事開発コンテナーに入れると思います。

もしまだエラーが出るようであれば、Dockerのバージョンアップや再インストールなど試してみてください。

## 参考
https://tech-lab.sios.jp/archives/33994#Cannot_connect_to_the_Docker_daemon_at_unixvarrundockersock_Is_the_docker_daemon_running
量子ビットをイメージでつかむ

量子ビットをイメージで捉えられるよう、Python（Jupyter notebook）コードを作ってみました。
https://github.com/sin-gee/ImageOfQuantumBit

```
$ cd ~/Desktop
$ git clone https://github.com/sin-gee/ImageOfQuantumBit
$ jupyter notebook
```
:::note info
なお、本記事に関連する部分は以下です。
https://github.com/sin-gee/ImageOfQuantumBit/blob/main/ImageOfQuantumBit.ipynb
:::

# モチベーション
通常、ブロッホ球をベースに説明されるのですが、以下の点で納得できない部分があり、波として捉えられるようにしたい、というのがモチベーションです。
1. |0> - |1> の意味が分からない　(　|0> + |1>と何が違うのかわからない )
2. ゲート行列との対応がつかない
3. |0>と|1>、|+>と|->、|i>と|-i>が直交しているように見えない

# 遊び方

最初に|0>と|1>の混合比（1.0の場合、|0>のみ）と、位相のずれ（単位はπ）を設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/60ec7029-53fe-2b99-7ea4-01d44b86481b.png)


以降はポチポチしていくと、まずブロッホ球を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/fcfb4511-2fb0-2608-29a6-85ebe42fe7d6.png)



次に光子（の波）に見立てた場合の、|0>（ブルーのx軸方向の振動）と|1>（オレンジのz軸方向の振動）の様子を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/1521842e-54bb-fe21-58eb-b41e3046ed7b.png)


最後に、y=0からy軸方向に見た場合の挙動（アニメーション）を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/96007f97-b156-8208-68af-2529eadce0d3.png)


2025/01/20追記
HゲートとYゲートの操作を追加しました。操作後、ブロッホ球から繰り返してもらえると何がどう変化したのか、理解しやすいかと思います。


# 付録

Pythonのインストールは、こちら

Windows

https://qiita.com/Obataskill/items/4cfe0d4d8cec8a140b8e

Mac

https://qiita.com/omo_taku/items/bc97f69391b2f4627f36


Jupyter notebookのインストールは、こちら

https://qiita.com/ktr_ch/items/f3ddc4d6a9cac9fa2b89

Gitのインストールは、こちら

Windows

https://qiita.com/T-H9703EnAc/items/4fbe6593d42f9a844b1c

Mac

https://qiita.com/inakuuun/items/57fd4162d17d72e0c4fa

Git cloneは、こちら

https://qiita.com/sh10n/items/f5edb7293aaffebe35a7
M3 MacでUbuntu＋ROS＋Unity開発環境を準備する。

## はじめに
　Ubuntu18.04の開発環境が必要になったので、M3 Macで構築しました。
　先人の方々の記事を組み合わせることで構築する事できました。
 　記事を作成していただいた方々に感謝申し上げます。
　  本稿では、構築方法や、はまりポイントなどの記事をまとめました。

## 1.UTMでUbuntu2018.04をインストールする。
・UTMのインストールする。
  参考：https://qiita.com/nouernet/items/6c66aa76dbc0b195b81d


・Ubuntu18.04のイメージの準備
　Arm版を用意。Arm版は、Desktop版が無いので、Server版をインストール後にDesktop環境をインストールする。
 　参考： https://qiita.com/doraryu1/items/f79ab67b4c7b060a0917

 ・UTMでUbuntuをインストールするときに、先に進めなくなるので、以下を参考にして、シリアルを追加する。
 　
 　参考： http://ikemenakkio.blog129.fc2.com/blog-entry-410.html

 ・インストールが終わると画面が戻るので、電源を落とし、イメージを削除して再起動する。

 ・デスクトップ環境をインストールする。
　　sudo apt install tasksel
　　sudo tasksel install ubuntu-desktop
   

・インストールが終わり、sudo rebootで再起動すると、デスクトップが立ち上がる。

## 2.ROSのインストール
以下に従って、ROS Melodic をインストールする。
参考：https://qiita.com/OshitaRikuto/items/49c855cf7b3716a3cc79

## 3.Unityのインストール
・arm64版のUnityが見つからなかったのでインストールを断念。
　Mac側にUnityをインストールして、通信させる。

## 4.Unity-rosで通信させる。
以下を参考にしてチュートリアルを進める。
参考：https://note.com/npaka/n/n1628ea4b09b7#tNFy2

　・ROS側の準備
 　・ROS-TCP-Endpoint のインストール
 
　・Unity側の準備
 　・ROS-TCP-Connector

　・チュートリアルと違うところ
　　・Mac側のUnityとUbuntu側で通信するので、ROS_IPをUbuntu側のIPを指定する。

 参考：https://qiita.com/sfc_nakanishi_lab/items/40ab94a2f19f375f42db
[VSCode×WSL] WSLとVSCodeで始めるLinuxベース開発環境構築ガイド

### **この記事でわかること**
WSL (Windows Subsystem for Linux) とVSCodeを組み合わせることで、Linux環境かつVSCodeによるGUIでの開発を可能とする開発環境構築手順を解説します。

本記事を前提として、次回記事でTypeScriptの開発環境構築手順を解説予定なので、よかったらぜひ試してみてください。
投稿しました：[[TypeScript環境構築] VSCodeとWSLを活用した効率的な開発環境の構築](https://qiita.com/kappayarou/items/181f9bffd6bb5ac95523)

---

### **この記事の対象読者**
・JavaScriptやTypeScript、Python等でとりあえず開発をやってみたいが、どう環境構築すればわからない方
・windows環境をできるだけ汚さず、なるべく仮想環境で開発を完結させたい方
・将来的にdockerやdocker compose等の拡張を予定している方
・効率の良い開発環境を模索している方

---

### **この記事の環境の利点**
1. **VSCodeから直接Linuxコマンドを実行可能**
   開発環境をWSLに構築し、VSCodeでアクセスすることで、VSCodeのターミナルから直接Linuxコマンドを実行できます。
   タブ補完も当然機能するため、特にTypeScriptのスクリプトを実行する際のファイルパス指定等が非常に楽になります。
1. **拡張性の高さと効率**
   開発環境がLinuxベースとなるため、テスト環境や本番環境により近い環境での開発が可能となるほか、dockerやdocker composeといった拡張も容易となります。
   本記事の趣旨はWSLとVSCodeでの開発環境構築であるためdocker等は取り扱いませんが、今後別記事で取り扱う予定です。

---
### **目次**
1. WSLのインストール
2. VSCodeのインストールとWSL拡張機能のセットアップ
3. WSLとVSCodeの連携方法
4. プロジェクトディレクトリの作成と操作

---

### **1. WSLのインストール**
WSLをインストールし、起動します。
WSLは開発環境を構築する場所であり、VSCodeから接続する相手でもあります。
今回はLinuxディストリビューションとしてUbuntuを選択しましたが、もちろんほかのディストリビューションでも問題ありません。

#### **手順**
1. **Microsoft StoreでUbuntuを検索**  
   Ubuntu (筆者は22.04.5を選択) をインストールします。
2. **ターミナルでWSLを起動**  
   ターミナルを開き、`wsl` と入力して起動します。初回起動時にはユーザー設定が求められるので、必要な情報を入力してください。

---

### **2. VSCodeのインストールとWSL拡張機能のセットアップ**
VSCodeのインストールと、VSCodeからWSLへ直接接続するための拡張機能をインストールします。
開発環境はWSLに構築しますが、それだけだとコマンドラインベースで開発がしんどいです。
VSCodeにWSLへ接続する拡張機能を導入することで、開発環境をWSLに置きつつVSCodeで開発を行なうことができます。

#### **手順**
1. **VSCodeのインストール**  
   Microsoft StoreからVSCodeを検索してインストールします。
2. **WSL拡張機能のインストール**  
   VSCodeの拡張機能タブで「Remote - WSL」を検索し、インストールします。

---

### **3. WSLとVSCodeの連携方法**
VSCodeからWSLへ接続し、VSCodeからWSLのターミナルを開きます。
これにより、WSLの開発環境をVSCodeで直接操作可能になり、さらにWSLへのLinuxコマンドもVSCodeから実行できるようになります。

#### **手順**
1. **リモートエクスプローラーの使用**  
   VSCodeを再起動すると「リモートエクスプローラー」が表示されます。
   リモートエクスプローラーにインストールしたWSL（今回はUbuntu 22.04.5）が表示されているので、名前の横の→をクリックして接続します。
2. **WSLのターミナル操作**  
   VSCodeの右上にある「パネル切り替え」ボタンでターミナルを表示します。
   ターミナルでは、VSCode上でWSLに対するLinuxコマンドを実行可能です。
   
---

### **4. プロジェクトディレクトリの作成と操作**
開発環境を構築するためのプロジェクトディレクトリを作成し、VSCodeからディレクトリを開きます。
コマンドはVSCodeのターミナルから実行可能です。
<br>

1. **ディレクトリの作成**  
   ```bash
   mkdir -p ~/projects/<プロジェクト名>
   ```
   補足：-pは中間ディレクトリ（今回はprojects）を一括作成するオプションです。
   　　　これをつけないとprojectsが存在しませんというエラーになります。

2. **ディレクトリをVSCodeで開く**  
   左上の「ファイル」→「フォルダーを開く」からディレクトリを指定します。
   これで、作成したプロジェクトディレクトリをVSCodeで開くことができます。

---

### **次の記事**
次回はTypeScriptの環境構築手順を解説します。現在執筆中のため、完成次第リンクを追加しますのでお楽しみに！
投稿しました：[[TypeScript環境構築] VSCodeとWSLを活用した効率的な開発環境の構築](https://qiita.com/kappayarou/items/181f9bffd6bb5ac95523)

### **参考文献**
[WSL公式ドキュメント](https://learn.microsoft.com/en-us/windows/wsl/)
[VSCode公式サイト](https://code.visualstudio.com/)
[Remote Developmentドキュメント](https://code.visualstudio.com/docs/remote/remote-overview)
Python Install

2025年1月13日現在でのPythonのインストール方法の紹介します。
現在のPythonの最新バージョンは`3.13`なので、そちらをインストールしていきます。

## Windowsの場合

[Microsoft Store](https://apps.microsoft.com/home?hl=ja-jp&gl=JP)からのインストールがおすすめです。
[Microsoft Store](https://apps.microsoft.com/home?hl=ja-jp&gl=JP)で`Python 3.13`を検索、または、[こちらのリンク](https://apps.microsoft.com/detail/9pnrbtzxmb4z?hl=ja-jp&gl=JP)からダウンロードしてください。

## Mac, Ubuntu (Unix系) の場合

デフォルトでPythonがインストールされている場合が多いですが、開発者の場合、複数のバージョンをインストールしたい場合がありますので、`Pyenv`を使用してインストールするのがおすすめです。
ここからはターミナル (bash) を使って作業していきます。

### Pyenvのインストール

```bash
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

### 環境変数の設定

```bash
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
```

### Python 3.13のインストール

まずはpyenvでインストールできる環境一覧を見ます。

```bash
$ pyenv install -l
```

`2.X.X`や`3.X.X`、`anacondaX.X.X`など、色々と表示されるかと思いますが、今回はPython 3.13をインストールします。

```bash
$ pyenv install 3.13.1
```

インストールできましたら、以下で確認しましょう。

```bash
$pyenv versions
```

以下が表示されていれば、OKです。

```bash
3.13.1
```

### 環境の切り替え

デフォルトで`3.13.1`が使用できるように、環境を切り替えます。

```bash
$ pyenv global 3.13.1
```

以下のコマンドで環境が切り替わったか確認しましょう。

```bash
$ pyenv versions
```

アスタリスクのつく位置が変わっていれば、OKです。

```bash
* 3.13.1
```

#### Tips

特定のディレクトリ内では特定の環境を使用することもできます。その場合は、そのディレクトリに入り、`pyenv local enviroment`を実行しましょう。

```bash
$ cd directory
$ pyenv local enviroment
```

## Pythonの動作確認

ターミナルを立ち上げて、`python`を実行してみましょう。

```bash
$ python
```

以下のように表示されていれば、インストール完了です。

```bash
Python 3.13.1 (main, Apr 19 2024, 16:48:06) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

## 終わりに

今回は、Pythonのインストール方法を紹介しました。
今後もPythonに関する記事を投稿していこうと思いますので、参考にしていただければと思います。

## 関連記事
1. [Python package install using pip](https://qiita.com/h4ru/items/88602de471fd908b2d4f)
【AWS SAP】プライベートDNSオプションとは

# 学習前イメージ
プライベートなDNSオプション？

# プライベートDNSオプションとは
- 特定のネットワーク内でDNS（ドメインネームシステム）の名前解決を管理する設定
- インターネットに公開せずに内部リソースの名前解決を行い、セキュリティ強化やパフォーマンスが向上

## 有効化できるAWSサービス
| サービス名                     | プライベートDNSでの利用方法                                                                 |
|-------------------------------|---------------------------------------------------------------------------------------|
| Amazon VPC                    | VPC内でプライベートホストゾーンを使用して内部DNSの名前解決を実現。                                |
| Amazon Route 53               | プライベートホストゾーンを作成し、VPC内リソースの名前解決を管理可能。                              |
| AWS Directory Service         | 管理対象のActive Directoryで内部リソースの名前解決を実行。                                       |
| Elastic Load Balancer (ELB)   | 内部向けロードバランサーでプライベートDNS名を使用し、VPC内で通信を管理。                             |
| AWS PrivateLink               | プライベートDNS名を使用してサービスに安全にアクセス可能。                                        |
| Amazon ECS/EKS                | プライベートDNSで内部サービス間の通信を簡略化。                                               |

## 学習後イメージ
インターネット経由にしなくない場合はプライベートDNSオプションを有効化しよう。